Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux是安排进程还是线程?_Linux_Multithreading_Process_Kernel_Scheduling - Fatal编程技术网

linux是安排进程还是线程?

linux是安排进程还是线程?,linux,multithreading,process,kernel,scheduling,Linux,Multithreading,Process,Kernel,Scheduling,读了这么多问题后,我有了一些疑问。请帮助理解 调度包括决定何时运行进程以及运行时间 linux内核是调度线程还是进程?由于进程和线程在内核中没有区别,调度程序如何处理它们 如何确定每个线程的数量? A.如果为一个进程决定了一个时间量(比如说100us),那么在该进程的所有线程之间共享这个时间量是吗?或 B每个线程的数量由调度程序决定 注意:问题1和问题2是相关的,看起来可能相同,但只是想弄清楚事情是如何运作的。请将它们发布在此处。Linux调度程序(至少在最新的Linux内核上,例如3.0)正在

读了这么多问题后,我有了一些疑问。请帮助理解

调度包括决定何时运行进程以及运行时间

  • linux内核是调度线程还是进程?由于进程和线程在内核中没有区别,调度程序如何处理它们

  • 如何确定每个线程的数量? A.如果为一个进程决定了一个时间量(比如说100us),那么在该进程的所有线程之间共享这个时间量是吗?或 B每个线程的数量由调度程序决定

  • 注意:问题1和问题2是相关的,看起来可能相同,但只是想弄清楚事情是如何运作的。请将它们发布在此处。

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

    任务可以是:

    • 单线程进程(例如,由
      fork
      创建,没有任何线程库)
    • 多线程进程(包括其主线程)中的任何线程,特别是Posix线程(pthreads)
    • 内核任务,这些任务在内核内部启动并留在内核中(例如,
      kworker
      nfsiod
      kjournald
      kauditd
      kswapd
      等)
    换句话说,多线程进程内的线程与非线程进程(即单线程进程)一样进行调度

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

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

    实际上,有一些线程组和调度的概念,但我不太了解它们

    现在,处理器通常有多个核心,每个核心都在运行一个任务(在某个给定的时刻),因此您确实有多个任务并行运行


    CPU量子时间分配给任务,而不是进程。POSIX线程规范的NPTL实现将线程视为内核中的一个不同进程,具有唯一的
    task_结构
    (因此也有
    pid
    ),因此每个线程本身都是可调度的。因此,每个线程都有自己的时间片,并像上面提到的进程一样进行调度

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

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


    要了解详细的进程调度,请参阅

    人们说Linux调度进程,而windows调度线程。这是什么意思?根据这个答案,看起来Linux调度任务(可以被视为线程),windows也这样做。还是我遗漏了什么?@prasannatsm:我不知道Linux,但Windows肯定只调度线程。在任何调度操作期间,Windows都会从具有处理器关联的所有正在运行的线程列表中选择“下一个线程”,并将上下文切换到该线程。除了执行CR3切换之外,调度器不会为了选择在内核上运行的下一个线程而查看进程。