优先级反转
这往往出现在一个高优先级任务等待访问一个被低优先级任务正在使用的临界资源,从而阻塞了高优先级任务;同时,该低优先级任务被一个次高优先级的任务所抢先,从而无法及时地释放该临界资源。这种情况下,该次高优先级任务获得执行权。
原因:
在操作系统中,一般情况下,
- 进程分优先级,高优先级进程需要执行时可打断现正在执行的低优先级进程;
- 普通的临界资源使用方法,如果一个临界资源被获取了,则其它想要获取此资源的程序被阻塞,直到此资源被释放;
- 有三个进程(其优先级从高到低分别为T1、T2、T3),有一个临界资源CS(T1与T3会用到)。这时,T3先执行,获取了临界资源CS。然后T2打断T3。接着T1打断T2,但由于CS已被T3获取,因此T1被阻塞,这样T2获得时间片。直到T2执行完毕后,T3接着执行,其释放CS后,T1才能获取CS并执行。这时,我们看T1与T2,虽然T1优先级比T2高,但实际上T2优先于T1执行。这称之为优先级逆转。
疑惑:低优先级的进程获取了资源,并处于就绪态,也会占用资源吗?不应该只有运行态才会占用资源?
解答:
临界区
在同步的程序设计中,临界区块(Critical section)指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源有无法同时被多个线程访问的特性。
当有线程进入临界区块时,其他线程或是进程必须等待(例如:bounded waiting 等待法),有一些同步的机制必须在临界区块的进入点与离开点实现,以确保这些共用资源是被互斥或的使用,例如:semaphore。
只能被单一线程访问的设备,例如:打印机。
一个最简单的实现方法就是当线程/线程(Thread)进入临界区块时,禁止改变处理器;在uni-processor系统上,可以用"禁止中断(CLI)"来完成,避免发生系统调用(System Call)导致的上下文交换(Context switching);当离开临界区块时,处理器恢复原先的状态。
就绪态 指的是进程已经具备了运行的条件 但是由于没有空闲的CPU,所以这个进程暂时还不能运行 ;
等待态 比如说你要去读盘 一个进程要去到磁盘读数据 在数据还没有读完之前,没有读到内存之前,这个进程 暂时是不能运行的
首先呢,是设置优先级的上限 那么这种方法实际上是说,凡是进入临界区的进程 我给它的优先级都是最高的。 你不在临界区的进程 优先级都会比这个进入临界区的这个,进程优先级要低 这样的话呢,它就可以执行完成,然后把临界区还回去 啊,
那么第二种方案呢,就是优先级的继承 如果一个低优先级的进程,阻碍了一个高优先级进程执行,那么 它可以临时地继承这个高优先级的这个进程的优先级 它可以一下子把自己优先级继承到这个高优先级的这个程度 那么它就可以去运行,然后呢把临界区还回去
第三种方案呢,就叫禁止中断 凡是进入临界区的进程,那么就不再响应中断的(就不会被中优先级的抢占)。 直到它 出临界区才响应中断,这样的话呢就保护了这个进程,让它 继续去执行。 所以呢这三种方案都可以解决优先级的反转问题
错题
有三个进程P1、P2和P3,运行时间均为50ms。假设时间片大小为10ms,且不考虑上下文切换的开销。采用时间片轮转(RR)算法执行完这三个进程,其平均完成时间是多少?
50ms
100ms
140ms
150ms
完成时间 = 处理时间 + 等待时间
一个进程的等待时间为它完成前的所有其他进程的执行时间。
print(['A', "B", "C"] * 5) ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'] A的等待时间: (B + C) * 4 = 80 A的等待时间: A + (A + C) * 4 = 90 A的等待时间: (B + C) * 5 = 100 总的等待时间 80 + 90 + 100 = 270 总的处理时间 50 * 3 = 150 所以平均时间为 (270 + 150) / 3 = 140
采用下列哪一个调度算法会产生“饥饿”现象?
最高响应比优先(HRRN)
时间片轮转(RR)
多级反馈队列(Feedback)
先来先服务(FCFS)
饥饿:进程一直得不到 CPU 的资源。我认为更好的说明是,是否存在某些情况,使某个进程一直得不到执行。
比如,多级反馈队列(Feedback),首先执行优先级高的队列,新加入的进程进入最高优先级队列,所以如果一直有任务加入,那么低优先级的队列会一直执行不到;
先来先服务(FCFS): 不管怎么样,加入了队列就会被执行到。