Linux IO模型漫談(1)

2021-09-22 13:42:54 字數 973 閱讀 1897

linux將所有外部裝置都看做乙個檔案來進行操作。因此,linux對所有外部裝置的操作都可以看做是檔案的操作。檔案的操作當然需要有個標示描述它,這就是檔案描述符(file descriptor)。

我們說網路socket的read()是乙個io操作命令,具體流程是這樣的:

應用程式呼叫read命令,通知核心需要做讀取資料操作

核心建立乙個檔案描述符

核心從物理層收到讀資料的命令,從網路中獲取資料報

資料報傳遞到tcp/ip層,解析資料報的頭

核心將資料報快取在檔案描述符的讀快取區(接受快取區)中,注意這裡的讀快取區是在核心中的

當檔案描述符讀快取區資料位元組數大於應用程式定義的低水位的時候(read的乙個引數),此時檔案描述符處於讀就緒的狀態

將讀快取區中的資料複製到應用程式(使用者區)返回

這裡需要說明的是

1 每個檔案描述符都有自己的讀緩衝區和寫緩衝區,讀緩衝區對應的是read操作,寫緩衝區對應的就是write操作了

2 讀緩衝區和寫緩衝區都是在核心區中

現有的linux io模型有5種:

阻塞式io模型,非阻塞式io模型,io復用模型,訊號驅動式io模型,非同步io模型

經常弄不清楚的就是阻塞,非阻塞,非同步,同步

說明一下

上圖給出的同步非同步標準是:資料描述符快取是由誰來進行讀取的?由使用者程式讀取,則判斷為同步;由核心推送,判斷為非同步

上圖給出的阻塞非阻塞標準是:呼叫的使用者程序是否是阻塞的狀態

這裡關於這五種io模型的阻塞同步狀態有很多種說法,比較有爭議的是io復用模型和訊號驅動io模型的判斷分類上,推薦這一種判斷:

關於io的同步、非同步、阻塞、非阻塞

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模型漫談(2)

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