有人可以解释抢先线程模型和非抢先线程模型之间的区别吗?
根据我的理解:
有人可以请:
yield()
(或其他)来实现这一点。 非抢占线程也被称为协作线程。 一个例子是POE(Perl)。 另一个例子是经典的Mac OS(在OS X之前)。 合作线程有专门的CPU使用,直到他们放弃。 调度程序然后选择另一个线程运行。
抢占线程可以像合作的线程一样自愿放弃CPU,但是当它们不这样做的时候,它们将被取走,调度器将会启动另一个线程。 POSIX和SysV线程属于这一类。
协作线程的巨大优势是效率更高(至少在单核机器上),更容易处理并发:只有当你进行控制时才存在,所以不需要锁定。
抢占线程的巨大优势是更好的容错性:单线程无法成功并不会停止所有其他线程的执行。 通常在多核机器上工作得更好,因为多个线程一次执行。 最后,你不必担心确保你不断屈服。 内部真的很烦人,例如,一个繁重的运算循环。
当然可以混合使用 一个抢先的线程可以有很多合作的线程在里面运行。
如果使用非抢占式,这并不意味着进程在等待I / O时不会执行上下文切换。 调度员将根据调度模型选择另一个进程。 在这个模型中,我们必须相信这个过程。
非抢占:
1.无上下文切换=在非抢先模式下可能是合理的
2.易于处理,因为它可以在单核处理器上处理
先发制人 :
优点:
在这个模式中,我们有优先权,可以帮助我们对运行过程有更多的控制
2.我们可以看到更好的并发性
3.我们可以处理系统调用而不会阻塞整个系统
坏处:
1.我们需要复杂的算法进行锁定,我们有临界区应该处理的问题
2.我们经常需要付出很大的开销