2011-09-07 78 views
0

假設兩個進程(或線程)都在緩衝區已滿的管道/套接字/終端上調用write,從而阻塞。緩衝區空間變得可用時,是否有保證誰先寫入?它是先進先出順序嗎?在全球範圍內,還是在給定的優先級別內,並首先按優先級排序?或者它是完全隨機的/不確定的?Linux IO優先級 - fifo命令? ...要麼?

飢餓的讀法呢?第一次撥打電話read是否會在數據可用時獲取數據?

我在Linux上特別提出問題,據我所知POSIX對這些問題沒有什麼可說的,但如果我錯了,我也會感興趣,而且POSIX確實要求特定的行爲。

回答

5

在內核中,管道讀取器和寫入器都使用pipe_wait()函數進行阻塞。該函數使用宏DEFINE_WAIT()來定義一個等待隊列,該隊列將等待隊列的.flags成員設置爲零。

他們被叫醒wake_up_interruptible_sync_poll(),其中調用__wake_up_common()。您可以看到,如果.flags成員沒有設置WQ_FLAG_EXCLUSIVE位(在這種情況下),那麼全部服務員都會被無意中設置爲可運行。

然後,調度程序將使用其正常啓發式方法來選擇要運行的可運行進程。具體而言,具有更高優先級的稍後服務員將首先進入 - 但請注意,如果您有多個可用的處理器核心,則多個服務員可以同時開始運行,並且首先實際接觸管道的服務器完全取決於哪一個設法搶先管道鎖。

2

簡短的回答:

更高優先級的進程可能會得到它第一次,但應用程序不應該讓這種行爲的假設。

附加信息:

當數據可以用一個管/插座,可以出現爭用狀態,其中一個看似隨機過程可以首先獲取鎖。在通用中,更高優先級的進程將首先獲得鎖,但這應該依賴於而不是,因爲許多其他因素可能導致此,例如處理器核心和活動線程的數量。

通常,用戶級別的應用程序可以假定更高的優先級將確保更頻繁的I/O訪問,但不應該期望或假定在這些通用性之外定義的一致行爲。

+0

這不就是默認調度程序嗎?還是他們刪除了Kconfig選項? –

+0

你是對的,這是默認的,但還有其他的選擇,這真的是要證明這一點;除了泛化之外,用戶應用程序不能依賴於特定的調度特性。 – Unsigned