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