首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >先发制人线程与非抢占线程

先发制人线程与非抢占线程
EN

Stack Overflow用户
提问于 2010-11-10 17:30:10
回答 4查看 31.3K关注 0票数 70

有人能解释一下先发制人的线程模型和非抢占线程模型的区别吗?

根据我的理解:

  • Non抢占式线程模型:一旦线程启动,就不能停止,或者在线程完成其任务之前不能将控件传输到其他线程。
  • Preemptive线程模型:运行时允许在任何时候从一个线程进入并将控制交给另一个线程。优先级较高的线程优先于优先级较低的线程。

谁能请你:

如果理解是correct.

  • Explain,那么
  1. 解释了这两种模型的优点和缺点。
  2. 是什么时候使用真正有帮助的东西的例子。如果我在Linux (system或P线程)中创建线程,而没有提到任何选项(有吗?),
  3. ?默认情况下,所使用的线程模型是抢占式线程模型??

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-10 17:56:44

  1. 不,你的理解不完全正确。非抢占线程(也称合作线程)通常会手动生成控制,让其他线程在完成之前运行(尽管要由该线程调用yield() (或其他什么)来使该线程更简单。协作线程具有较少的overhead.
  2. Normally使用抢占性。如果您发现您的设计有很多线程切换开销,协作线程将是一种可能的优化。在许多(大多数?)不过,在这种情况下,这将是一笔相当大的投资,但回报却微乎其微。
  3. 是的,默认情况下,你会得到先发制人的线程处理,尽管如果你四处看看CThreads包,它支持协作线程。没有多少人(现在)想要合作线程,但我不确定它是否在过去十年中更新过.
票数 54
EN

Stack Overflow用户

发布于 2010-11-10 17:47:44

非抢占性线程也称为协作线程.POE (Perl)就是一个例子。另一个例子是经典的Mac (在OS之前)。协作线程只有在放弃CPU之前才能使用CPU。然后,调度程序选择另一个线程来运行。

抢占式线程可以像协作线程一样自愿地放弃CPU,但是当它们不这样做时,就会从它们那里取出CPU,调度程序就会启动另一个线程。POSIX & SysV线程属于这一类别。

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

先发制人线程的最大优点是更好的容错性:单个线程不能产生结果并不能阻止所有其他线程的执行。通常情况下,在多核机器上工作更好,因为多个线程一次执行。最后,你不必为确保自己不断地屈服而担心。这可能是非常恼人的内部,例如,一个沉重的数字处理循环。

你当然可以把它们混合起来。单个抢占线程可以在其中运行多个协作线程。

票数 30
EN

Stack Overflow用户

发布于 2014-11-22 11:22:22

如果使用non-preemptive,并不意味着流程在等待I/O时不执行上下文切换,调度程序将根据调度模型选择另一个进程。我们必须相信这个过程。

non-preemptive:

  1. 减少上下文切换,减少非抢占模型

中的开销

  1. 易于处理,因为它可以使用单核处理器

来处理。

抢占式

优势:

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

)。

  1. 更好的并发性是

的奖励

  1. 处理系统调用而不阻塞整个系统

劣势:

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

一起带来的开销

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4147221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档