詳解unix5種IO模型

2022-06-28 17:18:13 字數 2884 閱讀 8780

unix網路程式設計對io模型進行了分類,共分為5類,要在unix系統的前提下才有效。

5種io模型:

這些io模型的改動的目的是為了提高伺服器能夠並行處理的連線數,而不是提高程式的執行效能。

前提:要搞懂阻塞、非阻塞、同步、非同步。

阻塞、非阻塞、同步、非同步可以看徹底搞懂阻塞、非阻塞、同步、非同步

總得來說:

阻塞/非阻塞是看使用者執行緒在系統呼叫下的處理方式,比如讀取io資料時,要發起系統呼叫切換到核心態,如果此時使用者執行緒掛起,就是阻塞io,如果立即返回,那就是非阻塞io。 主要是看這種情況下使用者執行緒的處理方式。

同步/非同步是看資料準備的結果,同步的話,如果返回,那必定是準備好了資料,如果是非同步的話,返回不一定資料準備好,要等待乙個事件**來處理。

阻塞io:

定義:程序在進行io操作時會掛起,會一直阻塞到核心緩衝區資料準備好並複製到使用者緩衝區之後。

例子:老王去釣魚,把帶有魚餌的釣竿放進水裡後就做在河邊一直盯著,啥也不幹,等到魚上鉤才把魚釣上來放進桶裡。期間什麼也幹不了。

流程解釋:

使用者程序需要進行io操作時,會進行一次系統呼叫,進入到核心態,此時使用者程序被掛起。處於阻塞狀態。此時程序不會再占用cpu資源。

核心進行資料的準備,把需要的資料填充到核心緩衝區。

核心緩衝區資料填充完畢,把資料從核心緩衝區複製到使用者緩衝區。

資料複製完畢,返回,從核心態從新切換到使用者態,程序進入就緒狀態等待cpu執行。

總結:非阻塞io:

使用者程序需要進行io操作時,會進行一次系統呼叫,進入到核心態,如果資料沒有準備好,立即返回ewouldblock。此時不會造成程序阻塞。程序還可以繼續處理其他事情。

程序會輪詢檢視核心資料是否準備好,如果沒有準備好,就繼續立即返回ewouldblock,不阻塞程序。

輪詢到資料準備好了後,進行資料複製,從核心緩衝區複製到使用者緩衝區。在此期間程序會掛起,處於阻塞狀態,知道資料複製完成。

資料複製完畢後返回,程序轉為就緒態,等待cpu排程。

總結:io多路復用:

io多路復用有基於select/poll的對路復用,也有基於epoll的多路復用。

基於select/poll的多路復用:

多個網路io連線可以註冊到乙個復路器select上,然後由乙個程序或者執行緒呼叫該復路器,呼叫該復路器會使得程序或者執行緒掛起,處於阻塞狀態,核心會輪詢監視該復路器上的每乙個連線,一旦有乙個連線的資料準備好了,該select會返回,然後程序或者執行緒退出阻塞狀態,然後該程序或者執行緒會進行系統呼叫,把核心緩衝區的資料複製到使用者緩衝區。

例子:老王去河邊釣魚,不過他有點貪心,一次性使用多個魚竿釣魚(假設10個),然後把十個魚竿放進合理,然後就眼睛不斷從左往右迴圈看每一根魚竿是否有魚上鉤,其中一根魚竿上鉤了,就把魚釣起放進桶裡。

流程說明:

連線到服務程序上的多個套接字連線會註冊到復路器select上。

程序呼叫select系統呼叫。進入核心態,應用程序掛起,核心會對select上的連線進行監視輪詢,監視連線的資料是否準備好。此間程序會處於阻塞狀態。

一旦select復用器上的乙個或者多個連線資料準備好了,select會返回,然後程序會取消阻塞狀態並再發起系統呼叫recvfrom把核心緩衝區的資料複製到使用者緩衝區,此時程序又會被掛起,此時的系統呼叫recvfrom時核心緩衝區資料必定是準備好的。

資料複製完成返回。

與阻塞io的區別:

總結:基於epoll的io多路復用:

回顧基於select/poll的io多路復用缺點:

基於epoll的io多路復用的改進:

例子:老王去河邊釣魚,不過他有點貪心,一次性使用多個魚竿釣魚(假設10個)(不過老王這從使用的是公升級版的魚竿,每根魚竿上綁著乙個小鈴鐺,當有魚上鉤時鈴鐺會響),然後把十個魚竿放進河裡,因為使用了公升級版魚竿,使用老王不用從左到右盯著魚竿,但是也什麼也幹不了,只能那發呆。等到某一根魚竿有魚上鉤,鈴鐺就會響,然後老王就把那根魚竿收桿,把魚放進桶裡。

流程:連線到服務程序上的多個套接字連線會註冊到復路器上。

程序呼叫epoll系統呼叫。進入核心態,應用程序掛起。

一旦復用器上的某個連線資料準備好了,就會通過該連線套接字描述符fd上的**函式通知應用程序並,然後程序會取消阻塞狀態並再發起系統呼叫recvfrom把核心緩衝區的資料複製到使用者緩衝區,此時程序又會被掛起,此時的系統呼叫recvfrom時核心緩衝區資料必定是準備好的。

資料複製完成返回。

基於select/poll的io復用與基於epoll的io復用對比:

訊號驅動:

老王去河邊釣魚,用的公升級版魚竿,放下魚竿後他可以幹其他事,玩遊戲,刷微博等,等聽到鈴鐺響了之後,就把魚放到桶裡。

流程說明:

在socket連線上安裝乙個訊號處理函式,然後程序呼叫sigaction系統呼叫,但是立即返回,程序不用阻塞。繼續執行。

當某個socket的資料準備好了之後,程序會收到乙個sigio訊號,可以在訊號處理函式中呼叫recvfrom進行資料的複製。複製過程中程序阻塞。

複製完成返回。

非同步io:

非同步io是最快的。

應用程序接收到io連線,發起一次aio_read系統呼叫,然後立即返回,程序不阻塞,可以繼續執行。

等待資料準備好。

資料準備好了以後,核心直接把資料從核心緩衝區複製到使用者緩衝區,而無需使用者程序發起系統呼叫再進行複製。

資料複製完以後返回指定訊號給使用者程序,此時資料已經在使用者的緩衝區了,所以使用者程序可以直接在使用者緩衝區拿資料處理。

Unix下5種I O模型

unix下的5中i o模型 阻塞式i o 非阻塞式i o i o復用 select poll 訊號驅動式i o sigio 非同步i o posix的aio 系列函式 乙個輸入操作通常包括兩個不同階段 1 等待資料準備好 2 從核心向程序複製資料 對於套接字上的輸入操作,第一步等待資料從網路中到達,...

Unix下5種I O模型

unix下i o模型主要分為5種 1 阻塞式i o 2 非阻塞式i o 3 i o復用 select和poll 4 訊號驅動式i o 5 非同步i o 1 阻塞式i o模型 unix基本的套接字介面,例如 connect accept read write recv send recvfrom se...

Unix下5種基本的I O模型

unix下5種基本的i o模型 1.阻塞i o 2.非阻塞i o 3.i o復用 select和poll 4.訊號驅動i o sigio 5.非同步i o posix.1的aio 系列函式 unix中乙個輸入操作一般有兩個不同的階段 1.等待資料準備好。2.從核心到程序拷貝資料。對於乙個sockt上...