關於阻塞和非阻塞,同步和異步的總結


1 例子

故事:老王燒開水。

出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。

老王想了想,有好幾種等待方式

1.老王用水壺煮水,並且站在那里,不管水開沒開,每隔一定時間看看水開了沒。-同步阻塞

老王想了想,這種方法不夠聰明。

2.老王還是用水壺煮水,不再傻傻的站在那里看水開,跑去寢室上網,但是還是會每隔一段時間過來看看水開了沒有,水沒有開就走人。-同步非阻塞

老王想了想,現在的方法聰明了些,但是還是不夠好。

3.老王這次使用高大上的響水壺來煮水,站在那里,但是不會再每隔一段時間去看水開,而是等水開了,水壺會自動的通知他。-異步阻塞

老王想了想,不會呀,既然水壺可以通知我,那我為什么還要傻傻的站在那里等呢,嗯,得換個方法。

4.老王還是使用響水壺煮水,跑到客廳上網去,等着響水壺自己把水煮熟了以后通知他。-異步非阻塞

老王豁然,這下感覺輕松了很多。

同步和異步

同步就是燒開水,需要自己去輪詢(每隔一段時間去看看水開了沒),異步就是水開了,然后水壺會通知你水已經開了,你可以回來處理這些開水了。
同步和異步是相對於操作結果來說,會不會等待結果返回。

阻塞和非阻塞

阻塞就是說在煮水的過程中,你不可以去干其他的事情,非阻塞就是在同樣的情況下,可以同時去干其他的事情。阻塞和非阻塞是相對於線程是否被阻塞。

其實,這兩者存在本質的區別,它們的修飾對象是不同的。阻塞和非阻塞是指進程訪問的數據如果尚未就緒,進程是否需要等待,簡單說這相當於函數內部的實現區別,也就是未就緒時是直接返回還是等待就緒。
而同步和異步是指訪問數據的機制,同步一般指主動請求並等待I/O操作完畢的方式,當數據就緒后在讀寫的時候必須阻塞,異步則指主動請求數據后便可以繼續處理其它任務,隨后等待I/O,操作完畢的通知,這可以使進程在數據讀寫時也不阻塞。

例二
小張喜歡喝咖啡,同時養了好多狗;

出場:

  1. 小張:相當於我們的客戶端進程

  2. 小狗大黑:阻塞處理的IO函數

  3. 小狗大黃:非阻塞處理的IO函數

  4. 小狗大白、大紅:異步處理的IO函數

同步阻塞:

小張派大黑去看咖啡煮好沒,大黑等咖啡煮開了才回來;

同步非阻塞:

小張派大黃去看咖啡煮好沒,大黃看了一眼就回來了,過了一會,再大黃再去看看咖啡煮好沒;

異步非阻塞:

小張派大白和大紅去看咖啡煮好沒,大白和大紅到了廚房后,大白就回來告訴小張,大紅已經到廚房啦;過了一會咖啡煮好了,大紅回到客廳告訴小張

異步阻塞:(這個太傻了,目前還沒遇到)

小張派大白和大紅去看咖啡煮好沒,大白和大紅到了廚房后,一起在那等着;過了一會咖啡煮好了,大紅大白一起回到客廳告訴小張

那么采用何種方式,要看小張有沒有養這個類型的狗(系統有沒有相關API),在有的情況下,就看小張個人的需求了(業務需求)

同步與異步
  同步與異步是針對應用程序與內核的交互而言的。同步過程中進程觸發IO操作並等待或者輪詢的去查看IO操作是否完成。異步過程中進程觸發IO操作以后,直接返回,做自己的事情,IO交給內核來處理,完成后內核通知進程IO完成。

阻塞與非阻塞
  應用進程請求I/O操作時,如果數據未准備好,如果請求立即返回就是非阻塞,不立即返回就是阻塞。簡單說就是做一件事如果不能立即獲得返回,需要等待,就是阻塞,否則就可以理解為非阻塞。

知乎回答:

更多參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM