1、关于调度

虽然从概念上看,有多个进程或线程在同时执行,但在单一CPU下,实际上在任何时刻只能有一个进程或线程处于执行状态,而其他线程则处于非执行状态。进程/线程的调度任务就是怎么选择下一个要运转的进程。
CPU调度就是要达到极小化平均响应时间、极大化系统吞吐率、保持系统各个功能部件均处于繁忙状态和提供某种貌似公平的机制。
极小化平均响应时间就是减少做一件工作平均等待的时间;极大化系统吞吐率就是要在单位时间内完成尽可能多的程序;保持系统各个功能部件繁忙就是要让CPU和输入输出设备均处于忙碌状态。

2、先来先服务调度算法

就是谁先来,就先服务谁,这个算法所有地球人都能想到。
但先来先服务算法存在一个问题,因为他的机制是一个程序一旦启动就一直运行到结束或者受阻塞为止,而如果前面有很长的工作,就会导致用户的交互式体验很差。
就像我们排队办理事情,你要办理的事情只要几分钟就能办好,而你前面的一个人办理的事情因为复杂需要1个小时。这个时候你等在他后面就十分不高兴。

3、时间片轮转算法

时间片轮转算法就是周期性地进行进程切换,例如每1秒钟进行一次进程轮换,这样短程序排在长程序后面也可以很快得到执行。因为长程序执行1秒后就得把CPU让岀来,这样整个系统的响应时间就得到改善。
但该算法也有缺点:如果时间片选择过大,时间片轮转算法将越来越像先来先服务调度算法。而时间片如果选择过小,则进程切换所用的系统消耗将太多,使得系统的大部分时间花在逬程的上下文切换上。

4、短任务优先算法

短任务优先算法的核心是所有的程序并不都一样,而是有优先级的不同。貝体说来就是短任务的优先级比长任务的高,而我们总是安排优先级高的程序先运转。
该算法有两个変种:一种是非抢占,一种是抢占。非抢占短任务优先算法的原理是 让已经在CPU上运行的程序执行到结束或阻塞,然后在所有候选的程序中选择需要执行时间最短的进程来执行。抢占式短任务优先算法则是每进来一个新的进程就需要对所有进程(包括正在CPU上运行的进程)进行检査,谁的时间短,就运行谁。
该算法的缺点:可能造成长程序无法得到CPU时间而导致饥饿,另外,我们不知道每个进程还需要运转多久。

5、优先级调度算法

该算法原理是给每个进程赋予一个优先级,每次需要进程切换时,找一个优先级最高的进程进行调度。这样,如果我们给长进程一个高优先级,则该进程就不会再有 饥饿。
优先级调度算法的缺点:响应时间不能保证。除非将一个进程的优先级设为最高,但如果每个人都将自己进程的优先级设为最高,响应时间还是无法保证。

6、混合调度算法

混合调度算法:前面提到过的所有算法都存在缺点,我们合并它们的优点,摒弃 它们的缺点。
该算法的原理是将所有进程分成不同的大类,每个大类为一个优先级。如果两个进程处于不同的大类,则处于高优先级大类的进程优先执行;如果两个逬程处于同一个大类,则采用时间片轮转来执行。

7、高级议题:调度异常之优先级倒挂

优先级倒挂指的是一个低优先级任务持有一个被高优先级认为所需要的共享资源。这样高优先级任务因资源缺乏处于受阻状态,一直到低优先级任务释放资源为止,这样实际上造成了这两个任务的优先级倒挂。
如果此时有其他优先级介于二者之间的任务,并且不需要这个共享资源,则该中级优先级的进程将获得CPU控制,从而超越这两个任务。
有些时候,优先级倒挂可能会引起严重后果,如果一个高优先级进程一直不能获得资源,有可能造成系统故障或激活事先定义的纠正措施,如系统复位等。

倒挂的解决方案:使用中断禁止

这种办法的核心是通过禁止中断来保护临界区。
在采用此策略的系统中只有两个优先级:可抢占优先级和中断禁止优先级。前者为一般进程运行时的优先级,后者为运行于临界区的进程的优先級。
由于不存在第三种优先级,优先级倒挂无法发生。由于系统里只存在一个锁,乱序不会发生,因此死锁也不会发生。又由于临界区总能够不被打断而一直运行到结束,悬挂也不会发生。