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_Unix_Pthreads - Fatal编程技术网

Linux 抢占式线程与非抢占式线程

Linux 抢占式线程与非抢占式线程,linux,multithreading,unix,pthreads,Linux,Multithreading,Unix,Pthreads,有人能解释一下抢占式线程模型和非抢占式线程模型之间的区别吗 据我了解: 非抢占式线程模型:一旦线程启动,在该线程完成其任务之前,无法停止该线程或将控制转移到其他线程 抢占式线程模型:允许运行时随时介入并将控制权从一个线程转移到另一个线程。高优先级线程的优先级高于低优先级线程 请某人: 解释理解是否正确 解释两种模式的优缺点 关于何时使用真正有用的内容的示例 如果我在Linux(SystemV或Pthread)中创建一个线程而没有提及任何选项(是否有??),那么默认情况下使用的线程模型是抢占式

有人能解释一下抢占式线程模型和非抢占式线程模型之间的区别吗

据我了解:

  • 非抢占式线程模型:一旦线程启动,在该线程完成其任务之前,无法停止该线程或将控制转移到其他线程
  • 抢占式线程模型:允许运行时随时介入并将控制权从一个线程转移到另一个线程。高优先级线程的优先级高于低优先级线程
请某人:

  • 解释理解是否正确
  • 解释两种模式的优缺点
  • 关于何时使用真正有用的内容的示例
  • 如果我在Linux(SystemV或Pthread)中创建一个线程而没有提及任何选项(是否有??),那么默认情况下使用的线程模型是抢占式线程模型

  • 非抢占线程也称为协作线程。POE(Perl)就是一个例子。另一个例子是经典的MacOS(在OSX之前)。协作线程独占使用CPU,直到它们放弃它为止。然后调度程序选择另一个线程运行

    抢占式线程可以像协作线程一样自愿放弃CPU,但当它们不这样做时,CPU将从它们那里拿走,调度器将启动另一个线程。POSIX和SysV线程属于这一类

    协作线程的最大优点是更高的效率(至少在单核机器上)和更容易处理并发:它只在您放弃控制时存在,所以不需要锁定

    抢占式线程的最大优点是更好的容错性:一个线程不能屈服并不会阻止所有其他线程执行。由于多线程同时执行,因此通常在多核机器上工作得更好。最后,你不必担心确保自己不断屈服。这可能真的很烦人,例如,一个沉重的数字运算循环

    当然,你可以把它们混在一起。一个抢占式线程可以有许多协作线程在其中运行

  • 不,你的理解不完全正确。非抢占式(又称协作式)线程通常会手动放弃控制,让其他线程在完成之前运行(尽管这取决于该线程调用
    yield()
    (或其他什么)来实现)
  • 抢占线程更简单。协作线程的开销更小
  • 通常使用先发制人。如果您发现您的设计有大量的线程切换开销,那么协作线程将是一种可能的优化。在许多(大多数?)情况下,这将是一项相当大的投资,但回报最小
  • 是的,默认情况下,您会获得抢占式线程,不过如果您查看一下CThreads包,它支持协作线程。现在很少有人(现在)想要协作线程,我不确定它在过去十年内是否更新过

  • 如果您使用非抢占式,并不意味着进程在等待I/O时不执行上下文切换。调度程序将根据调度模型选择另一个进程。我们必须信任该进程

    非先发制人:

  • 更少的上下文切换,更少的开销,这在非抢占式模型中是合理的

  • 易于处理,因为它可以在单核处理器上处理

  • 先发制人

    优点:

  • 在这个模型中,我们有一个优先级,可以帮助我们更好地控制正在运行的流程

  • 更好的并发性是一种反弹

  • 在不阻塞整个系统的情况下处理系统调用

  • 缺点:

  • 同步需要更复杂的算法,关键部分处理不可避免

  • 随之而来的开销

  • 协作(非抢占)模型中,一旦一个线程获得控制权,它将继续运行,直到它显式地产生控制权或阻塞为止

    抢占模式中允许虚拟机随时介入并将控制权从一个线程转移到另一个线程。这两种模式各有优缺点

    Java线程通常在优先级之间是抢占式的。优先级较高的线程优先于优先级较低的线程。如果优先级较高的线程处于休眠状态或阻塞状态,则优先级较低的线程可以运行(假设一个线程可用并准备运行)

    但是,一旦高优先级线程唤醒或解除阻塞,它将中断低优先级线程并运行,直到完成、再次阻塞或被更高优先级的线程抢占

    Java语言规范偶尔允许VM运行低优先级线程,而不是可运行的高优先级线程,但在实践中这是不寻常的

    但是,Java语言规范中没有任何内容指定等优先级线程应该发生什么。在某些系统上,这些线程将被时间分割,运行时将为线程分配一定的时间。当该时间结束时,运行时将抢占正在运行的线程,并切换到具有相同优先级的下一个线程性

    在其他系统上,正在运行的线程不会被具有相同优先级的线程抢占。它将继续运行,直到阻塞、显式产生控制或被更高优先级的线程抢占

    至于derobert和pooria都非常清楚地强调了它们的优点。

    只需要注意一下yield():不要在Linux上使用它,因为它会导致糟糕的性能。生成的线程会被推到线程调度的最后面,因此直到整个系统中的所有其他线程都被调度时,线程才会被调度