linux是否安排了进程或线程?

时间:2013-03-24 16:45:10

标签: linux multithreading process kernel scheduling

阅读this问题后,我有些疑惑。请帮助理解。

调度涉及决定何时运行流程以及处理的时间。

  1. Linux内核是否安排了线程或进程?由于进程和线程在内核中没有区别,调度程序如何处理它们?

  2. 每个线程的量程如何决定?  一个。如果为一个过程决定一个时间量(比如说100us)那么在进程的所有线程之间共享?要么  湾每个线程的量程由调度程序决定?

  3. 注意:问题1和问题2是相关的,可能看起来相同,但只是想明确事情是如何发挥作用的。

2 个答案:

答案 0 :(得分:29)

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

任务可能是:

  • 单线程进程(例如由fork创建,没有任何线程库)
  • 多线程进程中的任何线程(包括其主线程),特别是Posix线程(pthreads)
  • 内核任务,在内核内部启动并保留在内核域中(例如kworkernfsiodkjournaldkauditdkswapd等等...)

换句话说,多线程进程内的线程被安排为非线程-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