抢先线索与非抢先线索

有人可以解释抢先线程模型和非抢先线程模型之间的区别吗?

根据我的理解:

  • 非抢占式线程模型:线程一旦启动就不能停止,或者控制不能被其他线程转移,直到线程完成其任务。
  • 抢占式线程模型:运行时被允许介入并随时从一个线程控制到另一个线程。 优先级较高的线程优先于较低优先级的线程。

有人可以请:

  1. 说明理解是否正确。
  2. 解释两种模式的优缺点。
  3. 什么时候使用真正有用的例子。
  4. 如果我在Linux(system v或Pthread)中创build一个线程而不提及任何选项(有没有?),默认情况下使用的线程模型是抢先线程模型?

  1. 不,你的理解不完全正确。 非抢先(又名合作)线程通常会手动产生控制权让其他线程在完成之前运行(尽管由线程调用yield() (或其他)来实现这一点。
  2. 抢占线程更简单。 合作线程的开销较小。
  3. 通常使用抢先。 如果你发现你的设计有很多的线程切换的开销,合作线程将是一个可能的优化。 在很多(最?)的情况下,这将是一个相当大的投资,尽管收益最低。
  4. 是的,默认情况下你会得到抢先式的线程,但是如果你看看CThreads包,它支持协作式线程。 很少有人(现在)想要合作的线程,我不知道在过去的十年里它已经被更新了。

非抢占线程也被称为协作线程。 一个例子是POE(Perl)。 另一个例子是经典的Mac OS(在OS X之前)。 合作线程有专门的CPU使用,直到他们放弃。 调度程序然后选择另一个线程运行。

抢占线程可以像合作的线程一样自愿放弃CPU,但是当它们不这样做的时候,它们将被取走,调度器将会启动另一个线程。 POSIX和SysV线程属于这一类。

协作线程的巨大优势是效率更高(至少在单核机器上),更容易处理并发:只有当你进行控制时才存在,所以不需要锁定。

抢占线程的巨大优势是更好的容错性:单线程无法成功并不会停止所有其他线程的执行。 通常在多核机器上工作得更好,因为多个线程一次执行。 最后,你不必担心确保你不断屈服。 内部真的很烦人,例如,一个繁重的运算循环。

当然可以混合使用 一个抢先的线程可以有很多合作的线程在里面运行。

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

非抢占:

1.无上下文切换=在非抢先模式下可能是合理的

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

先发制人

优点:

在这个模式中,我们有优先权,可以帮助我们对运行过程有更多的控制

2.我们可以看到更好的并发性

3.我们可以处理系统调用而不会阻塞整个系统

坏处:

1.我们需要复杂的算法进行锁定,我们有临界区应该处理的问题

2.我们经常需要付出很大的开销