2017-11-25 197 views
0

爲什麼當其中一個線程等待I/O時,使用用戶級線程庫的多線程進程會被阻塞?這是有道理的,但是當我想得更多時,就會彈出一個問題。用戶級別線程庫是否可以不安排另一個線程?爲什麼進程在多對一映射中等待I/O時被阻塞

+0

不清楚你在問什麼。你有關於特定編程語言的問題嗎?一個特定的操作系統?一個特定的庫?你是否有一個不符合你期望的行爲的代碼示例? –

+2

因爲在這種情況下操作系統不知道線程。爲了讓用戶級庫安排不同的線程,它必須運行。就操作系統而言,由於I/O請求,進程被阻塞。 –

+0

@james放大這個問題是非常廣泛的,並不特定於任何操作系統或編程語言。 –

回答

1

操作系統只能調度進程(或作業),它不知道程序中的線程,也不能按需要調度它們。 當進程的一部分(這裏是由於I/O阻塞的線程)被I/O操作阻塞時,OS會暫停整個進程,因爲os只處理進程(不是進程內的線程) 。 和多對一模型一樣,只有一個內核,線程被阻塞的進程不能被執行,直到被阻塞的線程恢復。而在多對多或者一對一的模型中,每個內核運行它的一段代碼,並且不知道在其他內核中被阻塞的線程。

1

有兩種類型的線程。操作系統線程和綠色線程(這是我認爲你在談論)。

操作系統線程由操作系統安排,除非您故意引入某些內容以同步它們(例如Semaphores),否則不會阻塞另一個線程(至少不會在您最近可能遇到的任何操作系統上)。

綠色線程,其中對於本身執行的進程調度不同的路徑,將阻止除非調度足夠聰明提供(並因此趕上)所有可能阻塞的函數調用和使用它們作爲調度機會。這也與合作多任務密切相關。

所以答案是肯定的,但只有這樣寫的話。 Python中的線程着名的不是這樣寫的,在GIL上閱讀,所以不會造成問題的結束。 Python現在可能已經修復了這個問題

相關問題