线程根据它们的调度优先级被调度运行。每个线程被分配一个调度优先级。优先级范围从 0(最低优先级)到 31(最高优先级)。只有零页线程的优先级可以为零。(零页线程是一个系统线程,负责在没有其他线程需要运行时将任何空闲页归零。)
系统将所有具有相同优先级的线程视为平等。系统以循环方式将时间片分配给具有最高优先级的所有线程。如果这些线程都没有准备好运行,系统会以循环方式将时间片分配给具有下一个最高优先级的所有线程。如果高优先级线程可以运行,系统将停止执行低优先级线程(不允许它使用完其时间片),并为高优先级线程分配一个完整的时间片。每个线程的优先级由以下标准确定:
- 其进程的优先级
- 线程在其进程的优先级类中的优先级
我相信这个线程调度器描述了一种称为multilevel queue的算法,它是一种比多级反馈队列简单得多的调度算法。请注意,根据维基百科,Windows 的进程调度程序使用多级反馈队列。从 Windows 7 和 Windows Server 2008 R2 开始,还有用户模式调度,它允许进程管理自己的线程调度。
正如其他人所提到的,Linux 从调度的角度对待进程和线程是一样的。Linux 中的进程/线程调度是可配置的,有多种调度算法,有些可以通过重新编译内核来配置:
请注意,上面的默认值表示 vanilla 内核中的默认值。一些发行版附带一个默认内核,该内核预配置为使用不同的默认调度程序。
除了调度算法,还有调度策略:SCHED_FIFO、SCHED_BATCH、SCHED_IDLE、SCHED_OTHER、SCHED_RR;它可以在运行时更改,它描述了进程具有的工作负载类型。
当前默认的调度器 Completely Fair Scheduler,使用红黑树来维护调度的公平性。来自Linux 2.6 Completely Fair Scheduler 的内部:
CFS 背后的主要思想是在为任务提供处理器时间时保持平衡(公平)。这意味着应该为进程分配相当数量的处理器。当任务的时间不平衡时(意味着一个或多个任务相对于其他任务没有得到足够的时间),那么应该给那些不平衡的任务时间来执行。
为了确定平衡,CFS 在所谓的虚拟运行时维护提供给给定任务的时间量。任务的虚拟运行时间越小——意味着任务被允许访问处理器的时间越少——它对处理器的需求就越高。CFS 还包括休眠公平的概念,以确保当前不可运行的任务(例如,等待 I/O)在最终需要处理器时获得可比较的处理器份额。
但是,CFS 并没有像以前的 Linux 调度程序那样将任务维护在运行队列中,而是维护一个按时间排序的红黑树(见图 1)。红黑树是具有几个有趣且有用的属性的树。首先,它是自平衡的,这意味着树中的任何路径都不会比其他路径长两倍以上。其次,树上的操作发生在 O(log n) 时间内(其中 n 是树中的节点数)。这意味着您可以快速有效地插入或删除任务。
所以主要区别:
视窗
Linux
| 归档时间: |
|
| 查看次数: |
19736 次 |
| 最近记录: |