每当cpu空闲时,操作系统必须从就绪队列中选择一个进城来执行。进程选择由短期调度程序后cpu调度程序执行。
与cpu调度功能有关的另一个部分是分派程序,用来将cpu的控制权交给短期调度程序选择的进程。
为比较cpu的调度算法,有以下准则:cpu使用率、吞吐量、周转周期、等待时间、响应时间。
1.调度算法
就绪队列不鄙视FIFO队列,就绪队列可以实现为FIFO队列、优先队列、树、链表。队列中的记录通常为进程控制块PCB
1.1先到先服务调度
最简单的算法是先到先服务算法(first-come,first-served FCFS)。其很容易用FIFO队列实现。但一个进程进到就绪队列,其PCB连接到队列的尾部。cpu空闲时,cpu分配给队列前头的进程,接着该运行进程从队列中删除。
FCFS策略的平均等待时间较长。该算法是非抢占的,进程会运行到释放cpu为止,即程序终止或请求IO.
1.2最短作业优先调度算法(shortest-job-first (SJF) scheduling algorithm)
cpu空闲时,他会赋给具有最短cpu区间的进程。同样长度的进程可用FCFS。一个更为适当的表示是最短下一个cpu区间的算法。
SJF算法是最佳的。因为其平均等待时间最小。他经常用于长期调度。下一个cpu区间通常可被预测为以前cpu区间长度的指数平均。
SJF算法可以是抢占或非抢占的。抢占SIF调度有时称为最短剩余时间优先调度,可抢占当前运行的进程。
1.3优先级调度
SJF可作为通用优先级调度算法的一个特例。每个进程都有一个优先级与其关联,具有最高优先级的进程分配到CPU。SIF属于简单优先级算法。优先级为其下个cpu区间的倒数。
优先级调度可以是抢占的或非抢占的。抢占的会使优先级高于当前运行进程的进程抢占其cpu.
优先级调度算法的一个主要问题是无穷阻塞(indefinite blocking)或饥饿(starvation),可以运行但缺乏cpu的进程是阻塞的,他在等待cpu。优先级调度回事某个低优先级进程无穷等待cpu。
1.4轮转法’
轮转法(round-robin RR)专门为分时系统设计。定义一个时间片,其为10-100ms的时间单元。将就绪队列作为循环队列。为每个进程分配不超过一个时间片的cpu.
RR 算法是抢占的,其性能很大程度上依赖于时间片的大小。如果时间片很大,那么RR算法与FCFS算法 差不多。如果时间片很小,RR算法称为处理器共享。上下文切换的时间仅为时间片的一小部分,因此上下文切换对RR影响不大。
1.5多级队列调度
一些情况下。前台程序要求比后台程序更高的优先级。多级队列调度算法将就绪队列分成许多独立队列,根据进程内存大小,优先级、类型等将其分配到一个队列。前台和后台程序可处于不同队列,分别采用RR和FCFS算法调度。
另外队列之间亦必须有调度,通常采用固定优先级抢占调度。
1.6多级反馈队列调度
多级队列调度不够灵活,而多级反馈队列调度算法运行进程在队列之间移动。如果进程使用过多cpu区间,那么他会被转移到更低优先级队列。这种方案将IO约束和交互进程留在更高优先级队列。在低优先级等待过长的进程也会转移到更高优先级防止饥饿的发生。
2.多处理器调度
SMP系统努力将一个进程在同一个处理器上运行,这被称为处理器亲和性,即一个进程需要有一种对其运行所在的处理器的亲和性。
负载平衡:smp系统将工作负载平均分配到处理器上。通常采用两种方法: push nigration和 pull migration.
对称多线程SMT:提供多个逻辑(非物理)处理器来实现SMP。即时系统仅有单处理器,但每个逻辑处理器都有自己的架构状态负责中断处理。SMT由硬件提供。
2.线程调度
系统调用的是系统线程,而非进程。用户线程由线程库管理。用户线程必须映射到相应的内核级线程。这种映射可能是间接的,可能使用轻量级进程(LWP)
1.竞争范围
一对一和多对多模型的系统上,线程库调度用户级线程到一个有效的LWP上运行,这被称为进程竞争范围PCS。
3.算法评估
评估的准则可包括如下参数:最大cpu使用率,同时要求最大响应时间为1s。最大吞吐量,例如周转时间与执行时间成正比。