为什么当其中一个线程等待I/O时,使用用户级线程库的多线程进程会被阻塞?这是有道理的,但是当我想得更多时,就会弹出一个问题。用户级别线程库是否可以不安排另一个线程?为什么进程在多对一映射中等待I/O时被阻塞
0
A
回答
1
操作系统只能调度进程(或作业),它不知道程序中的线程,也不能按需要调度它们。 当进程的一部分(这里是由于I/O阻塞的线程)被I/O操作阻塞时,OS会暂停整个进程,因为os只处理进程(不是进程内的线程) 。 和多对一模型一样,只有一个内核,线程被阻塞的进程不能被执行,直到被阻塞的线程恢复。而在多对多或者一对一的模型中,每个内核运行它的一段代码,并且不知道在其他内核中被阻塞的线程。
1
有两种类型的线程。操作系统线程和绿色线程(这是我认为你在谈论)。
操作系统线程由操作系统安排,除非您故意引入某些内容以同步它们(例如Semaphores),否则不会阻塞另一个线程(至少不会在您最近可能遇到的任何操作系统上)。
绿色线程,其中对于本身执行的进程调度不同的路径,将阻止除非调度足够聪明提供(并因此赶上)所有可能阻塞的函数调用和使用它们作为调度机会。这也与合作多任务密切相关。
所以答案是肯定的,但只有这样写的话。 Python中的线程着名的不是这样写的,在GIL上阅读,所以不会造成问题的结束。 Python现在可能已经修复了这个问题
相关问题
- 1. 多线程:阻塞等待超时
- 2. 线程阻塞后等待
- 3. 在IO上等待的线程是否也会阻塞内核?
- 4. 中断阻塞从套接字等待IO的线程?
- 5. 为什么NSTimer在另一个线程运行时被阻塞?
- 6. 为什么在另一个线程中阻塞的IO阻止CreateWindowEx()返回
- 7. 非阻塞等待
- 8. 当锁定操作等待时,线程永远被阻塞
- 9. 为什么select()始终在非阻塞模式下被阻塞
- 10. 什么是简单的话阻止IO和非阻塞IO?
- 11. 等待并发GC阻塞
- 12. 等待线程被互斥锁阻塞的执行顺序
- 13. 在等待网络活动时阻塞UI线程
- 14. 如何避免在等待请求时阻塞.NET线程
- 15. 中断线程后的时间量,没有阻塞而等待
- 16. libc.so在一个进程中映射了四个段,为什么?
- 17. 谁唤醒了一个被阻塞的进程,因为它在信号量上执行等待失败?
- 18. 在阻塞队列中等待时的中断
- 19. Java线程中的“阻塞计数”和“等待计数”是什么意思?
- 20. 阻塞队列将等待元素出列多长时间?
- 21. 试图理解为什么一个线程可能在日食中被阻塞?
- 22. 当文件io打开的流被阻塞时会发生什么?
- 23. 等待没有阻塞线程? - 怎么样?
- 24. 整个网站在一个页面正在等待阻止操作时被阻止(PHP,ASP.NET)。为什么?
- 25. 为什么我的状态在ReactJS中被多次映射?
- 26. 多线程,阻塞和内存映射文件
- 27. 为什么启动一个线程被另一个线程阻塞?
- 28. 什么时候FileInputStream.read()阻塞?
- 29. 为什么异步运行进程阻塞线程?
- 30. 为什么ioctl()不阻塞?
不清楚你在问什么。你有关于特定编程语言的问题吗?一个特定的操作系统?一个特定的库?你是否有一个不符合你期望的行为的代码示例? –
因为在这种情况下操作系统不知道线程。为了让用户级库安排不同的线程,它必须运行。就操作系统而言,由于I/O请求,进程被阻塞。 –
@james放大这个问题是非常广泛的,并不特定于任何操作系统或编程语言。 –