
56
|
第二章
本章稍早所討論的非阻擋 I/O 可做為此問題的一個解決方案。使用非阻擋 I/O,應用程
式可以發出能夠傳回錯誤訊息的 I/O 要求,不會受到阻擋。然而,此解決方案的效率並
不高,有兩個原因。首先,行程需要不斷以任意順序發出 I/O 要求,一直等到其所開啟
之檔案描述器中已經出現可以進行 I/O 者。這是一個差勁的程式設計。其次,如果程式
可以休眠,效率將可提升不少,因為可以釋出處理器給其他任務使用,當有一或多個檔
案描述器已備妥可進行 I/O,則會喚醒休眠中的任務。
接著讓我們來探討多工式(multiplexed)I/O。
多工式 I/O 讓一個應用程式得以同時服務多個檔案描述器,以及在其中有任何一個備妥
可進行讀取或寫入時收到通知,而不會受到阻擋。多工式 I/O 因此成為了應用程式的支
點,它的運作方式類似下面這個樣子:
1. 多工式 I/O;當這些檔案描述器中有任何備妥可進行 I/O 者,請通知我。
2. 無任何檔案描述器準備妥當?休眠,直到有一個或多個檔案描述器備妥。
3. 被喚醒!有哪些檔案描述器準備妥當?
4. 處理所有備妥可進行 I/O 的檔案描述器,而不會受到阻擋。
5. 回到步驟 1,從頭開始。
Linux 提供了三種多工式 I/O 解決方案:
select
、
poll
及
epoll
等介面。本章將說明前面兩
種介面,最後一種介面(屬於進階的 Linux 解決方案)會在第 4 章加以說明。
select()
select()
系統呼叫提供了一個可用於實作多工式同步 I/O 的機制: ...