2.1 进程与线程
2.1.1 进程的概念与特征
- 概念:
- 程序是一段指令的集合,而在多道批处理机上,为了让程序并发的、独立的运行起来,在内存中就将程序整合为一个特定的数据结构:
- PCB:进程控制块,用于描述进程的基本情况和运行状态,进而控制和管理进程;PCB是进程存在的唯一标志;(与进程管理相关的数据均存放在此中)
- 相关数据段:程序运行所需的或者产生的相关数据,并发执行程序时需要将这些数据不停地保存又恢复
- 程序段:执行的程序可能只是外存中存储程序的一部分,独立运行程序时可直接执行执行指令子集
- 程序是一段指令的集合,而在多道批处理机上,为了让程序并发的、独立的运行起来,在内存中就将程序整合为一个特定的数据结构:
以上三个部分构成进程映像(进程实体)
- 进程就是进程实体的运行过程,是系统进行资源分配和调度的独立单位
- 进程的特征:
- 进程的组织
- 系统中的PCB几百上千个,进程的组织要解决的问题是多个进程之间的组织方式,即通过何种方式寻找到不同状态的PCB
-
2.1.2 进程的状态与转换
- 进程的五种状态
- 运行态:占有CPU及其他资源,程序实际被处理机接收并运行的状态
- 就绪态:占有其他资源,等待CPU空闲的进程状态
- 阻塞态:进程在运行过程中被某个事件中断,不再占用CPU和资源,如系统调用或者等待事件
- 创建态:创建进程,分配资源并初始化PCB
- 结束态:撤销进程,回收资源和PCB
进程的状态切换
基本概念:进程控制即是要实现进程的状态转换,一般用原语来执行这些操作
- 相关原语:
- 创建原语:
- 分配唯一进程标识号,并申请PCB(PCB有限)
- 分配资源,若资源不足就转为阻塞态,等待资源分配
- 初始化PCB,包括标志信息,处理机状态,控制信息等等
- 插入就绪队列
- 撤销原语
- 终止进程,并将资源还给父进程或者操作系统
- 阻塞与唤醒原语
- block状态:自我调用事件发生后,保护现场至PCB中,插入到相关事件的等待队列中
- wakeup状态:唤醒事件发生后,在该事件的等待队列中找到相应进程的PCB,插入到就绪队列中
- 两原语作用相反,需要成对出现
- 创建原语:
进程切换:从一个进程切换到另一个进程,任何进程操作与内核都紧密联系
高级通信方式:
- 共享存储
- 访问必须互斥,操作系统只提供P、V操作和共享空间
- 分类:
- 低级通信:基于数据结构;数据内容限制大,吞吐量小
- 高级通信:基于存储区;数据类型自由,交换速度快
- 管道通信
- 半双工通信,同一时间只能一个方向;要全双工需要两根管道
- 一般缓冲区为4KB,写完才能读,读空才能写,互斥访问
- 写进程可以有多个,读进程只能有一个,读完就内容就消失
- 消息传递
- 以格式化的message传递信息,不需要共享空间,依靠发送和接受两个原语实现传递
- 分类:
- 直接通信:发送至另一进程的消息缓冲队列上
- 间接通信:发送到中间实体中(信箱),另一进程在信箱中取走
- 共享存储
-
2.1.5 线程和多线程模型
2.1.5.1 线程的概念
线程的基本概念:进程是为了更好的实现多程序的并发,而线程更进一步,在进程中又细分为多个线程,提高了并发性
线程的特点与属性:
线程的实现方式
- 用户级线程:
- 内核级线程:
- 组合方式:
- 多线程模型:组合方式引申出不同的线程模型
- 多对一
- 一对多
- 多对多
2.2 处理机调度
2.2.1 调度的概念与层次
- 调度:系统中进程的数量远远多于处理机的个数,而要实现并发操作就需要一定的调度能力;即在源有限的情况下,如何按照一定的算法让处理机为进程分配工作,即为调度
调度的三个层次:
- 高级调度:即作业调度;决定将外存中的哪个作业调入内存,并建立相应的进程,一个作业只会被调入、调出一次
- 中级调度:即内存调度;决定将哪个处于挂起态的进程重新调入内存,一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高
- 挂起与七状态模型:
- 挂起:将暂时用不到的进程重新调回外存中,以提高内存利用率和吞吐量;挂起时PCB仍然在内存中用以管理、监控进程;进程被挂起后,其PCB会被排在挂起队列中等待被激活
- 七状态模型:
- 将挂起态细分为“就绪挂起”和“阻塞挂起”
- 内存不足时,就将处于就绪态的,阻塞态的进程挂起,或者创建完成就挂起,运行完成就挂起等等
- 挂起队列等待激活重新进入内存,不同阻塞原因的阻塞挂起队列用以实现多级反馈队列
- 挂起与七状态模型:
- 低级调度:即进程调度;决定将就绪队列中的哪个进程分配到处理机上,频率很高
- 三者关系:
2.2.2 进程调度的时机、切换与过程
时机
切换与过程
-
2.2.4 经典调度算法
旧的批处理机上调度算法
- 先来先服务(FCFS):
- 短作业优先(SJF):
- 非抢占式:最短进程优先(SPF)
- 抢占式:最短剩余时间优先(SRTN)
- 高响应比优先:
- 交互式系统的调度算法
- 时间片轮转
- 优先级调度
- 多级反馈队列调度算法
2.3 进程同步
2.3.1 基本概念
临界资源:共享但互斥的资源叫做临界资源;打印机,缓冲区,全局变量,可以与其他进程共享,但是不可以不上锁使用,因此是临界资源;而私有数据,不共享;磁盘,纯程序段(可重入代码)共享但不上锁;这些都不是临界资源
2.3.2 实现临界区互斥的方法
2.3.2.1 软件实现方法
-
2.3.2.2 硬件实现方法
-
2.3.3 信号量
只要用while来检查进程,防止访问临界区的,都不满足“让权等待”,因为while会一直占用CPU,检查状态是否满足要求;真正的让权等待是,如果此时进程无法被满足,应当被阻塞,不再占用CPU
S设成0,如果先P就会被阻塞,所以需要执行一次V操作使S变成1,这样P才能执行,因此就实现了先V后P的同步操作;
S设成1,代表该资源只有1个,用P-V操作夹起来,就可以保证上锁加解锁,即互斥过程的实现
2.3.4 经典同步、互斥问题
写的时候不能读,不能写:写操作的时候,P了,rw变成0,当有读操作时(一定是第一个读操作,count==0),也会申请P操作,此时读操作被阻断,直到写操作完成后V了才能继续读里面的P
读的时候可以读,不能写:读操作的时候,第一个读操作会让rw变成0,count++,接下来的读操作都会绕过判断语句直接去读,而写操作被阻断
2.3.5 管程
- 概念:实现共享或者互斥功能的特殊软件模块,可看做java中的class —— 定义了一个类,并在其中设定了共享数据结构,和一些函数,只有这些规定的函数才能对class做出修改
特点:
- 一次只允许一个进程进入管程,这是由编译器决定的,它跑不了那么多程序,也就是说它自身功能的限制实现了互斥这一目标
- 定义了monitor后,只需要调用其中的函数就可以简便的实现共享数据的互斥同步操作,封装思想的运用可以简化编程
条件变量和信号量之间的区别:
- 条件变量是管程中的概念,指的是当该变量被满足时就阻塞;信号量一般指的P/V操作,对记录型信号量进行+1/-1,当P为0时就阻塞;
- 从上可以看出,管程中的wait( )操作是在条件变量被满足时,只执行阻塞操作
- 而P/V操作不仅执行信号量的加减,还同时完成阻塞操作;信号量的值反映了资源数和等待数
- 管程中的剩余资源数用共享数据结构表示
实例
2.4 死锁
2.4.1 死锁的基本概念
概念:互相争夺对方手中的资源,导致各进程都发生了阻塞,无法推进
- 死锁一定发生在两个及以上的进程之间,此时进程一定处于阻塞态
- 饥饿可能只发生在一个进程中,比如就绪态的长进程在最短优先算法中一直等待,或者读者写者模型中写操作由于读操作而一直被阻塞
- 死循环一般就是一个进程,它一般来说是一种错误,不归操作系统管
死锁的四个条件:
- 互斥条件:互斥访问的资源才会需要各进程之间互相争抢,而互相都抢不到才会死锁阻塞
- 不可剥夺条件:不能强行夺走,只能自己释放
- 请求和保持条件:进程得到至少一个资源后,仍然请求新的资源,而又保持现有资源
- 循环等待:循环等待链,一个进程要的资源被下一个进程所持有
- 发生循环等待时不一定发生死锁,发生死锁时一定发生循环等待
- 成环+资源数等于1=>死锁
死锁发生的一些情况
破坏互斥条件:将互斥的资源改造为共享使用的
- 缺点:并不是所有的资源都可以改造成可共享使用的资源,互斥在某些场景下是必要的
- 破坏不剥夺条件:当某个进程资源请求得不到满足时,立即主动释放保持的所有资源(自我放弃算法);或者当某个进程需要某种资源时强行剥夺其他进程的占用(剥夺调度算法)
- 缺点:实现起来比较复杂;释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态的资源,如CPU。反复地申请和释放资源会增加系统开销,降低系统吞吐量。若一直自我放弃可能导致进程饥饿。
- 破坏请求和保持条件:进程在运行前一次申请完它所需要的全部资源
- 缺点:有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。
破坏循环等待条件:可采用顺序资源分配法,规定每个进程必须按编号递增的顺序请求资源
系统安全状态:能找到一种不会死锁的进程排序(安全序列)的状态就是安全状态;如果找不出安全序列就是不安全状态;安全状态下,一定不会死锁;不安全状态下,可能会死锁
银行家算法:Max - Allocate = Need ;Available + Allocate = Available ;
2.4.2.3 死锁检测与解除
资源分配图和死锁定理:
- 找到不阻塞且非孤点的进程Pi,释放相关资源
- 释放资源即去掉边,如果消去所有边,则不会死锁
- 死锁解除
- 资源剥夺法:挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
- 撤销进程法(或称终止进程法):强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
- 进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
杰杰专用
愿逐月华流照君