二、进程
进程的定义、组成、特征
程序段、数据段、PCB三部分组成了进程实体(进程映像)——PCB是进程存在的唯一标志。
定义:
- 进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
- 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
进程的组成:
进程组织方式:
进程的特征:
进程状态
进程的三态:就绪态、阻塞态、运行态(可多加两态——创建态、终止态)
状态转换:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B1529Vb0-1595492689461)(http://cdn.comewei.xyz/qiuniuimg/进程的状态转换.PNG)]
进程控制
进程控制的主要功能就是对系统中所有进程实施有效的管理,实现进程的状态转换
进程控制会导致进程状态的转换,要做的无非三类事情
- 更新PCB中的信息(如修改进程状态标志,将运行环境保存到PCB、从PCB恢复运行环境)
- 所有进程控制原语一定会修改进程状态标志
- 剥夺当前运行进程的CPU使用权不然需要保存其运行环境
- 某进程开始运行前必然要恢复期运行环境
- 将PCB插入合适队列
- 分配/回收资源
进程通信
进程通信:进程之间的信息交换
通信方式:
- 共享存储:设置一个共享空间,需要互斥访问共享空间
- 管道通信(实质:内存中开辟一个大小固定缓冲区):
- 只能半双工通信。如果需要实现双向同时通信,则需要设置两个管道。
- 各个进程互斥访问管道。
- 数据以字符流的格式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空。此时,读进程的read系统将被阻塞。
- 如果没有写满,则不允许读。反之亦然
- 数据一旦被读出,就从管道中被抛弃。意味着读进程最多只有一个,否则可能出现读错数据情况。
- 消息传递
- 传递格式化的消息(消息头/消息体)
- 系统提供“发送/接受”原语
线程——轻量级进程
线程的实现方式
-
用户级线程由应用程序通过线程库实现。
- 所有的线程管理工作都由应用程序负责(包括线程切换)
- 线程切换可以在用户态下即可完成,不需要操作系统干预
- 在用户看来是多个线程,但是在操作系统内核来看,并意识不到线程的存在——用户级线程对用户不透明,对操作系统透明。
- 从用户角度看到的线程
-
内核级线程——处理机分配的单位
- 内核级线程的管理工作由操作系统内核完成
- 内核级线程的切换必然需要在核心态下才能完成
- 从操作系统内核角度看能看到的线程
多线程模型
在支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的“多线程模型”
- 多对一模型(多指用户级线程,一指内核级线程)
- 优点:用户级线程切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
- 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高,多个线程不可以在多核处理机并行运行。
- 一对一模型
- 优点:当一个线程被阻塞后,别的线程还可以继续运行,并发能力强。多线程可在多核处理机并行运行。
- 一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态。因此线程管理的成本高,开销大。
- 多对多模型
- 集前面二者所长
处理机调度
调度:按照某种规则来决定处理这些任务的顺序
处理机调度:从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,实现进程的并发执行。
调度的三种层次
- 高级调度(作业调度)——外传调入内存
- 按一定的原则从外存上存于后备队列的作业中挑选一个或则多个作业,分配内存等必要资源,并且建立相应的进程(建立PCB),以使得它获得竞争处理机的权利。
- 作业调入内存时建立PCB,作业调出时才撤销PCB。高级调度主要是指调入问题。
- 中级调度——内存调度
- 引入虚拟存储技术之后,可将暂时不能运行的进程调到外存等待
- 目的——提高内存利用率和系统吞吐量
- 暂时调到外存等待的进程状态为挂起状态。值得注意的是:进程的PCB不会调到外存。
- PCB中会记录进程数据在外存忠的存放位置,进程状态等信息。被挂起的进程PCB会被放到挂起队列
- 低级调度——进程调度
三层调度的联系和差别
进程的挂起态与七状态模型
之前上述的五态中,我们还可以加入两种状态——就绪挂起和阻塞挂起
注:挂起和阻塞的不同在于挂起的进程映像还在外存中,而阻塞态下的进程映像在内存中
进程调度
时机:
- 当前运行的进程主动放弃处理机
- 进程正常终止
- 运行过程中发生异常而终止
- 进程主动请求阻塞(如等待I/O)
- 当前运行的进程被动放弃处理机
- 分给进程的时间片用完
- 由更紧急的事需要处理(如I/O中断)
- 有更高级的进程进入就绪队列
不能进程调度与切换的情况
- 处理中断的过程中
- 操作系统内核程序临界区
- 原子操作过程中。原则操作不可中断,要一气呵成(如修改PCB的进程状态标志,并将PCB放到相应队列)
进程在操作系统内核程序临界区中不能进行调度和切换
临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码
内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)
调度方式
- 非剥夺调度方式——非抢占式
- 剥夺调度方式——抢占式
进程切换过程重要完成了
- 对原来运行进程各种数据的保存
- 对新的进程各种数据的恢复(程序计数器、程序状态字、各种数据处理器等处理机现场信息,这些信息一般保存在进程控制块)
调度算法的评价指标
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EpwqvhyI-1595492689467)(http://cdn.comewei.xyz/qiuniuimg/调度算法评价指标.PNG)]
调度算法
早期批处理系统使用的算法,缺乏交互性:
-
先来先服务——追求等待时间
- 作业调度时,考虑的为那个作业先到达后备队列。进程调度时,考虑的是那个进程先到达就绪队列
- 非抢占式的算法
- 优点:公平、算法实现简单
- 缺点:
- 排在长作业(进程)后面的短作业(进程)需要等待很长时间,带权周转时间很大,对短作业来说体验不好。FCFS调度算对长作业有利。
-
短作业优先
- 追求最短的平均等待时间,最小的平均周转时间、最小的平均带权周转时间
- 默认为非抢占式的
- 短作业调度算法的平均等待时间、平均周转时间最少。严格来说这个是不太严谨的。抢占式的短作业/进程优先调度算法(最短剩余时间优先,SRNT算法)
- 优点:可以得到“最短的”平均等待时间、平均周转时间
- 缺点:对短作业有利、对长作业不利。
- 可能产生"饥饿"现象
-
高响应比优先
-
响 应 比 = ( 等 待 时 间 + 要 求 服 务 时 间 ) 要 求 服 务 时 间 响应比=\frac{(等待时间+要求服务时间)}{要求服务时间} 响应比=要求服务时间(等待时间+要求服务时间)
综合考虑了前两者算法,进行折中。
-
交互算法:
-
时间片轮转——分时操作系统
- 用于进程调度(只有作业放入了内存建立了相应的进程后,才能被分配处理机时间片)
- 时间片轮转调度算法:轮流让就绪队列的进程依次执行一个时间片(每次选择的都是排在就绪队列头的进程)
- 需要注意的是,进程之间切换过于频繁,系统会消耗大量的时间来处理进程切换,从而使得实际用于进程执行的时间比例减小
- 时间片如果过大,则退化来先来先服务调度算法
-
优先级调度算法
- 可用于I/O调度、也可用于进程调度。注:优先数越大,优先级越高
- 通常来说——系统进程优先级高于用户进程、前台进程优先级高于后台进程、操作系统更偏好I/O型进程(I/O繁忙型进程)
- 上述中I/O进程对应的是计算型进程(或称CPU繁忙型进程)
- 优点:可以处理紧急任务
- 缺点:导致饥饿现象
-
多级反馈队列——上述算法的折中算法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aq36hx22-1595492689468)(http://cdn.comewei.xyz/qiuniuimg/多级反馈队列.PNG)]
进程互斥与进程同步
进程同步
- 异步性:各并发执行的进程以各自独立的、不可预知的速度向前推进
- 同步也称为直接制约关系,协调工作次序而产生的制约关系
进程互斥
- 临界资源——一个时间段内只允许一个进程使用的资源
- 互斥也称间接制约关系,进程互斥是指一个进程访问某个临界资源时,另外一个进程访问该临界资源的进程必须等待
- 逻辑上的四个部分
- 临界区:访问临界资源的代码段——临界段
- 进入区和退出区是负责实现互斥的代码段
- 实现临界资源的互斥访问,遵循以下原则
- 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
- 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待
- 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
- 让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待