Linux是调度进程还是线程?

38

在阅读了这个Stack Overflow的问题之后,我有几个疑问,请帮忙理解。

调度涉及决定何时运行进程以及每个量子时间的长度。

  1. Linux内核是调度线程还是进程?由于内核中没有区分进程和线程,调度程序会如何处理它们?

  2. 如何确定每个线程的量子? a. 如果为进程确定了一段时间的量子(比如100微秒),那么这个量子是在进程的所有线程之间共享的吗?还是 b. 调度程序决定每个线程的量子?

注意:问题1和2是相关的,可能看起来相同,但只是想澄清工作原理,所以在此都发布了。

2个回答

54

Linux调度程序(例如3.0及更高版本的Linux内核)正在调度可以调度的任务或简单地说是任务。

任务可能是:

  • 单线程进程(例如由fork创建的没有任何线程库的进程)
  • 多线程进程中的任何线程(包括其主线程),特别是Posix线程(pthreads)
  • 内核任务,它们在内核内部启动并停留在内核空间中(例如kworkernfsiodkjournaldkauditdkswapd等等...)

换句话说,多线程进程中的线程像非线程-即单线程-进程一样进行调度。

底层的clone(2)系统调用创建用户空间可调度的任务(既可以用于创建fork的进程,也可以用于线程库的实现,例如pthread)。除非您是底层线程库实现者,否则不要直接使用clone

据我所知,对于多线程进程,内核(几乎)不调度进程,而是调度其中的每个单独线程(包括主线程)。

实际上,调度中存在一些线程组和亲和性的概念,但我不了解它们

现在,处理器通常具有多个核心,并且每个核心在运行任务(在某个给定的时刻),因此您可以同时运行多个任务。

CPU时间片分配给任务而不是进程。


1
人们说Linux调度进程,而Windows调度线程。这是什么意思呢?根据这个答案,看起来Linux调度任务(可以被视为线程),而Windows也是如此。或者我有什么地方理解错了吗? - prasannatsm
2
@prasannatsm:我不了解Linux,但Windows肯定只调度线程。在任何调度操作期间,Windows从具有处理器亲和性的所有正在运行的线程列表中选择“下一个线程”,并切换到它。除执行CR3切换外,调度程序不会查看进程以选择在核心上运行的下一个线程。 - SecurityMatt

9
NPTL执行POSIX线程规范时,将线程视为内核中的不同进程,具有独特的task_struct(因此也有pid),因此每个线程本身都可调度,因此每个线程都有自己的时间片并像上面提到的那样进行调度。

值得补充的是,目前Linux调度程序还能够调度不仅是单个任务(一个简单的进程),而且调度多个进程或者整个用户(属于一个用户的所有进程)。这允许实现组调度,其中CPU时间首先划分为进程组,然后在这些组中分配给单个线程。

Linux线程不直接操作进程或线程,但使用可调度实体。由struct sched_entity表示。可以说每个进程/线程都是sched_entity,但反之则不一定成立。

要了解详细的进程调度,请参见here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接