我一直在读恐龙书,对此模型感到困惑。
这些书说,对于一对多模型,“线程管理是由用户空间中的线程库完成的,因此效率很高;但是,如果线程进行阻塞系统调用,则整个过程都会阻塞。而且,因为只有一个线程可以一次访问内核,多个线程无法在多处理器上并行运行”
我感到困惑的是,如果进行了阻塞的系统调用,则整个进程将阻塞的含义是什么?这是否意味着如果我有一个多线程程序,并且其中一个线程块被阻塞,那么它的所有线程都必须等待,从而有效地使程序停止运行?
如果正在执行的程序导致该模型阻塞,是否表示由于内核线程正在阻塞而无法交换另一个单独的程序来执行?如果答案是肯定的,那么可以交换另一个程序(进程),为什么在阻塞线程被迫等待时,多线程程序不能简单地执行另一个线程?
如果您在用户级别管理线程,则意味着交换是由您的应用程序完成的,而不是由OS调度程序完成的。每个线程都必须到达某个位置,在该位置上他放弃(或失去)对管理机制的控制权,但是该机制也是用户级别的,因此,如果其中一个线程正在进行系统调用,则该线程即为您的线程管理系统(并通过所有其他线程)必须等到内核代码完成。
操作系统始终保持活动状态,并且可能仍然抢占整个程序,因此其他进程将不会饿死,只有您自己管理内部的“线程”。这些线程在该块期间无法启动,因为负责启动它们的机制也被内核阻止。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句