1 例子
故事:老王燒開水。
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
老王想了想,有好幾種等待方式
1.老王用水壺煮水,並且站在那里,不管水開沒開,每隔一定時間看看水開了沒。-同步阻塞
老王想了想,這種方法不夠聰明。
2.老王還是用水壺煮水,不再傻傻的站在那里看水開,跑去寢室上網,但是還是會每隔一段時間過來看看水開了沒有,水沒有開就走人。-同步非阻塞
老王想了想,現在的方法聰明了些,但是還是不夠好。
3.老王這次使用高大上的響水壺來煮水,站在那里,但是不會再每隔一段時間去看水開,而是等水開了,水壺會自動的通知他。-異步阻塞
老王想了想,不會呀,既然水壺可以通知我,那我為什么還要傻傻的站在那里等呢,嗯,得換個方法。
4.老王還是使用響水壺煮水,跑到客廳上網去,等着響水壺自己把水煮熟了以后通知他。-異步非阻塞
老王豁然,這下感覺輕松了很多。
同步和異步
同步就是燒開水,需要自己去輪詢(每隔一段時間去看看水開了沒),異步就是水開了,然后水壺會通知你水已經開了,你可以回來處理這些開水了。
同步和異步是相對於操作結果來說,會不會等待結果返回。
阻塞和非阻塞
阻塞就是說在煮水的過程中,你不可以去干其他的事情,非阻塞就是在同樣的情況下,可以同時去干其他的事情。阻塞和非阻塞是相對於線程是否被阻塞。
其實,這兩者存在本質的區別,它們的修飾對象是不同的。阻塞和非阻塞是指進程訪問的數據如果尚未就緒,進程是否需要等待,簡單說這相當於函數內部的實現區別,也就是未就緒時是直接返回還是等待就緒。
而同步和異步是指訪問數據的機制,同步一般指主動請求並等待I/O操作完畢的方式,當數據就緒后在讀寫的時候必須阻塞,異步則指主動請求數據后便可以繼續處理其它任務,隨后等待I/O,操作完畢的通知,這可以使進程在數據讀寫時也不阻塞。
例二
小張喜歡喝咖啡,同時養了好多狗;
出場:
-
小張:相當於我們的客戶端進程
-
小狗大黑:阻塞處理的IO函數
-
小狗大黃:非阻塞處理的IO函數
-
小狗大白、大紅:異步處理的IO函數
同步阻塞:
小張派大黑去看咖啡煮好沒,大黑等咖啡煮開了才回來;
同步非阻塞:
小張派大黃去看咖啡煮好沒,大黃看了一眼就回來了,過了一會,再大黃再去看看咖啡煮好沒;
異步非阻塞:
小張派大白和大紅去看咖啡煮好沒,大白和大紅到了廚房后,大白就回來告訴小張,大紅已經到廚房啦;過了一會咖啡煮好了,大紅回到客廳告訴小張
異步阻塞:(這個太傻了,目前還沒遇到)
小張派大白和大紅去看咖啡煮好沒,大白和大紅到了廚房后,一起在那等着;過了一會咖啡煮好了,大紅大白一起回到客廳告訴小張
那么采用何種方式,要看小張有沒有養這個類型的狗(系統有沒有相關API),在有的情況下,就看小張個人的需求了(業務需求)
同步與異步
同步與異步是針對應用程序與內核的交互而言的。同步過程中進程觸發IO操作並等待或者輪詢的去查看IO操作是否完成。異步過程中進程觸發IO操作以后,直接返回,做自己的事情,IO交給內核來處理,完成后內核通知進程IO完成。
阻塞與非阻塞
應用進程請求I/O操作時,如果數據未准備好,如果請求立即返回就是非阻塞,不立即返回就是阻塞。簡單說就是做一件事如果不能立即獲得返回,需要等待,就是阻塞,否則就可以理解為非阻塞。
知乎回答: