阅读this问题后,我有些疑惑。请帮助理解。
调度涉及决定何时运行流程以及处理的时间。
Linux内核是否安排了线程或进程?由于进程和线程在内核中没有区别,调度程序如何处理它们?
每个线程的量程如何决定? 一个。如果为一个过程决定一个时间量(比如说100us)那么在进程的所有线程之间共享?要么 湾每个线程的量程由调度程序决定?
注意:问题1和问题2是相关的,可能看起来相同,但只是想明确事情是如何发挥作用的。
答案 0 :(得分:29)
Linux调度程序(在最近的Linux内核上,例如至少3.0)正在安排可调度任务或简单地任务。
任务可能是:
fork
创建,没有任何线程库)kworker
,nfsiod
,kjournald
,kauditd
,kswapd
等等...)换句话说,多线程进程内的线程被安排为非线程-i.e.单线程进程。
低级clone(2)系统调用创建用户区可调度任务(可用于创建fork
-ed进程或用于实现线程库,如 pthread )。除非您是低级线程库实现者,否则您不希望直接使用clone
。
AFAIK,对于多线程进程,内核(几乎)不会调度进程,而是每个单独的线程(包括主线程)。
实际上,调度中有一些线程组和affinity的概念,但我不太了解它们
目前,处理器通常具有多个核心,每个核心都在运行任务(在某个特定时刻),因此您可以并行运行多个任务。
CPU量子时间被赋予任务,而不是进程
答案 1 :(得分:3)
POSIX线程规范的NPTL实现将线程视为内核中的不同进程,具有唯一的task_struct
(因此也是pid
),因此每个线程本身都可以调度。因此,每个线程都有自己的时间片,并且就像上面提到的那样进行调度。
只是补充一点,目前Linux调度程序不仅能够调度单个任务(一个简单的进程),而且能够调度整个进程组甚至用户(属于用户的所有进程)。这允许实现组调度,其中CPU时间首先在进程组之间划分,然后在这些组内分发到单个线程。
Linux线程不直接在进程或线程上运行,而是与可调度实体一起使用。由struct sched_entity
代表。
可以说每个进程/线程都是sched_entity
,但反过来可能不是真的。
要了解详细的流程安排,请参阅here