非同步 同步 阻塞 非阻塞

2021-09-06 12:32:17 字數 1311 閱讀 6058

首先說明我對這些概念也不是很清楚,以下內容是我做的一些理事。

同步和非同步、阻塞和非阻塞這是兩組概念,說的是不同的事情,同步和阻塞沒有必然的聯絡,非同步和非阻塞也沒有必然的聯絡。同步和非同步是只跟io操作過程中程序的狀態變化有關。阻塞和非阻塞就是程序的兩種狀態。比如你去銀行,排除的話就是一種同步的方式,叫號的話就是非同步的方式。排隊必須自己看著什麼時候輪到自己,而叫號則不必,輪到你的時候會觸發乙個事件,或者說你會收到乙個訊號,別人會叫你。不管是排除還是叫號,如果你在等待的過程中不能做其他事情,那就是阻塞模式,否則就是非阻塞模式。同步的時候可以有阻塞和非阻塞,非同步的時候也可以有阻塞和非阻塞。

linux下的i/o操作預設是阻塞i/o,即open和socket建立的i/o都是阻塞i/o。當讀寫操作沒有完成時,函式就不會返回,程序一直阻塞在那裡。

非阻塞模式的使用並不普遍,因為非阻塞模式會浪費大量的cpu資源。

網路程式設計時listen,recvfrom,connect都會引起阻塞。非阻塞io通常應用於網路程式設計中,io請求時加上o_nonblock一類的標誌位,函式立刻返回,io沒有就緒會返回錯誤,需要請求程序主動輪詢不斷發io請求直到返回正確

比如呼叫recvfrom時,如果系統還沒有接收到網路資料,核心馬上返回乙個 ewouldblock的錯誤。

當乙個應用程式使用了非阻塞模式的套接字,它需要使用乙個迴圈來不停地測試是否乙個檔案描述符有資料可讀(稱做 polling(輪詢))。應用程式不停的 polling 核心來檢查是否 i/o操作已經就緒。這將是乙個極浪費 cpu資源的操作。這種模式使用中不是很普遍。

針對批量ip操作時,使用i/o多路復用,非常有好。

在使用 i/o 多路技術的時候,我們呼叫 select()函式和 poll()函式或epoll函式(2.6核心開始支援),在呼叫它們的時候阻塞。

當我們呼叫 select函式阻塞的時候,select 函式等待資料報套接字進入讀就緒狀態。當select函式返回的時候, 也就是套接字可以讀取資料的時候。 這時候我們就可以呼叫 recvfrom函式來將資料拷貝到我們的程式緩衝區中。

io復用同非阻塞io本質一樣,不過利用了新的select系統呼叫,由核心來負責本來是請求程序該做的輪詢操作。看似比非阻塞io還多了乙個系統呼叫開銷,不過因為可以支援多路io,才算提高了效率。多路復用的高階之處在於:它能同時等待多個檔案描述符,而這些檔案描述符(套接字描述符)其中的任意乙個進入讀就緒狀態,select()函式就可以返回。

當我們執行在非同步 i/o 模式下時,我們如果想進行 i/o 操作,只需要告訴核心我們要進行 i/o 操作,然後核心會馬上返回。具體的 i/o 和資料的拷貝全部由核心來完成,我們的程式可以繼續向下執行。當核心完成所有的 i/o 操作和資料拷貝後,核心將通知我們的程式。

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

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

同步 非同步 阻塞 非阻塞

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

同步 非同步 阻塞 非阻塞

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