导图社区 进程管理与处理机调度篇
软件工程大二专业课操作系统精细学习笔记
编辑于2020-03-19 15:02:10进程管理与处理机调度篇
线程(Thread)
概念
现代操作系统引入的一种执行实体
线程称"轻型进程",是进程的组成部分
进程是资源占有单位,线程只是CPU调度单位
一个进程运行过程中可创建多个线程
线程共享所属进程的资源
自己只有TCB和很少的栈区
多线程结构的优点
快速线程切换
通信易于实现
减少管理开销
并发程度提高
线程
内核级线程KLT
由操作系统管理
系用可见,用户不可见
操作系统直接进行线程调度
用户级线程ULT
用户管理/创建
系统不可见,用户可见
操作系统进行进程调度
用户进程自己进行线程调度
引入线程的目的
为了减少程序并发执行时所付出的时间开销,使得并发更粒度更细,并发性更好
处理机的调度层次
四级调度
作业调度
中级调度
进程调度
线程调度
典型的三级调度
高级调度 (作业调度) (长程调度)
从处于后备状态的作业中选择一道或几道装入内存
中级调度 (中程调度)
优先从处于挂起就绪状态的进程中选择一个或几个,将其激活
低级调度 (进程调度) (短程调度)
从处于就绪状态的进程中选择一个,切换给CPU执行
不同系统的情况
三级调度都有
高级调度 + 低级调度
中级调度+ 低级调度
只有低级调度
有的系统加了一级线程调度
进程概念
一个正在计算机上执行中的程序的
一个能分配给处理器执行的实体
一个具有以下特征的活动单元
一组指令序列的执行
一个当前状态和相关的系统资源集
进程是一个程序的一次动态之行过程
现代操作系统
多道程序设计系统
多道程序并发运行,共享CPU、内存、I/O设备等资源
并发运行方式的基本特征
异步特征
资源共享性特征
相互制约性特征
不可重现性特征
进程与进程管理模块
进程的特征
动态特征
生命周期
并发特征
在一个时间段内都处在宏观的运行状态
独立特征
独立占有资源
独立参与CPU调度
异步特征
运行推进的速度不可预知
结构特征
PCB
在内存的系统区
进程体
程序代码
数据集
感知进程
一般操作员如何感知到 Activity Monitor(Mac) 任务管理器(Windows)
用户进程
系统进程
服务进程
一般程序员
#include<unistd.h> pid = dork(); fork();
进程控制块PCB
进程标识
外部标识(外部名)
外部标识是进程的创建者提供的进程名字,通常由字符串组成
内部标识(内部名,简记为Pid)
是系统为进程命名的一个代码,通常是一个整型数
进程的调度信息
系统调度选择进程的依据
进程优先数,描述进程紧迫性的信息
进程状态信息,描述进程处于何种状态
其他调度信息
进程在系统中等待的时间
已在CPU上运行的时间
剩余的运行时间
处理机信息(进程上下文)
进程被中断时,该进程的CPU现场信息可以保存在它自己的PCB内。以便该进程重新获得CPU时可以从此处恢复现场信息,继续运行
通用寄存器的内容
数据寄存器
段寄存器等
程序状态字(Program Status Word)的值
程序计数器(Program Counter)的值
进程的堆栈指针等
进程控制信息
系统对进程实施控制的依据
程序代码和数据集所在的内存地址
资源清单,记载进程请求资源和已经占有的资源的情况
同步与通信信息
外存地址
家族信息
链接指针
主要功能
进程控制
管理控制一个进程的生命周期
创建新进程/撤销结束进程
阻塞或唤醒进程
挂起或激活进程
管理控制多个进程的并发
进程同步和进程互斥
进程通信
进程调度
根据进程当前状态决定那个进程获得CPU以及占用多长时间
将CPU分给进程
进程状态转换
进程的三种基本状态
运行状态Running
进程获得CPU并投入运行的一种状态
在单CPU系统中。每个瞬间只能有一个进程在运行
就绪状态Ready
进程尚未获得CPU使用权的一种状态
进程已经已经拥有除CPU外其他全部所需资源
万事具备、只欠东风
阻塞状态Blocked
进程因某种要求得不到满足,只好等待,我们又称之为运行受阻
处于阻塞状态的进程是无权获得CPU的
三状态之间的转换
后备——>就绪
创建
就绪——>运行
调度
运行——>阻塞
受阻
运行——>就绪
中断
阻塞——>就绪
激活
就绪——>完成
撤销
扩展的挂起(Suspend)状态
概念
将内存中当前某个尚不能运行的进程掉到外存上去,腾出来的空间接纳更多的进程
挂起某些暂不能运行的进程,目的是腾出内存装入更多进程,使CPU忙碌起来
挂起就绪S-Ready
挂起阻塞S-Blocked
原语
机器指令构成的一种实现特定功能的小程序,它的运行具有不可分个性
特点
贴近底层
运行过程具有原子性(不可中断)
系统小程序
进程控制用的原语
进程创建原语
Create_Process():
运行的情况
批作业调度
操作系统创建用户进程
交互作业提交
操作系统创建用户进程
系统提供服务
操作系统创建系统进程
用户创建子进程
用户程序创建用户进程
运行方式
索取一个空白PCB
填入进程信息
填入进程标识
PCB(优先级)
赋予优先级或将JCB(优先级)填入
PCB(内存地址)
请求分配内存或JCB(内存地址)或父进程的内存地址填入
PCB(资源清单)
请求分配设备或JCB(资源清单)或父进程资源填入
PCB(家族信息)
用户名或父进程
PCB(现场信息)
初始化状态进程
PCB(进程状态)
就绪
挂入就绪队列
若需要将程序代码和数据集装入内存,可启动加载程序
进程撤销原语
Destroy(id_name):
运行的情况
进程自行终止
用户或父进程的原因是进程终止
运行超时而终止
运行出错而终止
运行方式
根据id_name查找被终止进程的进程控制块PCB
若改进程的状态是运行,则置调度标志为TRUE
回收PCB(资源清单)中登记的全部资源
将进程的PCB从所在队列摘下来,等待其他程序来搜集信息
对于该进程的所有子进程Sub,递归调用End_Process(Sub),将子进程终止
如果调度标志=TRUE,启动进程调度程序
阻塞原语
Block():
当正在运行的进程需要等待某一事件而发生运行受阻时,它通过中断请求系统服务
系统按照进程的需求进行适当处理后,启动"进程阻塞原语"将该进程阻塞起来
引进进程阻塞(运行受阻的原因)
等待I/O
请求资源得不到满足
进程同步约束
服务进程无事可做
唤醒原语
Wake_up():
当系统发生某一事件时正在等待该事件的进程需要立即被唤醒,由阻塞状态转为就绪状态
被唤醒的原因
所等待的I/O操作已完成
请求的资源得到满足
进程同步约束已撤销
服务进程收到新的任务
运行方式
将当前进程的上下文保存到系统栈中
将阻塞队列上查找等待该事件的进程PCB
将PCB从阻塞队列上摘下来
将其状态置为就绪,将PCB挂入就绪队列
弹出系统栈中的进程上下文,置入CPU,让被中断的进程恢复执行
结束
挂起原语
Suspend():
被挂起的原因
当前内存空间紧缺,部分进程优先运行
应用户的要求,将用户进程挂起
应父进程的要求,将其子进程挂起
运行方式
找到被挂起进程的PCB,获得其内存地址,将内训空间还给存储管理模块
进程状态阻塞转为挂起阻塞,或者就绪转为挂起就绪,将PCB从原队列转入相应队列
申请外存交换区空间,转出进程,进程写入PCB
结束
激活原语
Active():
激活的情况
有进程运行完毕,当前内存空间并不紧张
应用户要求,将其子进程激活
应父进程要求,将其子进程激活
进程自身设定的挂起周期已完成
运行方式
扫描挂起就绪队列找到被激活进程的PCB
将PCB从所在队列上摘下来
按PCB登记的空间需求、申请内存加载到内存当中
归还外存交换区空间
将进程状态置为就绪,插入就绪队列
结束
调度原语
进程通信用的原语
用于实现进程之间通信
资源互斥与同步用的原语
解决资源互斥访问,主要有P操作原语和V操作原语
资源管理用的原语
主要有请求资源的原语和释放资源的原语
父进程与子进程
fork()函数
函数原型
pid_t fork(void)
该函数包含于头文件unistd.h中
函数功能
建立一个新的子进程
子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码、组代码、环境变量、已打开的文件代码、工作目录和资源限制等
函数返回值
如果fork()调用成功,则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中返回0
如果fork()失败则直接返回-1,失败原因存于error中
系统内存不够
进程表满(容量一般为200~400)
用户的子进程太多()一般不超过25个
父进程创建子进程
子进程继承父进程资源,父子进程各自独立
父子进程各自拥有自己的PCB、内存用户区、临时资源等
各自独立参与CPU调度
从fork()中返回时,测试返回参数
若值为0,则是子进程,可以转移到相应的用户程序中继续进行
若值不为0(子进程的PID),则是父进程,继续执行主程序
进程调度
从处于就绪状态的进程中,按照某种调度策略,选择一个进程切换给CPU,使其状态从就绪转为运行
调度方式
非抢占实式调度
当前进程主动放弃处理机控制权
可能的原因
进程运行完毕退出
运行受阻
运行出错,非正常终止
遇到不可挽回的故障
抢占式调度
一般用于有实时需求的系统
指在系统正常运转期间,如果某种事件出现,系统将迫使正在运行的进程停下来,将CPU控制权交给其他进程
其思想源自对高度紧迫工作的响应
调度策略
FCFS算法
SPF算法
HPF算法
HRF算法
最短剩余时间(SRT,Shortest Remain Time)优先算法
实时系统周期任务
时间轮转RR(Round Robin)调度算法
抢占式调度
应用于分时系统,目标是提高响应及时性
进程轮流使用CPU,各用一个时间片,时间片用完管理程序停止它的运行,并将它转入就绪队列尾部,调度下一个进程
进程失去CPU不是自愿的,而是被系统剥夺的
轮转算法的启动时机
一个时间片运行结束
当前进程运行结束
正在运行的进程因运行受阻主动放弃了CPU控制权
时间片q的选取
进程的道数较多时q就选的小一些,反之可选的大一些
系统要求的响应时间比较苛刻的时候q就选的小一些,反之可选的大一些
多级队列调度算法
设置多个就绪队
就绪队优先级不同,优先级高的队列优先调度
优先级高的队列为空时再调度低优先级队列
多级队列反馈调度算法
实现
设置n个队列Q1~~Qn
记Qi的优先级为Pi,有P1>P2>P3........>Pn
记Qi的时间片为qi,有q1 < q2 < q3 < .......< qn
新建进程进入Q1队
只有Qi为空时才调度Q(i+1)中的进程
进程P在Qi中被调度执行,若时间片qi已到但尚未结束,则进程P转为就绪状态进入Q(i+1)队,进程P在Qn中被调度执行,若时间片已到但尚未结束,则进程转为就绪状态仍入Qn队
优点
终端型用户满意
短的批处理作业用户满意
长的批处理作业用户满意
实时任务调度
实时系统
实时任务是一类对时间要求较为严格的进程
支持这类任务运行的系统称为实时处理系统
分类
硬式实时系统
任务的执行有严格的deadline,专用系统
软式实时系统
工业控制系统
信息处理系统
实时系统的调度方式一般是抢占式的
非周期实时任务
紧迫型实时任务调度
紧迫性强的任务多见于一些专用的,响应时间要求特别苛刻的数据采集和控制系统中
所要求的响应时间很短,一般是微秒量级的
采用立即抢占的HPF调度算法
普通型实时任务调度
大多数自动控制系统对响应时间的要求都不是太高,一般是毫秒量级的
由于它允许的时间响应长度与时钟中断的周期基本吻合
采用基于时间中断抢占的HPF调度算法
宽松型实时任务调度
要求的响应时间比较长,一般可达数百毫秒甚至数秒
例如信息查询
非抢占的HPF调度算法
RR算法
周期性实时任务
信号检测和过程控制系统中呈现周期性运行规律的任务
周期任务A第i次运行前的剩余时间Fa(i):
Fa(i) = i * Ta - Tsa - t
Ta为任务a的周期长度
Tsa为任务A的每次执行时间长度
t为系统的当前时间
周期性任务可采用SRT(最小剩余时间)调度算法
概念区分
进程与程序的区别
程序
完成一件事情的代码序列
进程
程序的一次动态执行过程
状态
程序是静态的
进程是动态的
内容
程序
只包含代码
进程
要运行的代码
代码要处理的数据
运行过程中的状态参数等
进程与程序的关联
进程是操作系统为了管理控制程序的运行而加设的一个概念和一个实体
程序不运行就没有进程
一个进程是一个程序的一次动态执行过程
一个程序可能对应多个进程
作业、程序、进程
作业
用户提交给系统的一个计算任务
批作业 = 程序 + 数据 + 作业控制说明书
交互作业 = 程序 + 数据 + 交互命令
作业是用于人机之间交互的一个概念
程序是作业的组成部分
进程是程序的一次动态执行过程