在阅读了这个SO question 之后,我有一些疑问。请帮助理解。
调度涉及决定何时运行进程以及运行多长时间。
linux内核是否调度线程或进程?由于内核内部没有区分进程和线程,调度程序如何处理它们?
每个线程的数量是如何决定的?一个。如果为一个进程决定了一个时间量(比如 100us),那么该进程的所有线程之间是否共享?或 b。每个线程的量子由调度程序决定?
注意:问题 1 和 2 是相关的,可能看起来相同,但只是想弄清楚事情是如何工作的,它们都在这里发布。
在阅读了这个SO question 之后,我有一些疑问。请帮助理解。
调度涉及决定何时运行进程以及运行多长时间。
linux内核是否调度线程或进程?由于内核内部没有区分进程和线程,调度程序如何处理它们?
每个线程的数量是如何决定的?一个。如果为一个进程决定了一个时间量(比如 100us),那么该进程的所有线程之间是否共享?或 b。每个线程的量子由调度程序决定?
注意:问题 1 和 2 是相关的,可能看起来相同,但只是想弄清楚事情是如何工作的,它们都在这里发布。
Linux 调度程序(在最近的 Linux 内核上,例如至少 3.0)正在调度可调度的任务或简单的任务。
一个任务可能是:
fork
没有任何线程库创建的)kworker
, nfsiod
, kjournald
,kauditd
等kswapd
...)换句话说,多线程进程中的线程像非线程(即单线程)进程一样被调度。
低级clone(2)系统调用创建用户级可调度任务(可用于创建fork
-ed 进程或线程库的实现,如pthread)。除非你是低级线程库的实现者,否则不想clone
直接使用。
AFAIK,对于多线程进程,内核(几乎)不是调度进程,而是调度内部的每个单独的线程(包括主线程)。
其实调度中有一些线程组和亲和的概念,但我不是很了解
如今,处理器通常具有多个内核,并且每个内核都在运行一个任务(在某个特定时刻),因此您确实有多个并行运行的任务。
CPU 量子时间分配给任务,而不是进程
POSIX 线程规范的 NPTL 实现将线程视为内核中的不同进程,具有唯一性task_struct
(因此pid
也是唯一的),因此每个线程本身都是可调度的,如前所述。因此,每个线程都有自己的时间片,并像上面提到的进程一样被调度。
顺便说一句,目前Linux调度器不仅可以调度单个任务(一个简单的进程),还可以调度进程组甚至用户(所有进程,属于一个用户)作为一个整体。这允许实现组调度,其中 CPU 时间首先在进程组之间分配,然后在这些组中分配给单个线程。
Linux 线程不直接对进程或线程进行操作,而是与可调度实体一起工作。代表struct sched_entity
。公平地说,每个进程/线程都是一个sched_entity
,但反过来可能不是真的。
要了解详细的进程调度,请参阅此处