爲什麼當其中一個線程等待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放大這個問題是非常廣泛的,並不特定於任何操作系統或編程語言。 –