Alo*_*ave 51 unix linux multithreading pthreads
有人可以解释先发制人线程模型和非先发制人线程模型之间的区别吗?
据我了解:
有人可以请:
Jer*_*fin 40
yield()(或其他)来实现这一点).der*_*ert 23
非抢占线程也称为协作线程.这些的一个例子是POE(Perl).另一个例子是经典Mac OS(在OS X之前).协作线程专用CPU,直到它们放弃.然后调度程序选择另一个要运行的线程.
抢先线程可以像协作线程一样自愿放弃CPU,但是当它们没有时,它将从它们中获取,并且调度程序将启动另一个线程.POSIX和SysV线程属于这一类.
协作线程的巨大优势是更高的效率(至少在单核机器上)和更容易处理并发:它只在您产生控制时才存在,因此不需要锁定.
抢占线程的巨大优势是更好的容错能力:单个线程无法产生不会阻止所有其他线程执行.由于多个线程同时执行,因此通常在多核机器上也能更好地工作.最后,你不必担心确保你不断屈服.这在内部可能非常烦人,例如,大量的嘎吱嘎吱声.
当然,你可以混合使用它们.单个抢占线程可以在其中运行许多协作线程.
如果使用非抢占式,则并不意味着进程在进程等待I/O时不执行上下文切换.调度员将根据调度模型选择另一个进程.在这个模型中,我们必须信任这个过程.
非抢占:
1.无上下文切换= 在非抢先模型中可以理解的头顶较少
2.它更容易处理,因为它可以在单核处理器上处理
先发制人:
优点:
1.在这个模型中,我们优先考虑可以帮助我们更好地控制运行过程
我们可以看到更好的并发性
3.我们可以在不阻塞整个系统的情况下处理系统调用
坏处:
1.我们需要复杂的锁定算法,我们有应该处理的临界区问题
我们应该付出很大的开销