Unix系統IO模型簡介

2021-10-03 22:58:36 字數 1324 閱讀 4406

阻塞式io

​阻塞式io,即呼叫io函式之後阻塞,知道io操作完成後返回,繼續進行接下來的操作。

非阻塞式io

​程序把乙個套接字設定成非阻塞是在通知核心:當所請求的io操作不能立即完成而需要睡眠等待時,不要把本程序進入睡眠,而是返回乙個錯誤。

io多路復用

​io多路復用的方法有select、poll、epoll三種。呼叫select、poll、epoll這三者中的乙個,程序會阻塞在這裡,而不是阻塞在真正的io操作上。io多路復用的優勢在於可以等待多個描述符就緒。

​與io多路復用密切相關的另一種io模型是在多執行緒中使用阻塞式io,這種模型與上述模型極為相似,但它沒有使用select阻塞在多個檔案描述符上,而是使用多個執行緒(每個檔案描述符乙個執行緒),這樣每個執行緒都可以自由地呼叫阻塞式io函式了。

訊號驅動io

​開啟套接字的訊號驅動io功能,並通過sigaction系統呼叫安裝乙個訊號處理函式。該系統呼叫將立即返回,我們的程序繼續工作,也就是說它沒有被阻塞。當資料報準備好讀取時,核心就為該執行緒產生乙個sigio訊號。我們隨後可以在訊號處理函式中呼叫io函式,並通知主迴圈資料已經準備好待處理,也可以直接通知主迴圈,讓它執行io操作。

非同步io

​非同步io函式的工作機制是:告知核心某個io操作,並讓核心在整個操作(包括資料在使用者和核心緩衝區之間的複製)完成後再通知我們。這種模型與訊號驅動模型的主要區別在於:訊號驅動式io是由核心通知我們何時可以啟動乙個io操作,而非同步io模型是由核心通知我們io操作何時完成。

​在上圖中,我們呼叫aio_read函式,給核心傳遞描述符、緩衝區指標、緩衝區大小和檔案偏移,並告訴核心當整個操作完成時如何通知我們。該系統呼叫立即返回,而且在等待io完成期間,我們的程序不被阻塞。

​值得一提的是linux下主要有兩套非同步io,一套是由glibc基於執行緒和阻塞io實現的,據說效能很差。另一套是有linux核心實現,並由libaio來封裝呼叫介面。

UNIX系統的IO模型

其實並非原創,只是摘錄了stevens的大作 unix網路程式設計 寫下來,一 加深理解和記憶 二 書是借的,記錄一下備忘。感謝臻,借我此書一閱,受益匪淺。阻塞式i o 非阻塞式i o i o復用 訊號驅動式i o 非同步i o 乙個輸入操作通常包括兩個不同的階段 1 等待資料準備好 2 從核心向程...

Unix下五種IO模型簡介

阻塞式io 阻塞式io模型是最一般的io模型。在這種模型下,io函式呼叫 read write等等 都會在操作完成或者發生中斷以後才會返回。如果指定的運算元據沒有就緒,或者操作需要的外部條件 比如緩衝區 尚未符合要求,操作會一直阻塞。非阻塞式io 相對於阻塞式io模型,非阻塞式io的特點就是 當所請...

二 UNIX網路I O模型

二 unix網路i o模型 1 阻塞i o模型 單操作而言 等待資料階段和拷貝資料階段都是阻塞的。2 非阻塞i o模型 單操作而言 等待資料階段是非阻塞的 不讓執行緒休眠 而拷貝資料仍然是阻塞的。可以不斷訪問其狀態 可讀可寫可連線 對成功與失敗馬上作出應對操作。3 i o復用模型 多操作而言 等待資...