📅  最后修改于: 2023-12-03 15:10:06.599000             🧑  作者: Mango
抢占式调度算法和轮循调度算法是操作系统中最常见的调度算法。两者都是操作系统内核调度多任务执行的方式。在具体实现中,抢占式调度算法通过更改任务的优先级,动态的选择优先级最高的任务;轮循调度算法则按照固定的时间片分配CPU时间,依次轮流执行所有任务,直到所有任务都执行完毕或者出现优先级更高的任务。
抢占式调度算法中,操作系统内核会基于任务的优先级选定待执行的任务。一旦优先级较高的任务等待执行,内核会强制中断当前正在执行的任务,从而使CPU执行新的高优先级任务。抢占式调度算法可以保证优先级较高的任务在较短时间内得到执行,所以在实时性较高的场景中比较常见。
在Linux内核中,抢占式调度通过内核维护了一个运行队列(runqueue
)来实现。runqueue
由多个链表(task_struct
)组成,每个链表都对应着一个具有相同调度优先级的进程。这些链表按照调度优先级从高到低排列,从而保证了优先级高的进程能够更加快速地得到执行。当CPU空闲时,Linux内核会优先选择运行队列中优先级最高的进程。
轮循调度算法中,决定进程运行时间的不再是进程的优先级,而是系统为每个进程分配的固定时间片大小。内核按照固定的时间片分配CPU时间进行调度,每个进程分配相同的时间片。一旦时间片用完,内核就会强制中断正在执行的进程,并将CPU时间分配给就绪队列中下一个进程。轮循调度算法只关心进程的相对时间,而非优先级,这样能够避免优先级反转的问题。
在Linux内核中,轮循调度算法通过任务调度的时间片(scheduling quantum
)来保证每个进程都得到公平的CPU时间。内核会按照时间片大小一律分配CPU时间,每当一个进程的时间片用完,内核就会重新加载下一个进程的初始寄存器,并选择下一个执行的进程。轮循调度算法在Linux内核中的实现是通过CFS(Completely Fair Scheduler)调度器完成的。CFS将系统中的所有任务组织成一个树状结构,在树的叶子节点中包含具体的进程。CFS会按照完全公平的原则来分配CPU时间片,并尽可能地保证进程公平地使用CPU时间,从而达到偏向更高优先级进程的效果。
抢占式调度和轮循调度都是常用的进程调度算法,但是它们在实现上又有区别。抢占式调度算法具有更好的实时性能,但是程序在执行的过程中会频繁地被中断,消耗较多系统资源。而轮循调度算法的速度则更快,可以大批量的执行进程,但是它可能会导致具有高优先级的任务长时间等待,从而影响系统的实时性。
| 分类 | 抢占式调度 | 轮循调度 | | ---------------- | ------------ | ---------- | | 算法原理 | 根据优先级 | 固定时间片 | | 系统是否公平 | 不完全公平 | 完全公平 | | 实时性 | 较好 | 较差 | | 中断频率及性能 | 高 | 低 | | 相对CPU利用率 | 较高 | 较低 |
总的来说,抢占式调度算法和轮循调度算法各有优缺点,根据具体的应用场景可以选择合适的调度算法。