优先级反转
这往往出现在一个高优先级任务等待访问一个被低优先级任务正在使用的临界资源,从而阻塞了高优先级任务;同时,该低优先级任务被一个次高优先级的任务所抢先,从而无法及时地释放该临界资源。这种情况下,该次高优先级任务获得执行权。
原因:
在操作系统中,一般情况下,
- 进程分优先级,高优先级进程需要执行时可打断现正在执行的低优先级进程;
- 普通的临界资源使用方法,如果一个临界资源被获取了,则其它想要获取此资源的程序被阻塞,直到此资源被释放;
- 有三个进程(其优先级从高到低分别为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);当离开临界区块时,处理器恢复原先的状态。
;
等待态
错题
有三个进程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): 不管怎么样,加入了队列就会被执行到。