进程
含义
进程是进程实体的运行过程。
进程是除CPU之外的系统资源的基本单位。
进程实体(进程映像)
由程序段、数据段、PCB(进程控制块)三部分组成。其中PCB是保存操作系统对进程管理所需要信息的一种数据结构,是进程存在的唯一标志。
进程的组织方式
链接方式:按照进程状态将PCB分为多个队列、操作系统持有指向各个队列的指针
索引方式:根据进程状态的不同,建立几张索引表、操作系统持有指向各个索引表的指针
进程的特征
程序的特征
程序顺序执行:顺序性、封闭性、可再生性
程序并发执行:间断性、失去封闭性、不可再生性
进程的状态
创建态:进程正在被创建,操作系统为进程分配资源,初始化PCB
终止态:进程正在被撤销,操作系统回收进程拥有的资源,撤销PCB
运行态:进程占有CPU,在CPU上运行
就绪态:已具备除CPU外的所有运行条件
阻塞态:等待某一事件而暂时不能运行
进程状态间的转换
进程控制
简单来讲就是实现进程状态之间的转换。
用原语实现进程控制,运行不可中断
进程控制原语要做的事情:
- 更新PCB中的信息
a. 修改进程状态标志
b. 剥夺CPU使用权必然要保存运行环境
c. 开始运行前必然要恢复运行环境 - 将PCB插入合适的队列
- 分配或回收资源
进程通信
进程之间的信息交换。可分为共享存储
、管道通信
、消息传递
。
共享存储
开辟一块共享空间,进程对共享空间的访问是互斥
的。
可分为:
- 基于数据结构的共享
- 基于存储区的共享
管道通信
在内存中开辟一块固定大小的缓冲区。
特点为:
- 半双工,互斥
- 写满时不能再写,读空时不能再读
- 没有读空不允许写,没有写满不允许读
- 数据一旦被读出就会被抛弃,所以读进程最多只能有一个
消息传递
以格式化信息为单位,通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
可分为:
- 直接通信方式:消息直接挂到接收方的消息队列里
- 间接通信方式:消息先发到信箱里
线程
CPU调度的基本单位
特点:
- 几乎不拥有系统资源
- 同一进程内的线程共享进程的资源
- 由于共享内存地址空间,同一进程内的线程间通讯不需要系统干预
引入线程之后的变化:
- 资源分配、调度
- 传统进程机制中,进程是资源分配,调度的基本单位
- 引入线程后,
进程
是资源分配
的基本单位,线程
是调度
的基本单位
- 并发性
- 传统进程机制中,只能进程间并发
- 引入线程后,线程间也能并发,提升了并发度
- 系统开销
- 传统进程间并发,需要切换进程的运行环境,系统开销很大
- 同一进程内线程间并发,不需要切换进程的运行环境,系统开销小
线程分类
用户级线程:用户才能看到的线程
内核级线程:系统才能看到的线程,只有内核级线程是处理机分配的单位
多线程模型
多对一模型
多个用户级线程映射到一个内核级线程
优点:
用户级线程的切换在用户态下即可完成,系统开销小,效率高
缺点:
- 当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高
- 多个线程不可以在多核处理器上并行运行
一对一模型
一个用户级线程映射到一个内核级线程
优点:
- 当一个用户级线程被阻塞后,其他线程还可以继续运行,并发度高
- 多个线程可以在多核处理器上并行运行
缺点:
一个进程会占用多个内核线程,线程切换需要在核心态下完成,系统开销大,效率低
多对多模型
n个用户级线程映射到m个内核级线程(n ≥ m)
处理机调度
处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
调度的种类
高级调度(作业调度):辅存(外存)与内存之间的调度
中级调度(内存调度):就是要决定将哪个处于挂起状态的进程重新调入内存。PCB会常驻内存
低级调度(进程调度):就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给CPU运行
进程调度的时机
进程调度的方式
调度算法的指标
C P U 利用率 = 忙碌时间 总时间 CPU利用率=\frac{忙碌时间}{总时间} CPU利用率=总时间忙碌时间
系统吞吐量 = 作业数量 总时间 系统吞吐量=\frac{作业数量}{总时间} 系统吞吐量=总时间作业数量
周转时间 = 作业完成时间 − 作业提交时间 周转时间=作业完成时间 - 作业提交时间 周转时间=作业完成时间−作业提交时间
平均周转时间 = 各作业周转时间之和 作业数 平均周转时间=\frac{各作业周转时间之和}{作业数} 平均周转时间=作业数各作业周转时间之和
带权周转时间 = 作业周转时间 作业实际运行时间 带权周转时间=\frac{作业周转时间}{作业实际运行时间} 带权周转时间=作业实际运行时间作业周转时间
平均带权周转时间 = 各作业带权周转时间之和 作业数 平均带权周转时间=\frac{各作业带权周转时间之和}{作业数} 平均带权周转时间=作业数各作业带权周转时间之和
等待时间:指进程 / 作业处于等待处理机状态时间之和 等待时间:指进程/作业处于等待处理机状态时间之和 等待时间:指进程/作业处于等待处理机状态时间之和
响应时间:指从用户提交请求到首次产生响应所用的时间 响应时间:指从用户提交请求到首次产生响应所用的时间 响应时间:指从用户提交请求到首次产生响应所用的时间
调度算法
先来先服务(FCFS)
特点:
- 只考虑等待时间
- 非抢占式
优点:
- 公平
- 算法简单
- 不会导致饥饿
缺点:
排在长作业后面的短作业需要等待很长时间,对长作业有利,对短作业不利
短作业优先(SJF):
特点:
- 只考虑执行时间
- 非抢占式
优点:
平均等待时间和平均周转时间较少
缺点:
- 对短作业有利,对长作业不利
- 运行时间是用户提供的,并不一定真实
- 会导致饥饿。如果有源源不断的短作业到来,长作业就会一直得不到服务
最短剩余时间优先(SRTN)
特点:
- 短作业优先的抢占式版本
- 每当就绪队列改变或进程运行完成时进行调度
优点:
平均等待时间和平均周转时间最少
缺点:
- 对短作业有利,对长作业不利
- 运行时间是用户提供的,并不一定真实
- 会导致饥饿。如果有源源不断的短作业到来,长作业就会一直得不到服务
最高响应比优先(HRRN)
特点:
- 综合考虑等待时间和执行时间,每次选择响应比最高的作业
- 非抢占式
- 响应比 = 等待时间 + 执行时间 执行时间 响应比=\frac{等待时间+执行时间}{执行时间} 响应比=执行时间等待时间+执行时间
优点:
- 综合考虑等待时间和运行时间
- 不会导致饥饿
时间片轮转(RR)
特点:
- 轮流让就绪队列中的进程依次执行一个时间片
- 抢占式
- 用于进程调度
优点:
- 公平
- 响应快,适用于分时操作系统
- 不会导致饥饿
缺点:
- 高频率进程切换,系统开销大
- 不区分任务紧急程度
优先级调度
特点:
抢占式和非抢占式
优点:
区分任务紧急程度,适用于实时操作系统
缺点:
会饥饿
多级反馈队列调度算法
特点:
抢占式
优点:
折中处理
缺点:
会饥饿
进程同步与进程互斥
进程同步
各个并发进程按要求有序推进
进程互斥
对临界资源的访问,需要互斥的进行。即同一时间段内只能允许一个进程访问该资源
进程互斥代码中的四个部分:
进入区:检查是否可进入临界区,若可进入,需要“上锁”
临界区:访问临界资源的那段代码
退出区:负责“解锁”
剩余区:其余代码部分
进程互斥的原则:
空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待
有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待
进程互斥的软件实现方法
单标志法
双标志先检查法
双标志后检查法
Peterson算法
进程互斥的硬件实现方法
中断屏蔽法
TestAndSet指令
Swap指令
信号量机制
用来表示计算机中某种资源数量的变量
可分为:整型信号量(不满足让权等待的原则,会忙等)和记录型信号量
P、V操作
P、V操作是用于实现对系统资源的申请和释放的一对原语
P、V操作必须成对出现,缺少P则不能保证临界资源的互斥访问,缺少V则会导致资源永不被释放,等待进程永不会被唤醒
P 原语操作的动作:信号量减1,若信号量小于零,则该进程被阻塞后进入与该信号相对应的队列中
V 原语操作的动作:信号量加1,若信号量小于或等于零,则从该信号的等待队列中唤醒一等待进程。
实现进程互斥:
- 信号量初始设为1
- 临界区之前执行P
- 临界区之后执行V
实现进程同步:
- 信号量初始设为0
- 前操作之后执行V
- 后操作之前执行P
生产者-消费者问题
多类生产者-消费者问题
吸烟者问题
读者-写者问题
哲学家问题
解决方案:
- 可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐。这样可以保证至少有哲学家是可以拿到左右两只筷子的。
- 要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这就避免了占有一支后再等待另一只的情况。
- 仅当两个哲学家左右两支筷子都可用时才允许他抓起筷子。
管程
死锁
在并发环境下,各进程互相等待对方手里的资源,导致各进程都阻塞,都无法向放推进的现象,就是“死锁”。发生死锁后若无外力干涉,这些进程都将无法向前推进。
死锁、饥饿、死循环的区别
死锁产生的必要条件
互斥条件: 对临界资源发生抢夺
不剥夺条件: 进程所获得的资源在使用完之前是不会被抢夺的
请求和保持条件: 进程保持了至少一个资源,但又提出新的资源要求,而该资源被其他进程占有,此时请求进程被阻塞,但又对既有的资源保持不放
循环等待条件: 链中的每一个进程已获得的资源同时被下一个进程所请求。
死锁的处理
破坏互斥条件
把临界资源改造成可共享的资源。如SPOOLing技术
缺点:不是所有的资源都可以改造成可共享的资源。为了系统安全,必需保护很多地方的互斥性
破坏不剥夺条件
破坏请求和保持条件
破坏循环等待条件
银行家算法
核心思想: 在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。
安全序列: 就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成
不安全状态: 如果分配了资源之后,系统中找不出任何一个安全序列,糸统就进入了不安全状态。
检测和解除
检测:用某种数据节后来保存资源的请求和分配信息,并提供一种算法,利用上述信息来检测系统是否已进入死锁状态。(依次消除与不阻塞进程相连的边,直到无边可消)