LINUX下常見的IO模型

2022-09-01 08:54:12 字數 1656 閱讀 7981

前三種都是同步,只有最後一種才是非同步io。

簡介:程序會一直阻塞,直到資料拷貝完成。

應用程式呼叫乙個io函式,導致應用程式阻塞,等待資料準備好。如果資料沒有準備好,一直等待。資料準備好了,從核心拷貝到使用者空間。

執行完畢後,io函式會向應用程式返回成功響應,應用程式得到響應後,就不再阻塞,並進行後面的工作。

網路中io阻塞如下圖所示:

示例:餐廳吃飯,點完餐後,只能坐在餐廳裡面等做好飯,吃完才能去逛商場,中間等待做飯的時間浪費掉了。這就是阻塞。

簡介:非阻塞io通過程序反覆呼叫io函式(多次系統呼叫,並馬上返回);在資料拷貝的過程中,程序是阻塞的。

應用程式呼叫乙個io函式,這個io操作會從核心中立即返回(當io操作無法完成時,返回乙個錯誤)。但是這個io函式具體要執行的事情(寫資料)可能並沒有完成。

而對於應用程式,雖然這個io操作很快就返回了,但是它並不知道這個io操作是否真的成功了。為了知道io操作是否成功,一般有兩種策略:

一是需要應用程式主動地迴圈地去問,直到資料準備好為止,在這個不斷問的過程中,會大量的占用cpu的時間;

二是採用io通知機制,比如:io多路復用或訊號驅動io。

網路io非阻塞如下圖所示:

示例:又想去逛商場,又擔心飯好了。所以逛一會,回來詢問服務員飯好了沒有,來來回回好多次。這就是非阻塞。

簡介:比阻塞io並沒有什麼優越性,關鍵是能實現同時對多個io埠進行監聽。

io復用模型會用到select、poll、epoll函式,這幾個函式也會使程序阻塞,但是和阻塞io所不同的,這兩個函式可以同時阻塞多個io操作。而且可以同時對多個讀操作,多個寫操作的io函式進行檢測,直到有資料可讀或可寫時,才真正呼叫io操作函式。

網路io多路復用如下圖所示:

示例:商場安裝了電子螢幕用來顯示點餐的狀態,這樣飯是否好了,都直接看電子螢幕就可以了。這就是io多路復用。

簡介:告知核心啟動某個操作,並讓核心在整個操作完成後通知我們;資料拷貝的時候程序無需阻塞。

當乙個非同步過程呼叫發出後,呼叫者不能立刻得到結果,實際處理這個呼叫的函式在完成後,通過狀態、通知和**來通知呼叫者的輸入輸出操作。

linux提供了aio庫函式實現非同步,但是用的很少。目前有很多開源的非同步io庫,例如libevent、libev、libuv。

網路非同步io如下圖所示:

示例:叫外賣,只需要打個**說一下,然後可以做自己的事情,飯好了就送來了。這就是非同步。

小結:同步io引起程序阻塞,直至io操作完成。

非同步io不會引起程序阻塞。

io復用是先通過select呼叫阻塞。

阻塞io、非阻塞io、多路復用io都屬於同步io,非同步必定是非阻塞的,所以不存在非同步阻塞和非同步非阻塞的說法。因為其中真正的io操作(函式)都將會阻塞程序,只有非同步io模型真正實現了io操作的非同步性。

http協議整理

php安全之web攻擊

秒殺系統設計優化

mysql優化

Linux下常見的IO模型

前三種都是同步,只有最後一種才是非同步io。簡介 程序會一直阻塞,直到資料拷貝完成。應用程式呼叫乙個io函式,導致應用程式阻塞,等待資料準備好。如果資料沒有準備好,一直等待。資料準備好了,從核心拷貝到使用者空間。執行完畢後,io函式會向應用程式返回成功響應,應用程式得到響應後,就不再阻塞,並進行後面...

linux下的io模型

因為作業系統的資源是有限的,如果訪問資源的操作過多,必然會消耗過多的資源,而且如果不對這些操作加以區分,很可能造成資源訪問的衝突。所以,為了減少有限資源的訪問和使用衝突,unix linux的設計哲學之一就是 對不同的操作賦予不同的執行等級,就是所謂特權的概念。簡單說就是有多大能力做多大的事,與系統...

linux下的IO模型詳解

開門見山,linux下的如中io模型 阻塞io模型,非阻塞io模型,io復用模型,訊號驅動io模型,非同步io模型,見下圖 接下來一一講解這5種模型 阻塞型io 最簡單的一種io模型,簡單理解就是死等,即程序或執行緒一直等待莫格條件,不滿足則一直等待。非阻塞型io 應用程序與核心互動,目的未達到之前...