据我所知,两者都使用:
- 多级反馈队列
- 优先级别(不同范围)
- 两者都管理线程而不是进程
但最大的区别是什么呢?
答案1
根据MSDN 上的调度优先级:
根据线程的调度优先级来调度它们。每个线程都分配有一个调度优先级。优先级范围从 0(最低优先级)到 31(最高优先级)。只有零页线程的优先级可以为零。(零页线程是一个系统线程,负责在没有其他线程需要运行时将所有空闲页面清零。)
系统将具有相同优先级的所有线程视为平等。系统以循环方式将时间片分配给所有具有最高优先级的线程。如果这些线程均未准备好运行,系统将以循环方式将时间片分配给所有具有次高优先级的线程。如果有更高优先级的线程可供运行,系统将停止执行较低优先级的线程(不允许其使用完其时间片),并将一个完整的时间片分配给较高优先级的线程。每个线程的优先级由以下标准确定:
- 其进程的优先级
- 线程在其进程优先级别中的优先级
我相信这个线程调度程序描述了一种称为多级队列,这是一种比多级反馈队列简单得多的调度算法。请注意,Windows 的过程调度程序使用多级反馈队列, 根据维基百科。自 Windows 7 和 Windows Server 2008 R2 以来,还有用户模式调度它让进程管理自己的线程调度。
正如其他人所提到的,从调度的角度来看,Linux 对进程和线程的处理是相同的。Linux 中的进程/线程调度是可配置的,有各种调度算法,有些可以通过重新编译内核来配置:
- 在 2.4 版中,默认使用 O(n) 调度程序
- 在 2.6.23 之前的 2.6 版本中,O(1) 调度程序是默认的
- 从 2.6.23 开始,完全公平调度程序是默认调度程序
- Brain Fuck Scheduler 是一款流行的第三方调度程序,以补丁集的形式提供
- 最早的 Deadline-first 调度程序自 3.14 版开始提供,专为实时工作负载而设计
请注意,上面的默认是指 vanilla 内核中的默认。某些发行版附带默认内核,该内核已预先配置为使用不同的默认调度程序。
除了调度算法之外,还有调度策略:SCHED_FIFO、SCHED_BATCH、SCHED_IDLE、SCHED_OTHER 和 SCHED_RR;可以在运行时更改,描述进程所具有的工作负载类型。
当前默认调度程序是完全公平调度程序,使用红黑树来维护调度公平性。Linux 2.6 完全公平调度程序内部:
CFS 背后的主要思想是在为任务提供处理器时间时保持平衡(公平性)。这意味着应该为进程提供公平数量的处理器。当任务的时间不平衡时(意味着一个或多个任务相对于其他任务没有获得公平的时间),那么应该为那些不平衡的任务提供执行时间。
为了确定平衡,CFS 会在所谓的虚拟运行时中维护提供给给定任务的时间量。任务的虚拟运行时间越短(即允许任务访问处理器的时间越短),其对处理器的需求就越高。CFS 还包括休眠公平性的概念,以确保当前不可运行的任务(例如,等待 I/O)在最终需要处理器时获得相当的处理器份额。
但是,与以前的 Linux 调度程序不同,CFS 并不将任务保存在运行队列中,而是维护一个按时间排序的红黑树(见图 1)。红黑树具有一些有趣且有用的特性。首先,它是自平衡的,这意味着树中的任何路径都不会比其他路径长两倍以上。其次,对树的操作发生在 O(log n) 时间内(其中 n 是树中的节点数)。这意味着您可以快速高效地插入或删除任务。
主要区别如下:
视窗
- 使用多级反馈队列进行进程调度 + 使用多级队列进行线程调度。线程调度程序只是选择最高优先级的线程,而进程调度程序则更智能,并使用反馈队列。
Linux
- 统一进程和线程调度程序可配置,默认使用 CFS。调度程序使用公平性度量并使用优先级将 CPU 分配偏向优先级较高的进程。
答案2
如果您指的是内核调度程序(而不是某些评论所建议的周期性任务调度程序),那么在 Linux 中这很简单:在调度方面,Linux 对线程和进程没有区别。从内核的角度来看,它们只是调度单元;区别在于重量上下文切换。有时这被称为一对一线程模型。
由于关于 Windows 内部的信息较少,因此我们无法透露太多。不过,Windows 历来区分进程和线程,因此在调度方面,它们更有可能被区别对待。
答案3
C2H5OH,既然一切都可用,您为什么会说没有关于 Windows Internals 的文档?我不知道……您可以在这里阅读大部分基础知识,http://msdn.microsoft.com/en-us/library/windows/desktop/ms684259(v=vs.85).aspx
维基百科上有一篇文章(线程(计算))列举了大部分差异,但没有引用来源,所以......