Linux IO模型漫談(2)

2021-09-22 13:42:54 字數 1185 閱讀 3757

不管linux的io模型的阻塞同步分類是如何分類,幾種io模型的具體實現是確定的。這裡借用《unix 網路程式設計:卷一》的說明。

這個模型也是最容易理解的

程式呼叫和我們基本的程式編寫是一致的:

fd = connect()

write(fd)

read(fd)

close(fd)

程式的read必須在write之後執行,當write阻塞住了,read就不能執行下去

從圖中可以看出來,這是乙個輪詢的過程

每次使用者詢問核心是否有資料報準備好(檔案描述符緩衝區是否就緒),當資料報準備好的時候,就進行拷貝資料報的操作。當資料報沒有準備好的時候,也不阻塞程式,核心直接返回未準備就緒的訊號,等待使用者程式的下一次輪詢。

io復用模型是多了乙個select函式,select函式有乙個引數是檔案描述符集合,意思就是對這些的檔案描述符進行迴圈監聽,當某個檔案描述符就緒的時候,就對這個檔案描述符進行處理。

這種io模型是屬於阻塞的io。但是由於它可以對多個檔案描述符進行阻塞監聽,所以它的效率比阻塞io模型高效。

訊號驅動io模型是應用程序告訴核心:當你的資料報準備好的時候,給我傳送乙個訊號哈,並且呼叫我的訊號處理函式來獲取資料報。這個模型是由訊號進行驅動。

非同步io使用的不再是read和write的系統介面了,應用工程式呼叫aio_***x系列的核心介面。

當應用程式呼叫aio_read的時候,核心一方面去取資料報內容返回,另外一方面將程式控制權還給應用程序,應用程序繼續處理其他事務。這樣應用程序就是一種非阻塞的狀態。

當核心的資料報就緒的時候,是由核心將資料報拷貝到應用程序中,返回給aio_read中定義好的函式處理程式。

Linux IO模型漫談(2)

不管linux的io模型的阻塞同步分類是如何分類,幾種io模型的具體實現是確定的。這裡借用 unix 網路程式設計 卷一 的說明。這個模型也是最容易理解的 程式呼叫和我們基本的程式編寫是一致的 fd connect write fd read fd close fd 程式的read必須在write之...

Linux IO模型漫談(2)

不管linux的io模型的阻塞同步分類是如何分類,幾種io模型的具體實現是確定的。這裡借用 unix 網路程式設計 卷一 的說明。這個模型也是最容易理解的 程式呼叫和我們基本的程式編寫是一致的 fd connect write fd read fd close fd 程式的read必須在write之...

Linux IO模型漫談(1)

linux將所有外部裝置都看做乙個檔案來進行操作。因此,linux對所有外部裝置的操作都可以看做是檔案的操作。檔案的操作當然需要有個標示描述它,這就是檔案描述符 file descriptor 我們說網路socket的read 是乙個io操作命令,具體流程是這樣的 應用程式呼叫read命令,通知核心...