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