Unix IO 同步,非同步,阻塞,非阻塞 筆記篇

2022-08-22 07:36:10 字數 1462 閱讀 9166

同步是需要主動等待訊息通知,而非同步則是被動接收訊息通知,通過**、通知、狀態等方式來被動獲取訊息。io多路復用在阻塞到select階段時,使用者程序是主動等待並呼叫select函式獲取資料就緒狀態訊息,並且其程序狀態為阻塞。所以,把io多路復用歸為同步阻塞模式。

i/o多路復用就是通過一種機制,乙個程序可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,pselect,poll,epoll本質上都是同步i/o,因為他們都需要在讀寫事件就緒後自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而非同步i/o則無需自己負責進行讀寫,非同步i/o的實現會負責把資料從核心拷貝到使用者空間。

來自netty權威指南

之前所述的blocking io,non-blocking io,io multiplexing都屬於synchronous io。

synchronous io:當kernel中資料準備好的時候,recvfrom會將資料從kernel拷貝到使用者記憶體中,這個時候程序是被block了,在這段時間內,程序是被block的。

asynchronous io:則不一樣,當程序發起io 操作之後,就直接返回再也不理睬了,直到kernel傳送乙個訊號,告訴程序說io完成。在這整個過程中,程序完全沒有被block。

最後,再舉幾個不是很恰當的例子來說明這四個io model:

有a,b,c,d四個人在釣魚:

blocking io: a用的是最老式的魚竿,所以呢,得一直守著,等到魚上鉤了再拉桿;

nonblocking io: b的魚竿有個功能,能夠顯示是否有魚上鉤,所以呢,b就和旁邊的mm聊天,隔會再看看有沒有魚上鉤,有的話就迅速拉桿;

io multiplexing: c用的魚竿和b差不多,但他想了乙個好辦法,就是同時放好幾根魚竿,然後守在旁邊,一旦有顯示說魚上鉤了,它就將對應的魚竿拉起來;

asynchronous io: d是個有錢人,乾脆僱了乙個人幫他釣魚,一旦那個人把魚釣上來了,就給d發個簡訊。

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

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

同步 非同步 阻塞 非阻塞

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

同步 非同步 阻塞 非阻塞

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