多路復用及同步 非同步和阻塞 非阻塞

2021-06-18 18:28:43 字數 1367 閱讀 3866

今天查詢了很多關於多路復用之類的資料,特淺陋整理一下,有助於記憶。

其實這些概念都僅僅是實踐中的概念而已,沒必要理論是的加以定義,但也要是自己弄清楚,才能明確這些術語的應用場景。

1、同步和非同步i/o

弄清這些概念,先從reactor和proactor這兩個模式說起,網上的介紹很多,自己也沒有什麼時間仔細的分析、學習具體的模式內容和**,這裡只是講講他們的共同點和不同點。

共同點:依賴於event demultiplexer,i/o事件發生後都需要callback handler;

不同點:reactor callback handler說明i/o就緒,可以進行相關操作(read/write),由相關處理器來完成實際操作,這就是同步i/o

proactor callback handler說明i/o已經完成相關操作,處理器不需要再操心i/o的read或write了,這就是非同步i/o

2、明確了同步和非同步i/o如何劃分之後,然後要搞清楚什麼是 多路復用,這裡又涉及到阻塞和非阻塞等。

使用者應用程式/使用者程序

(2)阻塞和非阻塞是針對於程序在訪問資料的時候,根據io操作的就緒狀態來採取的不同方式,說白了是一種讀取或者寫入操作函式的實現方式,阻塞方式下讀取或者寫入函式將一直等待,而非阻塞方式下,讀取或者寫入函式會立即返回乙個狀態值。

阻塞式非阻塞式

(4)以下引自

i/o multiplexing (select and poll)

最常見的i/o復用模型,select。

(注:為什麼沒有輪詢呢?struct timeval *timeout是select的超時時間,這個引數至關重要,它可以使select處於三種狀態,第一,若將null以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視檔案描述符集合中某個檔案描述符發生變化為止;第二,若將時間值設為0秒0毫秒,就變成乙個純粹的非阻塞函式,不管檔案描述符是否有變化,都立刻返回繼續執行,檔案無變化返回0,有變化返回乙個正值;第三,timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。)

signal driven i/o (sigio)

只有unix系統支援,感興趣的課查閱相關資料

asynchronous i/o (the posix aio_functions)

很少有*nix系統支援,windows的iocp則是此模型

下面是以上五種模型的比較

非同步 非阻塞和IO多路復用總結

nginx是併發處理框架的代表者,很多後台業務都會放在nginx容器中執行,以實現高吞吐,而nginx能夠支援高併發也是由於使用了非同步非阻塞處理模型,本文將用通俗的話講解非同步 同步 阻塞 非阻塞的區別,以及io多路復用。一 同步和非同步 同步與非同步的重點是在訊息通知的方式上,也就是呼叫後結果通...

同步 非同步 阻塞和非阻塞

同步 非同步 阻塞和非阻塞 在進行windowsapi winsock 網路程式設計時,我們常常見到同步 非同步 阻塞和非阻塞四種呼叫方式。這些方式其實都可以擴充套件為廣義的概念,幫助我們理解多執行緒,多程序,實時作業系統等更廣的概念。同步 synchronic 所謂同步,就是在發出乙個功能呼叫時,...

同步 非同步 阻塞和非阻塞

在進行網路程式設計時,我們常常見到同步 非同步 阻塞和非阻塞四種呼叫方式。這些方式彼此概念並不好理解。所謂同步,就是在發出乙個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。按照這個定義,其實絕大多數函式都是同步呼叫 例如sin,isdigit等 但是一般而言,我們在說同步 非同步的時候,特指那些需...