基本概念
多道程序设计的目标是,无论何时都有进程运行,从而最大化CPU利用率。它会有多个进程或线程同时竞争CPU。 分时系统的目的是在进程之间快速切换CPU,以便用户在程序运行时能与其交互。为了满足这些目标,进程调度器
选择一个可用进程到CPU上执行。单处理器系统不会具有多个正在运行的进程。如果有多个进程,那么其余的需要等待CPU空闲并能重新调度。
CPU-I/O执行周期
CPU的调度成功取决于观察到的进程属性: 进程执行包括周期进行CPU执行
和I/O等待
。进程在这两个状态之间不断交替。进程执行从CPU执行
开始,之后I/O执行
;接着另一个CPU执行,接着另一个I/O执行;等等。最终,最后的CPU执行通过系统请求结束,终止执行。
CPU密集型进程-I/O密集型进程
图a中的进程花费了绝大多数时间在计算上,称为CPU密集型
。
图b中的进程则在等待I/0上花费了绝大多数时间,称为I/O密集型
。
典型的CPU密集型进程
具有较长时间的CPU 集中使用和较小频度的I/O等待。
I/O密集型进程
具有较短时间的CPU集中使用和频繁的1/0等待。它是I/O类的,因为这种进程在I/O请求之间较少进行计算,并不是因为它们有特别长的I/O请求。在I/O开始后无论处理数据是多还是少,它们都花费同样的时间提出硬件请求读取磁盘块。
随着CPU变得越来越快,更多的进程倾向为I/O密集型。因为CPU的改进比磁盘的改进快得多,结果是,未来对I/O密集型进程的调度处理似乎更为重要。这里的基本思想是,如果需要运行I/O密集型进程,那么就应该让它尽快得到机会,以便发出磁盘请求并保持磁盘始终忙碌。
何时调度
出现以下情形需要调度。
-
1、在创建一个新进程之后,需要决定是运行父进程还是运行子进程。由于这两种进程都处于就绪状态,所以这是一种正常的调度決策,可以任意決定,也就是说,调度程序可以合法选择先运行父进程还是先运行子进程。
-
2、在一个进程退出时必须做出调度决策。一个进程不再运行(因为它不再存在),所以必须从就绪进程集中选择另外某个进程。如果没有就绪的进程,通常会运行一个系统提供的空闲进程。
-
3、当一个进程阻塞在I/O和信号量上或由于其他原因阻塞时,必须选择另一个进程运行。有时,阻塞的原因会成为选择的因素。例如,如果A是一个重要的进程,并正在等待B退出临界区,让B随后运行将会使得B退出临界区,从而可以让A运行。
-
4、在一个I/O中断发生时,必须做出调度决策。如果中断来自I/O设备,而该设备现在已经完成了上作,某些被阻塞的等待该I/O的进程就成为可运行的就绪进程了。
非抢占式调度算法
挑选一个进程,然后让该进程运行直至被阻塞(阻塞在I/O上或等待另一个进程),或者直到该进程自动释放CPU。即使该进程运行了若干个小时,它也不会被强迫挂起。这样做的结果是,在时钟中断发生时不会进行调度。在处理完时钟中断后,如果没有更高优先级的进程等待到时,则被中断的进程会继续执行。
抢占式调度算法
挑选一个进程,并且让该进程运行某个固定时段的最大值。如果在该时段结束时,该进程仍在运行,它就被挂起,而调度程序挑选另一个进程运行(如果存在一个就绪进程)。进行抢占式调度处理,需要在时间间隔的末端发生时钟中断,以便把CPU控制返回给调度程序。如果没有可用的时钟,那么非抢占式调度就是惟一的选择了。