【问题标题】:Does linux schedule a process or a thread?linux是调度进程还是线程?
【发布时间】:2013-03-14 03:04:58
【问题描述】:

阅读this SO question 后,我有一些疑问。请帮助理解。

调度涉及决定何时运行进程以及运行多长时间。

  1. Linux 内核是否调度线程或进程?由于内核内部没有区分进程和线程,调度程序如何处理它们?

  2. 如何确定每个线程的数量? 一种。如果为一个进程决定了一个时间量(比如 100 微秒)是在进程的所有线程之间共享吗?要么 湾。每个线程的量程由调度器决定?

注意:问题 1 和 2 是相关的,可能看起来相同,但只是想弄清楚事情是如何工作的。

【问题讨论】:

    标签: linux multithreading process kernel scheduling


    【解决方案1】:

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

    一个任务可能是:

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

    换句话说,多线程进程中的线程像非线程一样被调度 - 即单线程进程。

    低级clone(2) 系统调用创建用户级可调度任务(并且可用于创建fork-ed 进程或用于实现线程库,如pthread)。除非你是低级线程库实现者,否则不要直接使用clone

    AFAIK,对于多线程进程,内核(几乎)不是调度进程,而是内部的每个单独线程(包括主线程)。

    其实调度中有一些线程组和affinity的概念,但是我不太了解

    如今,处理器通常具有多个内核,并且每个内核都在运行一个任务(在某个特定时刻),因此您确实有多个并行运行的任务。

    CPU 量子时间分配给任务,而不是进程

    【讨论】:

    • 人们说Linux调度进程,而Windows调度线程。这是什么意思?根据这个答案,它看起来像 Linux 调度任务(可以被认为是线程)和 windows 做同样的事情。还是我错过了什么?
    • @prasannatsm:我不了解 Linux,但 Windows 肯定只调度线程。在任何调度操作期间,Windows 从具有处理器关联的所有正在运行的线程列表中选择一个“下一个线程”,并将上下文切换到它。除了执行 CR3 切换之外,调度程序不会查看进程以选择在内核上运行的下一个线程。
    【解决方案2】:

    POSIX 线程规范的 NPTL 实现将线程视为内核中的不同进程,具有唯一的 task_struct(因此也有 pid),因此每个线程本身都是可调度的,如上所述。因此,每个线程都有自己的时间片,并像上面提到的进程一样被调度。

    补充一点,目前Linux调度器不仅可以调度单个任务(一个简单的进程),还可以调度进程组甚至用户(所有进程,属于一个用户)作为一个整体。这允许实现组调度,其中 CPU 时间首先在进程组之间分配,然后在这些组中分配给单个线程。

    Linux 线程不直接对进程或线程进行操作,而是与可调度实体一起工作。由struct sched_entity 表示。 公平地说,每个进程/线程都是 sched_entity,但反过来可能不是真的。

    想了解详细的进程调度,请参考here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2020-06-01
      • 2012-01-17
      相关资源
      最近更新 更多