非同步同步阻塞非阻塞

2021-09-28 18:15:29 字數 2454 閱讀 1493

在平常學習的時候經常會看見同步非同步、阻塞非阻塞這些東西,之前有大概的了解了一下,但是有些概念還是感覺很混淆,所以這裡特地花了一點時間梳理總結一下。

這裡主要是用unp當中的幾個io模型解釋,分別是

阻塞io,blocking io

非阻塞io,noneblocking io

io多路復用,io multiplexing

非同步io,asynchronous io

其中還有一種叫做「訊號驅動式io」,但好像不是很常用,我也不是很清楚,所以就沒寫了。

這裡先說一下io在發生時先涉及到的物件和步驟:

物件:

呼叫這個io的程序

系統核心

步驟:

資料準備

資料從核心拷貝到呼叫程序

當乙個io請求發生的時候,呼叫程序向核心傳送請求,核心接收到請求後,會根據請求的io資料向相關io裝置發起請求,當io裝置把資料準備好給核心時,核心再把資料拷貝給呼叫程序。

接下來的各種模型我們主要看著兩個步驟的狀態。

首先是blocking io ,在這個模型中,當使用者程序呼叫了recvfrom,kernel收到訊息後,就開始準備資料,在這個「wait for data」過程中,程序一直處於乙個block的狀態,也就是說除了等待其他什麼也沒在做。當資料準備完畢的時候,核心將進行「copy data from kernel to user」這一步,執行完畢後返回給呼叫程序訊息,當使用者程序收到訊息後就接觸block狀態。我們不難發現,在這兩個過程中,呼叫程序都處於block狀態。

對於nonblocking io模型,當使用者程序呼叫recvfrom後,即使這個時候核心還沒有準備好資料,也會立馬返回乙個資訊。也就是說,在呼叫程序發起乙個system call後即可馬上獲得回應。在「wait for data」這個過程中,呼叫程序不必一直等待,可以去做其他的事情,但是每隔一定時間就會主動向核心傳送訊息進行確認資料是否準備完畢,如果資料準備好了,那麼就會和blocking io 模型一樣進行資料的拷貝,在這個過程中,呼叫程序一樣會處於block狀態,直到資料拷貝完成核心返回結果才解除block。相比於blocking io,這裡的主要區別就是呼叫程序會一直不斷的主動詢問核心資料準備好沒有。

接下來要講的是io復用模型,從圖上看,不難發現這和blocking io模型有點相似,因為在兩個過程中呼叫程序都處於block狀態,但其實這兩者最大的區別就是io復用模型可以處理多個連線。當使用者程序呼叫select的時候,使用者就會被block,同時核心開始監聽所有select負責的socket,如果有任意乙個socket資料準備完畢,那麼就返回給呼叫程序乙個訊息,然後呼叫程序就可以再進行read操作。

然後就是最後的非同步io模型,在這種模型中,我們可以清楚的看見,當程序發起了呼叫後,如果kernel此時資料沒準備好,也會立刻返回給呼叫程序乙個訊息,因此程序不必「傻傻的」一直等待。當資料準備好並從kernel拷貝完成時,kernel會向之前呼叫的相關程序傳送乙個訊號進行提醒,這樣程序就可以直接接受資料了。而在這中間的時間程序可以去幹其他它想做的事情。

這裡有一張關於幾種不同io模型的比較,根據我們之前定義的兩個步驟來看的話,我們能夠發現,只有asynchronous io是屬於非同步io,其他的在wait或者copy階段都會有阻塞發生。

根據上面的幾種比較,我們可以大概明白了:

阻塞與非阻塞io呼叫:

同步與非同步:

同步:雙方的動作需要經過雙方的協調才可以,步調應該盡量保持一致;

非同步:不需要協調,各自做各自的工作。

這裡有關於同步非同步,阻塞非阻塞比較好的簡單總結:

同步非同步關注的是:訊息同步機制

阻塞非阻塞關注的是:程式在等待呼叫結果(訊息、狀態值)時的狀態。

量保持一致;

非同步:不需要協調,各自做各自的工作。

這裡有關於同步非同步,阻塞非阻塞比較好的簡單總結:

同步非同步關注的是:訊息同步機制

阻塞非阻塞關注的是:程式在等待呼叫結果(訊息、狀態值)時的狀態。

阻塞,非阻塞,非同步,同步

之前一直對這個概念理不太清楚,今天看到一篇文章感覺不錯 本文 老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通 水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻...

同步 非同步 阻塞 非阻塞

故事 老王燒開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 老王想了想,有好幾種等待方式 1.老王用水壺煮水,並且站在那裡,不管水開沒開,每隔一定時間看看水開了沒。同步阻塞 老王想了想,這種方法不夠聰明。2.老王還是用水壺煮水,不再傻傻的站在那裡看水開,跑去寢室上網,但是...

同步 非同步 阻塞 非阻塞

故事 老王燒開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 老王想了想,有好幾種等待方式 1.老王用水壺煮水,並且站在那裡,不管水開沒開,每隔一定時間看看水開了沒。同步阻塞 老王想了想,這種方法不夠聰明。2.老王還是用水壺煮水,不再傻傻的站在那裡看水開,跑去寢室上網,但是...