2017-11-25 198 views
0

为什么当其中一个线程等待I/O时,使用用户级线程库的多线程进程会被阻塞?这是有道理的,但是当我想得更多时,就会弹出一个问题。用户级别线程库是否可以不安排另一个线程?为什么进程在多对一映射中等待I/O时被阻塞

+0

不清楚你在问什么。你有关于特定编程语言的问题吗?一个特定的操作系统?一个特定的库?你是否有一个不符合你期望的行为的代码示例? –

+2

因为在这种情况下操作系统不知道线程。为了让用户级库安排不同的线程,它必须运行。就操作系统而言,由于I/O请求,进程被阻塞。 –

+0

@james放大这个问题是非常广泛的,并不特定于任何操作系统或编程语言。 –

回答

1

操作系统只能调度进程(或作业),它不知道程序中的线程,也不能按需要调度它们。 当进程的一部分(这里是由于I/O阻塞的线程)被I/O操作阻塞时,OS会暂停整个进程,因为os只处理进程(不是进程内的线程) 。 和多对一模型一样,只有一个内核,线程被阻塞的进程不能被执行,直到被阻塞的线程恢复。而在多对多或者一对一的模型中,每个内核运行它的一段代码,并且不知道在其他内核中被阻塞的线程。

1

有两种类型的线程。操作系统线程和绿色线程(这是我认为你在谈论)。

操作系统线程由操作系统安排,除非您故意引入某些内容以同步它们(例如Semaphores),否则不会阻塞另一个线程(至少不会在您最近可能遇到的任何操作系统上)。

绿色线程,其中对于本身执行的进程调度不同的路径,将阻止除非调度足够聪明提供(并因此赶上)所有可能阻塞的函数调用和使用它们作为调度机会。这也与合作多任务密切相关。

所以答案是肯定的,但只有这样写的话。 Python中的线程着名的不是这样写的,在GIL上阅读,所以不会造成问题的结束。 Python现在可能已经修复了这个问题

相关问题