一. 操作系统调度的原则
1. 什么是调度
当计算机系统多道程序设计系统时,通常就会有多个进程或者线程竞争CPU,只要有两个或者更多的进程处于就绪状态,这种情况就会发生,如果只有一个CPU可以用,那么必须选择下一个要运行的进程,在操作系统中,完成选择工作的这一部分被称为调度程序(scheduler)。该程序使用的算法称为调度算法(scheduler algorithm)。
几乎所有的进程的I/O请求或者计算都是交替突发的,注意,某些I/O活动可以看做是计算,例如,当CPU向视频RAM复制数据以等待更新屏幕时,因为使用了CPU,所以是计算活动,而不是I/O活动,按照这种观点,当一个进程等待外部设备完成工作而被阻塞时,才是I/O活动。
2. 何时调度
- 在创建一个新进程后,需要决定是运行父进程还是z子进程;
- 一个进程退出后必须进行调度;
- 在一个进程阻塞在I/O和信号量上或者由于其他原因阻塞的时候,必须选择另一个进程开始运行。
- 在一个I/O发生中断的时候,必须做出调度决策。
- 非抢占式调度:挑选一个进程,然后让该进程运行到被阻塞。
- 抢占式调度:挑选一个进程让他运行到某个固定时段的最大值。如果在改时间段结束时,该进程仍然在裕兴,它就会被挂起,而调度程序挑选另一个进程运行,如果存在一个就绪进程。进行抢占式调度处理,需要在事件间隔的末端发生时钟中断,以便把CPU控制返回给调度程序,如果没有可用的时钟,那么非抢占式调度就是唯一的选择。
3. 调度算法的三个目标
- 吞吐量 (throughout) : 系统每个小时完成的作业数量。
- 周转时间 (turnaround time) : 一个批处理作业提交时刻到完成该作业完成时刻为止的统计平均时间。
- CPU利用率 (CPU Utilization) : 多用于度量批处理系统,反映CPU的使用情况。
当然我们也可以不完全依靠操作系统的调度进程来对我们的进程进行调度,我们可以手动调整,即调整调度程序的参数。这种方法被称为调度机制与调度策略分离。
二. 批处理系统中的调度
对于批处理系统的调度,需要满足以下几个要求:
- 吞吐量——每小时最大作业量
- 周转时间——保持从提交到终止间最小忙碌
- CPU利用率——始终保持CPU忙碌
1. 先来先去服务 (first-come first-served, FCFS)
这是一个非抢占式的调度算法。实现也很简单,就是进程按照它们请求的CPU顺序使用CPU,谁先申请谁就会在队列的前面,后面申请的就不断加入到队尾即可。当一个正在运行的进程发生了阻塞,那么队列中的第一个进程就会继续运行,在阻塞的进程编程就绪时,就像一个新来到的作业一样,排到队列的末尾。
2. 最短作业优先 (shortest job first)
同样也是一个非抢占式调度算法。实现起来也非常简单,就是把作业的时间从小到大排列,并且按这个顺序进行进程的运行。但要注意,这个算法要当所有的进程都可以同时运行的时候才是最优的。比如有4个作业ABCD(假设都可以同时运行),他们的作业时