31

在阅读了这个SO question 之后,我有一些疑问。请帮助理解。

调度涉及决定何时运行进程以及运行多长时间。

  1. linux内核是否调度线程或进程?由于内核内部没有区分进程和线程,调度程序如何处理它们?

  2. 每个线程的数量是如何决定的?一个。如果为一个进程决定了一个时间量(比如 100us),那么该进程的所有线程之间是否共享?或 b。每个线程的量子由调度程序决定?

注意:问题 1 和 2 是相关的,可能看起来相同,但只是想弄清楚事情是如何工作的,它们都在这里发布。

4

2 回答 2

47

Linux 调度程序(在最近的 Linux 内核上,例如至少 3.0)正在调度可调度的任务或简单的任务

一个任务可能是:

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

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

低级clone(2)系统调用创建用户级可调度任务(可用于创建fork-ed 进程或线程库的实现,如pthread)。除非你是低级线程库的实现者,否则不想clone直接使用。

AFAIK,对于多线程进程,内核(几乎)不是调度进程,而是调度内部的每个单独的线程(包括主线程)。

其实调度中有一些线程组和和的概念,但我不是很了解

如今,处理器通常具有多个内核,并且每个内核都在运行一个任务(在某个特定时刻),因此您确实有多个并行运行的任务。

CPU 量子时间分配给任务,而不是进程

于 2013-03-24T16:52:23.550 回答
7

POSIX 线程规范的 NPTL 实现将线程视为内核中的不同进程,具有唯一性task_struct(因此pid也是唯一的),因此每个线程本身都是可调度的,如前所述。因此,每个线程都有自己的时间片,并像上面提到的进程一样被调度。

顺便说一句,目前Linux调度器不仅可以调度单个任务(一个简单的进程),还可以调度进程组甚至用户(所有进程,属于一个用户)作为一个整体。这允许实现组调度,其中 CPU 时间首先在进程组之间分配,然后在这些组中分配给单个线程。

Linux 线程不直接对进程或线程进行操作,而是与可调度实体一起工作。代表struct sched_entity。公平地说,每个进程/线程都是一个sched_entity,但反过来可能不是真的。

要了解详细的进程调度,请参阅此处

于 2016-08-14T16:50:52.150 回答