本文已参与「新人创作礼」活动,一起开启掘金创作之路。
用信号量描述前驱图
生产者消费者问题
哲学家进餐问题
读写者问题
读者优先
共享变量:readcount,当前读者个数,初值为0
互斥信号量:Rmutex=1(读互斥)、Wmutex=1(写互斥)
写者优先,增加一个信号量 s,初值为 1,用来实现读写互斥,使写者请求发生后的读者等待。
FCFS(先来先服务)
SJF&SPF(最短作业/进程优先)
HRRN(高响应比优先算法)
优先权=等待时间+要求服务时间/要求服务时间
SRT(最短剩余时间优先)
基本思想:它总是选择预期剩余时间最短的进程。只要新进程就绪,且有更短的剩余时间,调度程序就可能抢占当前正在运行的进程
方式:抢占式
优点:抢占
缺点:必须记录过去的服务时间,从而增加了开销。
RR(时间轮转调度算法)
基本思想:系统将所有就绪进程按FCFS的原则,排成一个队列依次调度,把 CPU 分配给队首进程,并令其执行一个时间片,通常为 10-100ms。时间片用完后,系统的计时器发出时钟中断,该进程将被剥夺 CPU并插入就绪队列末尾。 优点:非常公平 进程切换时机:
- 若一个时间片尚未用完进程便已经完成,就立即再调度就绪队列中队首进程运行,并启动一个新的时间片。
- 如果在一个时间片用完时进程尚未运行完毕,则剥夺 CPU,调度程序把它送往就绪队列的末尾。
响应时间T = 时间片q × 就绪队列进程数n
时间片的选择:略大于一次典型的交互所需要的时间(在一个时间片内能完成80%左右的进程)
MFQ(多级反馈队列调度算法)
- 基本思想
EDF(最早截止时间优先算法)
- 非抢占式
- 抢占式
LLF(最低松弛度优先算法)
基本思想:算法是根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急度越高,其优先级越高,并使之优先执行。 方式:抢占式 松弛度 = 必须完成时间 - 本身剩余运行时间 - 当前时间 避免死锁(银行家算法)
- 定义 在资源的动态分配过程中, 采用某种策略防止系统进入不安全状态1, 从而避免发生死锁。(确保系统不进入不安全状态)。 并非所有不安全状态都是死锁状态,只要系统处于安全状态,则可避免进入死锁状态。
- 银行家算法
实质:设法保证系统动态分配资源后不进入不安全状态,以避免可能产生的死锁。
前提条件:要求进程必须预先提出自己的最大资源请求数量,这一数量不能超过系统资源的总量,系统资源的总量是一定的。
数据结构:
算法描述:
自然语言描述:
系统提出请求后,先判断请求是否合法,如果合法,则尝试修改,判断修改后是否存在安全状态,如果存在则确认修改。
如何判断是否存在安全状态:
当前系统可用资源分配给某个进程后,可以完成该进程,并释放该进程资源。循环直至全部完成;
死锁的检测与解除
- 资源分配图
重要结论:如果资源分配图中不存在环路,则系统中不存在死锁;反之,如果资源分配图中存在环路,则系统中可能存在死锁,也可能不存在死锁。
- 死锁定理
首次适应算法
空闲分区(链)按地址递增的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。
循环首次适应:在为作业分配内存空间时,不再每次从空闲分区表/链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足其大小要求的空闲分区为止。
最佳适应算法:空闲分区表/链按容量大小递增的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。
最坏则是递减排序。
地址变换
页表:访问一个数据需访问内存 2 次 (页表一次,内存一次)。
页面置换
- 最佳置换算法(OPT) 思路:选择永远不再需要的页面或最长时间以后才需要访问的页面予以淘汰。
最佳置换算法是一种理想化的算法,性能最好,实际上这种算法无法实现,因为页面访问的未来顺序很难精确预测,但可用该算法评价其它算法的优劣。
- 先进先出置换算法(FIFO) 思路:选择先进入内存的页面予以淘汰。
Belady奇异现象,是指采用页面置换FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多,但缺页率反而提高的异常现象,这是一个违反直觉的现象。
- 最近最久未使用算法(LRU) 思路:选择最近一段时间最长时间没有被访问过的页面予以淘汰。
:如果某个页面被访问了,则它可能马上还要访问。如果很长时间未被访问,则它在最近一段时间也不会被访问。该算法的性能接近于最佳算法,但实现起来较困难。因为要找出最近最久未使用的页面,必须为每一页设置相关记录项,用于记录页面的访问情况,并且每访问一次页面都须更新该信息。这将使系统的开销加大,所以在实际系统中往往使用该算法的近似算法。
条件:实现开销很大,必须有硬件支持。(寄存器、栈、)
- 最近最少使用置换算法(LFU) 思路:选择在最近时期使用最少的页面为淘汰页。
每当进程访问某页面时,将该页面对应寄存器的最高位 (Rn−1) 置 1,系统定期 (如 100ms) 将寄存器右移一位并将最高位补 0。在一段时间内,ΣRi 最小的页面就是最近最少使用的页面。
- 最近未使用算法 (Not Recently Used,NRU,又称Clock置换算法)
思路:
流程:
磁盘时间
位示图法
Footnotes
-
安全状态指在某一时刻,系统能按某种进程顺序 (p1,p2,…,pn) 来为每个进程 Pi 分配其资源,直到满足每个进程对资源的最大需求,使每个进程都可顺利地完成,则称此时的系统状态为安全状态,称序列 (p1,p2,…,pn) 为安全序列。若某一时刻系统中不存在这样一个安全序列,则称此时的系统状态为不安全状态。 ↩