PCB(process control block)进程控制块
进程是动态的,程序是静态的
进程的状态:
- 运行态
- 就绪态
- 阻塞态
- 创建态
- 结束态
就绪态→运行态:就绪的程序分配到时间片,运行
运行态→就绪态:时间片用完了,让出处理机
运行态→阻塞态:(主动)进程请求某一资源的使用和分配或等待某一事件发生,比如要等一个IO输入
阻塞态→就绪态:(被动)等待的分配或请求来了,就可以就绪了
进程间通讯:
- 共享存储:
- 消息传递:
- 管道通信:
两个方向不能同时进行
进程通过调度获得处理器运行
进程间可能是无关的 也可能有交互性
进程的地址空间是各自私有的,不能相互访问
单系统中,可能都死锁
进程模型:
多对一:多个用户级线程映射到一个内核级线程 (并发度不高
一个用户级线程阻塞就阻塞
一对一:每个用户级线程映射到一个内核级线程 (开销太大
多对多:多个用户级线程映射到多个内核级线程 (要求用户级线程数≥内核级线程数
设备分配是通过数据结构进行的,不需要进程
系统吞吐量=总作业(道)/总时间(秒)
周转时间=作业完成时间—作业提交时间
平均周转时间=(作业1周转时间+作业2周转时间……作业n周转时间)/n
带权周转时间=作业周转时间/作业实际运行时间
平均带权周转时间=(作业1带权周转时间+作业2带权周转时间……作业n带权周转时间)/n
典型的调度算法:
先来先服务:长作业友好
短作业优先:短作业友好,会导致长作业饥饿,具有最短的平均周转时间
优先级调度:优先考虑IO繁忙程序,后考虑计算型程序
高响应比有限:不会饥饿,响应比=(等待时间+要求服务时间)/要求服务时间
时间片轮转:必抢占
多级反馈队列:融合前几种算法
进程同步
临界段/临界区:程序中访问临界资源的代码
互斥:
1)空闲让进
2)忙则等待
3)有限等待
4)让权等待
实现临界区互斥的基本方法:
软件方法
单标志法:搞个公用变量turn,用于指示让进的程序 turn=0则𝑃0让进,但必须两个进程交替访问,所以一个进程无法访问,违背“空闲让进”
双标志法先检查:进入前检查临界区有没有正被访问,进入时𝑃i设置flag[i]=true,退出时设置flag[i]=false,但是当两个进程同时设置flag时,可能会同时进入临界区,违背“忙则等待”
双标志法后检查:与前一个类似 但是先设置flag,如果两个同时进入,就会都卡在while,导致“饥饿”
Peterson's Algorithm:再加一个turn来防止上一个算法的饥饿,如果你想进,我也愿意让你的,那你就先进吧
硬件方法
中断屏蔽(关中断只对当前处理机有效,若同时别的处理机也用,就尬住了
···
关中断
临界区
开中断
···
硬件指令
TestAndSet(TSL/TS):不满足“让权等待”
Swap/Exchange/XCHG:不满足“让权等待”
信号量:表系统中某种资源的数量(很喜欢考大题和小题都喜欢)
wait(S)/singal(S)
P / V
整型信号量:不遵循“让权等待”,而是“忙等”
记录型信号量:遵循“让权等待”
管程:一种进程同步工具,使程序员无需自己实现互斥
包含:
管程的名称
局部于管程内部的共享结构数据说明
对该数据结构进行操作的一组过程
对局部于管程内部的共享数据设置初始值的语句
生产-消费者问题
多生产者-多消费者问题
因为盘子就一个 可以把临界区的PV去掉,因为最多只有一个进程可以进去用
如果盘子可以放大于1的水果,就可能父亲母亲同时放水果,所以需要临界区PV
所以当缓冲区>1时,必须设置mutex来互斥缓冲区
都加,就完事儿了,只不过,实现互斥的P一定要在实现同步的P之后进行,不然会死锁
吸烟者问题
读者写者问题
哲学家进餐问题
↓ 指的是第3个方法
公用队列是一种临界资源
PV操作是一种低级进程通信原语
死锁
主要考银行家算法和死锁预防/避免/检测的选择题
死锁:至少两个/两个以上的进程死锁,死锁时必在阻塞态。
饥饿:可能只有一个进程发生饥饿,可能阻塞态/就绪态
死循环:可能只有一个进程发生死循环,可以是运行态。
死锁产生必要条件:
1.互斥条件
2.不剥夺条件
3.请求和保持条件:
4.循环等待
死锁一定循环等待,循环等待不一定死锁
安全序列
银行家算法
死锁的检测