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模型的判斷分類上,推薦這一種判斷:
<a href="http://www.360doc.com/content/12/0426/15/507289_206688978.shtml">關于io的同步、異步、阻塞、非阻塞</a>