为什么使用用户级线程库的多线程进程在其中一个线程等待I / O时被阻止?这是有道理的,但当我想到更多时,会出现一个问题。用户级别的线程库是否可以不安排另一个线程?
答案 0 :(得分:1)
操作系统只能安排进程(或作业),它无法知道程序中的线程,也无法按需要安排它们。 当进程的一部分(这里是由于i / o而被阻塞的线程)被阻塞进行i / o操作时,os会暂停整个进程,因为os只处理进程(而不是进程中的线程)。 在多对一模型中,只有一个内核,其线程被阻止的进程无法执行,直到被阻塞的线程恢复。 而在多对多或一对一的模型中,每个内核运行其代码片段并且不知道其他内核中阻塞的线程。
答案 1 :(得分:1)
有两种类型的线程。操作系统线程和绿色线程(我认为你正在讨论这个问题)。
操作系统调度操作系统线程,并且不会阻止另一个操作系统(至少不会阻止您最近可能遇到的任何操作系统),除非您故意引入某些内容来同步它们(例如信号量)。
绿色线程,其中进程为自己调度不同的执行路径,将阻止除非调度程序足够聪明地提供(并因此捕获)所有可能阻塞的函数调用并将它们用作调度机会。这也与合作多任务密切相关。
所以答案是肯定的,但只有这样写。 Python中的线程并不是以这种方式编写的,而是在GIL上读取,因此不会导致问题的终结。 Python现在可能已经解决了这个问题。