在 操作系统学习笔记-1:基础概念) 中,我们介绍了与操作系统相关的一些概念,在 操作系统学习笔记-2:体系结构设计和运行机制) 中,我们又介绍了操作系统的结构设计和运行机制,从这篇笔记开始,我们会逐一讲解操作系统的各个基本功能。
进程(Process)和线程(Thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。以下这个解释出自阮一峰老师的博客(http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html),虽然「不是非常严谨,但是足够形象」,看完之后能对进程和线程有个非常直观的印象,这样也方便理解后文。
字符串类型分别使用 REDIS_ENCODING_INT 和 REDIS_ENCODING_RAW 两种编码:
进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时需要等待CPU服务,显然进程的状态是在不断变化的。为了方便对各个进程的管理,操作系统将进程合理的划分为几种状态
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的。
缺点:限定了最大进程数目;降低调度效率,挑选一个适合运行的PCB须对表项扫描,平均要花费查半个PCB表长的时间;不适合频繁进程调度。
在处理进程间的同步与互斥问题时,我们离不开信号量和PV原语,使用这两个工具的目的在于打造一段不可分割不可中断的程序。应当注意的是,信号量和PV原语是解决进程间同步与互斥问题的一种机制,但并不是唯一的机制。
场景 任务是 当 redis set 中有新元素时及时处理 需要在set有新元素后自动得到通知,省得使用轮询的方式来查看是否有新元素 相当于对set做一个事件提醒 实现 如果能使用阻塞版命令就非常简单了,例如list的pop操作有阻塞版的brpop 阻塞版的意思就是:当key中为空时就等着,有新元素后就马上获取 非阻塞版命令则不等,直接返回了 获取set元素的命令spop是没有阻塞版本的,但可以把他俩一起使用,使用brpop来完成这个任务 新元素的事件处理,相当于消费者 示例代码 LO
操作系统的主要特性: 并发,共享,异步,虚拟性 分类 批处理系统 用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行 批处理操作系统的特点是:多道和成批处理。 分时 实时 可以通过命令接口和程序接口方式把它的服务和功能提供给用户 程序在执行前已经实现地址转换的方法是静态重定位,执行中为动态重定位. 实现角度看,线程分为用用户空间的用户线程和核心空间的内核线程 死锁的必要条件 互斥条件,占有和等待条件,不可抢占,请求保持循环等待 进程控制原语 阻塞原语,唤醒原语 低级调度算法 先来先服务
在多线程的场景下,我们会经常使用加锁,来保证线程安全。如果锁用的不好,就会陷入死锁,我们以前可以使用Object的wait/notify来解决死锁问题。也可以使用Condition的await/signal来解决,当然最优还是LockSupport的park/unpark。他们都是解决线程等待和唤醒的。下面来说说具体的优缺点和例子证明一下。
线程的互斥:实指对共享资源的约束访问。多线程环境中,某些资源只允许一个线程使用,这类资源成为临界资源,线程之间的关系就表现为互斥的。
调度信息供进程使用时使用,描述了进程当前所处的状况,他包括进程名、存储信息、进程号、优先级、当前状态、资源清单、“家族”关系、消息队列指针、进程队列指针和当前打开的文件等。
编辑:业余草 来源:https://www.xttblog.com/?p=4946 分享一下,jstack 命令使用经验总结 jstack 在命令使用上十分简洁, 然而其输出的内容却十分丰富, 信息
进程表(process table),也称进程控制块(PCB),是由操作系统维护的,每个进程占用其中一个表项。该表项包含了操作系统对进程进行描述和控制的全部信息,从而保证该进程换出后再次启动时,就像从未中断过一样。
进程的概述 首先,我们要明白一点:程序不能独立运行,作为资源分配和独立运行的单位是进程。操作系统所具有的四大特征也都是基于进程而形成的。 学习进程的前提: 前面也讲了操作系统的发展历史,我们知道未配置操作系统和单批到处理系统的程序是按照顺序执行的。只有前边的程序执行完了,后边的程序才能执行。因此,CPU的利用率是非常低下的。、 为了能更好地描述程序的顺序和并发执行情况,我们先介绍用于描述程序执行先后顺序的前趋图。 所谓前趋图(Precedence Graph),是指一个有向无循环图,可记为DAG(Direc
要想实现多个线程之间的协同,如:线程执行先后顺序、获取某个线程执行的结果等。 涉及到线程之间相互通信,分为如下四类:
操作系统是管理和控制计算机硬件和软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件。注意,这里说的裸机可以是物理机,也可以是虚拟机。随着技术的发展,现在还出现了Docker容器技术,一个Docker容器实际上不一定需要具备完整的系统功能也能够运行程序,其底层是通过宿主机的内核来与硬件进行交互的。
一个程序由若干个程序段组成,而这些程序段的执行必须是顺序的,这种程序执行的方式就称为程序的顺序执行。
本文内容源于论文《Understanding Real-World Concurrency Bugs in Go》,从 6 个非常流行的开源项目中,收集了 171 个并发 bug,从传统的共享内存访问、Go 语言新的并发原语的特性方面入手,研究了并发 bug 产生的原因以及修复的方法,以便使 Go 研发人员更好的理解 Go 并发模型以及使用 Go 语言编写出更稳定、健壮的软件系统。
前面我们介绍了偏向锁,轻量级锁,自旋锁相关知识。初次之外,锁升级过程还会涉及到重量级锁。重量级锁是并发编程中常用的同步机制之一,它能够确保对共享资源的互斥访问,但由于其较高的开销,需要在合适的场景中使用。今天我们就来深入聊聊关于重量级锁,以及他的原理和性能分析。
调度是分层次的,在操作系统中,一般将调度分为高级调度、中级调度和低级调度。 高级调度也称作业调度,其主要任务是按一定的原则,对磁盘中的处于后备状态的作业进行选择并创建为进程。 中级调度的主要任务是按照给定的原则和策略,将处在磁盘对换区中切具备运行条件的就绪进程调入内存,或将处于内存就绪状态或内存阻塞状态的进程交换到对换区。
前趋图(Procedence Graph)是一个有向无循环图(DAG)。图中的每个结点可用于表示一条语句、一个程序段或进程;结点间的有向边则表示在两结点之间存在的偏序或前趋关系“→”, →={(Pi,Pj)| Pi必须在Pj开始前完成 }。
(本文知识点较多,如时间较多可以详细看看第3章的知识点;如时间不多可直接点上方目录,直接看第4部分代码实现来理解)
一、进程 1.1 多道程序设计 允许多个程序同时进入内存并运行,提高CPU的利用率,目的是提高系统效率 a图内存中有四个程序,串行执行,因为这里只有一个程序计数器。 当有了多道程序技术之后
List命令 Redis的列表允许用户从序列的两端推入元素或者弹出元素。可以来创建常见的队列信息。 List常用命令 blpop: 列表阻塞式弹出。当在查询如果指定得key 都是空列表那么会一直等待。如果存在得key中有值那么会取出值来。不建议放在事务中MULTI/EXEC中。时间复杂度为O(1)。模式:事件提醒。为了等待一个元素得到达列表中会采用轮询得方式来进行探查。另一种好得方式是使用阻塞原语。在新元素没有到达得时候阻塞住,避免轮询占用资源。blpop key key key timeout
此篇博客所有源码均来自JDK 1.8 在线程获取同步状态时如果获取失败,则加入CLH同步队列,通过通过自旋的方式不断获取同步状态,但是在自旋的过程中则需要判断当前线程是否需要阻塞,其主要方法在acquireQueued(): if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted = true; 通过这段代码我们可以看到,
要想知道一个东西是什么,我都爱去百度百科上搜一搜,输入"信号量",这答案不就来了。
atbus是我按之前的思路写得服务器消息通信中间件,目标是简化服务器通信的流程,能够自动选择最优路线,自动的断线重连和通信通道维护。能够跨平台并且高效。
" LockSupport 是 JUC 中常用的一个工具类,主要作用是挂起和唤醒线程。在阅读 JUC 源码中经常看到,所以很有必要了解一下。下面会介绍源码中的注释,以及一步一步用代码去验证一些猜想。"
由于 redis 需要对每一个 key 产生不同的操作,所以Redis 必须让每个键都带有类型信息,使得程序可以检查键的类型,并为它选择合适的处理方式
关注:被调用者 B 是否有消息通知(回调函数)机制 把 最终结果 返回给 A。
public class TestLockSupport implements Runnable{
LockSupport是JUC包下的一个类,是用来创建锁和其他同步类的基本线程阻塞原语。
LockSupport中的park()和 unpark()的作用分别是阻塞线程和解除阻塞线程
当有了多道程序技术之后就得到了b图,每个程序各自独立的占用一个逻辑程序计数器,达到并发执行效果
首先说说LockSupport吧,它的作用是提供一组直接block或unblock线程的方法,其底层实现利用了Unsafe(前面文章有讲过Unsafe)。LockSupport是一个非常底层的API,我们利用其可以做很多事情,本文将利用LockSupport实现互斥锁和共享锁。
我一个SocketServer有500个链接连过来了,我想让500个链接都是并发的,每一个链接都需要操作IO,但是单线程下IO都是串行的,我实现多路的,看起来像是并发的效果,这就是多路复用!
操作系统是指控制和管理整个计算机的软件和硬件资源,并合理地组织调度计算机的工作和资源的分配,提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。
延迟队列,顾名思义它是一种带有延迟功能的消息队列。那么,是在什么场景下我才需要这样的队列呢?
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。
顺序执行:单道批处理的执行方式,也用于简单的单片机系统,具有独立功能的程序独占cpu直到得到最终结果的过程
目前,已经实现全工作环境Linux化,电脑Linux+手机Linux+机器人Linux。
操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。
之前我们聊过string、list、hash、set、zset,并且自实现了动态字符串、双端链表、hash字典、压缩链表、跳跃链表等结构。那么redis是怎么组织这些数据结构高效的运行呢?
进程(Process)是计算机进行系统分配和调度的基本单位,为使程序能并发执行,且为了对并发执行的程序加以描述和控制,人们引入了“进程”的概念。而实现进程并发和调度的关键是进程控制块-PCB(Process Control Block),那PCB是什么呢,而其工作原理是什么样的呢?
parkUntil函数:表示在指定的时限前禁用当前线程,deadline参数表示绝对时间,表示指定的时间
不对呀,我女朋友都没有,哪里的儿子?猛的被惊醒,大白天的,我特么竟然还做上了白日梦!
调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真正立刻停止线程。
阻塞同步有许多实现方式了:mutex, semaphore. 阻塞同步使用不当就可能造成死锁,活锁,优先级反转。
领取专属 10元无门槛券
手把手带您无忧上云