第二章:进程管理
1、什么是进程:
- 进程的基本概念
- 进程的结构和特征
- 进程与线程
2、进程是怎样运行的:
- 进程控制
- 即os对进程实现有效的管理,包括创建、撤销、挂起、阻塞、唤醒、进程切换,os通过原语操作实现进程控制
- 原语:
- 原语由若干条指令组成,完成特定的功能,是一种原子操作
- 原语的特点:
- 原子操作,要么全做,要么全不做,操作过程不会被中断
- 在管态/内核态/系统态下执行,常驻内存
- 是内核三大支撑功能之一(中断处理、时钟处理、原语操作)
- 整个操作系统所有的操作都是基于中断的
- 每一个原语都是一小段程序
- 专门用于控制进程的四种原语(原语有很多种,但是控制进程的有四种)
- 创建原语 create
- 阻塞原语 block
- 唤醒原语 wakeup
- 撤销原语 destroy
- 挂起原语 suspend
- 激活原语 active
- 阻塞:当前进程调用阻塞原语(注意:阻塞是一种主动行为)
- 阻塞状态没有人去唤醒就是死锁
- 阻塞和唤醒是成对出现的,有阻塞就有唤醒,不然就成了死锁
- 处理机调度:
- 根据一定的算法和原则,将处理机资源进行重新分配的过程
- 前提:进程数或者作业数远远大于处理机数
- 目的:提高资源利用率,减少处理机空余时间
- 调度程序:一方面要满足系统用户需求(快速响应),另一方面要考虑系统整体效果(系统平均周转时间)和调度算法本身的开销
- 处理机调度的层次:
- 高级调度/作业调度
- 把后备作业调进内存(在内存中运行的是进程,没有运行的叫做作业)
- 调入一次、调出一次
- 调度频率最低
- 中级调度/内存调度:
- 将进程调致外存(挂起操作),条件合适在调回内存(激活操作)
- 在内外存对换区进行内存对换(对换区是指在外存划出一片空间供内存使用,也叫做虚拟内存)
- 低级调度/进程调度
- 从就绪队列选取进程分配给处理机
- 最基本的调度,频率非常高(相当于一个cpu时间片)
- 处理机调度方式:
- 抢占式(剥夺式)调度:
- 立即暂停当前进程
- 将CPU分配给另外一个进程
- 原则:优先权/短进程优先/时间片原则
- 非抢占式(非剥夺式)调度:
- 若有进程请求执行
- 等待当前进程完成或者阻塞
- 适用于批处理,不适用于分时、实时系统。
- 处理机调度时机:
- 进程运行完毕
- CPU时间片用完
- 执行io操作
- 执行某种原语操作
- 高优先级进程申请运行(剥夺式调度)
- 处理机调度过程:
- 保存镜像:记录进程现场信息
- 调度算法:确认处理机分配原则
- 进程切换:分配处理机给其他进程
- 处理机回收:从进程回收处理机
- 进程调度:
- 调度算法指标:
- cpu利用率 = cpu使用时间/系统总时间
- 系统吞吐量 = CPU完成作业数/总时间(单位时间内完成作业的数量),如果长作业执行得多短作业执行得少,吞吐量就不高;如果长作业执行得少,短作业执行得多,则吞吐量高
- 周转时间 = 作业完成时间 - 作业提交时间
- 带权周转时间 = 周转时间/实际运行时间
- 等待时间:作业等待处理机调度的时间
- 响应时间:首次提交请求到响应的时间间隔
- 调度算法:
- 作业调度:
- 先来先服务:(FCFS)
- 短作业优先 :(SJF)
- 高响应比优先调度(HRRN)
- 优先级调度:(PSA)
- 时间片轮转调度:(RR)
- 多级反馈调度:(MFQ)
- 进程是怎样运行的
- 进程调度:(先来先服务)
- 算法内容:调度作业/就绪队列中最先入队者,等待操作完成或者阻塞
- 算法原则:按照作业或者进程到达顺序服务(执行)
- 调度方式:非抢占式调度
- 适用场景:作业/进程调度
- 优缺点:
- 有利于cpu繁忙型作业。充分利用cpu资源
- 不利于i/o繁忙型作业,使它饥饿
- 进程调度(短作业优先)
- 算法内容:所需要服务时间最短的作业或者进程优先服务(调度之前先估算不同的作业运行的时间)
- 算法原则:追求最少的平均带权周转时间(带权周转时间 = 周转时间/实际运行时间)
- 调度方式:非抢占式
- 特例:最短剩余时间优先:(SRTN抢占式):有的时候很短进程都完成了一半多,看看谁的剩余时间最少谁就优先执行
- 适用场景:作业/进程调度
- 优缺点:
- 平均等待/周转时间最少
- 长作业周转时间会增加或者饥饿
- 估算时间不准确,不能保证紧迫任务及时执行
- 进程调度:(高相应比优先调度 HRRN)
- 算法内容:结合FCFS和 SJF ,综合考虑等待时间和服务时间计算相应比,高的优先服务
- 算法原则:综合考虑作业/进程的等待时间和服务时间
- 调度方式:非抢占式
- 适用场景:作业/进程
- 相应比计算:
- 相应比 = (等待时间+服务时间)/服务时间 >1
- 只有当前进程放弃执行权(完成/阻塞)时,重新计算相应比(计算相应比也是需要时间成本的)
- 长作业等待越久,相应比越高,越容易获得执行权
- 但是不能解决紧迫任务的情况
- 进程调度:优先级调度
- 算法内容:又叫优先权调度,按照作业/进程的优先级调度(紧迫程度)
- 算法原则:优先级越高的作业/进程先调度
- 调度原则:抢占/非抢占式(并不能获得及时执行)
- 适用场景:作业/进程调度
- 优先级设置原则:
- 静态/动态优先级(静态优先级是在程序员编写程序时给的优先级,进程创建时给的优先级,动态优先级是进程运行过程中动态的调整优先级)
- 系统进程优先级>用户进程优先级
- 交互型优先级>非交互型优先级 (交互型操作用户在等待结果,所以优先级要高 )
- I/O型优先级>计算型优先级
- 低优先级进程可能产生饥饿
- 进程调度:时间片轮流调度
- 算法内容:按照进程到达就绪序列的顺序,轮流分配时间片去执行,时间用完则剥夺cpu执行权,如果时间片执行完程序还没执行完,则将程序放到就绪队列队尾继续排队等待执行,又时钟中断信号提醒cpu时间到了
- 算法原则:公平、轮流为每个进程服务,进程在一定时间都会得到响应
- 调度方式:抢占式:由时钟中断确定时间到达
- 使用场景:进程
- 优缺点:
- 公平、响应快、适用于分时系统
- 时间片决定因素:系统响应时间、就绪队列进程数量、系统处理能力(可能会考到)
- 时间片太大:相当于FCFS(先来先服务),太小,处理机切换频繁,系统开销大
- 注意:不同的进程得到的时间片不一样
- 进程调度:多级反馈调度算法(MFQ)
- 算法内容:
- 设置多个按照优先级排序的就绪队列
- 优先级从高到低,时间片从小到大
- 新进程采用队列降级法
- 进入第一级队列,按照FCFS分时间片
- 没有执行完,移到下一级等待执行
- 前面队列不为空,则不执行后续队列进程
- 算法原则:集前几种算法优点,相当于 PSA+RR(优先级算法+时间片调度算法)
- 调度方法:抢占式
- 适用场景:进程调度
- 优缺点:
- 对各种类型相对公平;快速响应
- 终端型作业用户,短作业优先
- 批处理作业用户:周转时间短
- 长批处理作业用户:在前几个队列部分执行,不会产生长期饥饿的情况,有可能导致一定程度的饥饿,但是不会一直饥饿
3、进程之间是怎样协作的:
- 进程协作的方式:
- 进程通信
- 进程同步
- 进程通信:
- 进程通信的概念:进程之间的信息交换
- 进程是资源分配的独立单位,各进程内存空间彼此独立
- 一个进程不能随意访问其他进程的地址空间
- 进程通信的特点:
- 共享存储
- 消息传递
- 管道通信
- 共享存储:有一个存储空间是多个进程可以同时访问的:(注意:这里的存储空间并不属于哪个进程,而是属于操作系统,如果进程与进程之间想要通信,就向操作系统申请一块内存空间,这个空间多个进程都可以操作它)
- 基于共享数据结构的通信方式:
- 多个进程共用某个数据结构(os提供并控制)
- 由用户(程序员负责同步处理)
- 低级通信:可以传递少量数据,效率低
- 基于共享存储区的通信方式:
- 多个进程共用内存中的存储区域(这里的内存由操作系统提供的、固定大小的区域)
- 由进程控制数据的形式和操作方式
- 实际操作过程中进程会将那块共享的内存空间并到自己的进程内部,别的进程也会将那块空间看做自己的地址空间,最终。如果所有的进程都完成后,会将那块内存空间释放掉,还给操作系统
- 数据收发双方不可见,存在安全隐患
- 高级通信,可以传递大量数据,效率高
- 注意:无论是哪种通信方式都是由操作系统去分配和管理的
- 消息传递:
- 直接通信:点到点发送
- 发送和接收时指明双方进程ID
- 每个进程指明一个消息缓冲队列
- 真正操作收发消息动作的是操作系统,用发送和接收的两个原语
- 间接通信:广播信箱
- 以信箱为媒介,作为中间实体
- 发进程将消息发送到邮箱,收进程从邮箱读取
- 可以广播,容易建立双向通信链
- 管道通信:
- 管道:
- 用于连接读/写进程的共享文件,pipe文件 (pipe:管道)
- 本质是内存中固定大小的缓冲区
- 管道的本质是文件,文件的本质是缓冲区
- 默认为半双工的
- 半双工通信:
- 同一时段只能进行单向通信,双工通信需要两个管道
- 以先进先出(FIFO)组织数据传输(队列的数据结构就是先进先出的方式),以流的方式传输
- 通过系统调用read()/write()函数进行读写操作
- 注意:以流的形式读写,未满不读,已满不写,未空不写,以空不读,读后删除
- 共享存储和共享管道都是一个进程操作的时候另外一个进程是不能操作的,互斥的访问共享资源
- 进程同步:
- 协调进程之间的相互制约关系,使他们按照预期的方式执行的过程
- 进程同步:互斥访问的方式和原则:
- 进程同步的概念:
- 协调进程之间相互制约关系,使它们按照预期的方式执行的过程
- 前提:
- 进程时并发执行的,进程之间存在相互制约关系
- 并发的进程对系统共享资源进程竞争
- 进程通信,过程中相互发送的消息和信号成为消息或事件
- 两种相互竞争形式:
- 间接相互制约关系:进程排他性的访问共享资源(一个进程访问资源,其他所有进程都不能访问资源)
- 直接相互制约关系:进程之间的合作,比如管道通信(一个进程访问资源,导致另外一个进程无法访问资源,比如一个进程写的时候不能读)
- 互斥访问的过程:(互斥的访问临界资源)
- 进入区:尝试进入临界区,成功则加锁(lock)(可能尝试不成功,则可能会被挂起,等待别的进程唤醒,唤醒进程为退出区刚要退出的进程)
- 临界区:访问共享资源
- 退出区:解锁(unlock),唤醒其他阻塞进程(解锁可能不成功,就会造成死锁)
- 剩余区:其他代码
- 临界区:
- 又叫临界资源,可看作共享资源,包括物理资源和软件资源:
- 物理资源:输入机,打印机,磁带机
- 软件资源:消息缓冲队列、数组、缓冲区
- 互斥访问的原则;
- 空闲让进:临界区空闲,允许一个进程进入临界区
- 忙则等待:临界区已有进程,让其他进程等待(阻塞状态)
- 有限等待:处于等待的进程,等待时间有限
- 让权等待:等待时,应该让出cpu执行权,防止忙等待
- 互斥访问临界资源实现方法:
- 软件实现方法:
- 硬件实现方法:
- 软件实现方法:
- 单标志法:违背空闲让进原则
- 双标志法先检查:违背了忙则等待原则
- 双标志法后检查:违背了空闲让进,有限等待原则
- 皮特森算法:违背了让权等待,会出现“忙等”;
- 硬件的实现方式:
- 中断屏蔽法:关中断/开中断
- 禁止一切中断,cpu执行完临界区之前不会切换
- 关中断可能会被滥用
- 关中断时间长可能影响效率
- 不适用于多处理机,无法防止其他处理及调度其他进程访问临界区
- 只适用于内核进程(该指令运行在内核态)
- Test-and-Set 方法:(TS指令/TSL指令)
- 读出标志并设置为true ,并返回旧值(原子操作,是操作系统的原语,操作不会被中断)
- 也被称为TSL指令
- 违背让权等待,会发生忙等
- swap指令:
- 交换两个变量的值(原子操作)
- 违背了“让权等待的操作”
- 信号量机制:(必考考点******)
- pv操作(等待唤醒操作)
- p操作:wait原语:进程等待
- v操作:sginal原语:唤醒等待进程
- 操作:
- 利用整形信号量:(信号有数量是因为操作系统共享资源是有数量的
- 共享资源可能会有多个,每个进程可以同时使用其中一个
- 记录型信号量:进程进入阻塞状态,不会发生忙等
- 注意:记录型信号量解决了“让权等待”问题(是最好的解决让权等待的方法)
- 进程同步:管程(Monitor)监视器
- 管程用于管理进程,即用于实现进程同步的机制,是有代表共享资源的数据结构和一组过程(pv操作的函数)组成的管理程序(封装)
- 管程的组成:
- 管程的名称(是操作系统提供给我们的管理程序,给名称方便管理)
- 局限于管程内部的共享数据结构(对实际的共享资源进行抽象)
- 对该数据结构操作的一组过程(一组过程即多个函数)
- 管程内共享数据的初始化语句(对共享资源的封装)
- 管程的基本特征:
- 是一个模块化的基本程序单位,可以单独编译
- 是一个抽象数据类型,包含数据和操作
- 信息掩蔽,共享数据只能被管程内的过程所访问(一次只能允许一个进程在管程内进行访问)
- 管程的条件变量/条件对象
- 进入管程的进程可萌由于条件不满足二阻塞
- 被阻塞后进程应释放管程,以便其他进程调用管程
- 进程被阻塞的条件原因有多个,不同的原因有不同的条件队列,所以要移入不同的条件队列
- 进程移入条件队列后,应释放管程(释放cpu的执行权)
- 条件队列中的进程等待别的进程去唤醒
4、如何处理死锁问题:
- 死锁的概念:
- 死锁的定义:
- 多个进程由于竞争资源而造成的阻塞现象,若无外力作用,这些进程将如法继续推进
- 相似的概念
- 饥饿:
- 等待时间过长,以至于给过程的推进和相应带来明显影响,饿而不死
- 死锁产生的原因:
- 系统资源的竞争
- 进程推进顺序的非法
- 死锁产生的必要条件:
- 互斥条件:共享资源的排他性使用
- 不剥夺条件:访问时共享资源不会被剥夺
- 请求并保持条件:保存当前资源时求情另一个资源
- 循环等待条件:存在共享资源的循环等待链