在阅读了这个Stack Overflow的问题之后,我有几个疑问,请帮忙理解。
调度涉及决定何时运行进程以及每个量子时间的长度。
Linux内核是调度线程还是进程?由于内核中没有区分进程和线程,调度程序会如何处理它们?
如何确定每个线程的量子? a. 如果为进程确定了一段时间的量子(比如100微秒),那么这个量子是在进程的所有线程之间共享的吗?还是 b. 调度程序决定每个线程的量子?
注意:问题1和2是相关的,可能看起来相同,但只是想澄清工作原理,所以在此都发布了。
在阅读了这个Stack Overflow的问题之后,我有几个疑问,请帮忙理解。
调度涉及决定何时运行进程以及每个量子时间的长度。
Linux内核是调度线程还是进程?由于内核中没有区分进程和线程,调度程序会如何处理它们?
如何确定每个线程的量子? a. 如果为进程确定了一段时间的量子(比如100微秒),那么这个量子是在进程的所有线程之间共享的吗?还是 b. 调度程序决定每个线程的量子?
注意:问题1和2是相关的,可能看起来相同,但只是想澄清工作原理,所以在此都发布了。
Linux调度程序(例如3.0及更高版本的Linux内核)正在调度可以调度的任务或简单地说是任务。
任务可能是:
fork
创建的没有任何线程库的进程)kworker
,nfsiod
,kjournald
,kauditd
,kswapd
等等...)换句话说,多线程进程中的线程像非线程-即单线程-进程一样进行调度。
底层的clone(2)系统调用创建用户空间可调度的任务(既可以用于创建fork
的进程,也可以用于线程库的实现,例如pthread)。除非您是底层线程库实现者,否则不要直接使用clone
。
据我所知,对于多线程进程,内核(几乎)不调度进程,而是调度其中的每个单独线程(包括主线程)。
实际上,调度中存在一些线程组和亲和性的概念,但我不了解它们
现在,处理器通常具有多个核心,并且每个核心在运行任务(在某个给定的时刻),因此您可以同时运行多个任务。
CPU时间片分配给任务而不是进程。
task_struct
(因此也有pid
),因此每个线程本身都可调度,因此每个线程都有自己的时间片并像上面提到的那样进行调度。
值得补充的是,目前Linux调度程序还能够调度不仅是单个任务(一个简单的进程),而且调度多个进程或者整个用户(属于一个用户的所有进程)。这允许实现组调度,其中CPU时间首先划分为进程组,然后在这些组中分配给单个线程。
Linux线程不直接操作进程或线程,但使用可调度实体。由struct sched_entity
表示。可以说每个进程/线程都是sched_entity
,但反之则不一定成立。
要了解详细的进程调度,请参见here。