抢占式调度
现代操作系统中,抢占式调度是一个很有意思的话题。
教科书对于抢占式调度的定义比较简单—-抢占式调度中,任务切换动作可以由于优先级变化而触发,而并非仅限于时间片用完或主动放弃CPU(当然,一般而言我们并不认为中断处理是一次严格意义上的抢占操作)。
从直觉上看,抢占式调度必然增加潜在的上下文切换次数,并因为增加了这些开销而降低系统吞吐量。那么,为什么要引入抢占式调度呢?
答案是:减少响应时间,或者说,让系统能更及时地响应高优先级的请求。
例如,在多处理器系统中,运行在其他处理器上的线程释放 mutex 的时候,可能会引起其他休眠中线程的优先级发生变化(例如,由于能够计算等待的时间,导致全部等待线程的优先级均提高)。这时很可能就需要进行抢占操作,以便让这些线程恢复执行,等等。
抢占式调度的缺点是,首先,它会提高系统发生死锁的机会,或者,更准确地说,它能够触发一些以前不易触发但真实存在的 竞态条件(race condition);其次,通常抢占会增加一些调度开销,导致系统吞吐量的下降。
还有一个经常会被问到的问题是,如果将时间片缩到足够小的程度,那么是否可以达到与抢占式调度相同的目的呢?我认为这个问题基本上可以回答"是",然而,小时间片往往意味着更大的调度开销。