再談同步 非同步 阻塞 非阻塞

2021-08-13 14:44:04 字數 2104 閱讀 9941

原創 2023年04月24日 16:13:35

同步、非同步、阻塞、非阻塞的概念一直是計算機學科中很重要的概念,而這種細微的差別常常被大家混淆,我自己在過一段時間後也需要複習。今天再次翻出這個概念,仍然覺得不夠清晰,今天再次深入了解了這四大天王。

以前轉過一篇部落格:

但是始終太抽象,每次都要重頭看,其次,這篇文章仍然沒有很清晰的表達四大天王的特色,因此這裡給出自己的分析:

一、乙個有問題,但有趣的例子

在網上看到乙個有趣的例子,雖然我認為他的表述仍然是有問題的,但是有助於我們的理解:

老張愛喝茶,廢話不說,煮開水。

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

1 老張把水壺放到火上,立等水開。(同步阻塞)

老張覺得自己有點傻

2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)

老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀~~~~的噪音。

3 老張把響水壺放到火上,立等水開。(非同步阻塞)

老張覺得這樣傻等意義不大

4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(非同步非阻塞)

老張覺得自己聰明了。

所謂同步非同步,只是對於水壺而言。

普通水壺,同步;響水壺,非同步。

雖然都能幹活,但響水壺可以在自己完工之後,提示老張水開了。這是普通水壺所不能及的。

同步只能讓呼叫者去輪詢自己(情況2中),造成老張效率的低下。

所謂阻塞非阻塞,僅僅對於老張而言。

立等的老張,阻塞;看電視的老張,非阻塞。

情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是非同步的,可對於立等的老張沒有太大的意義。所以一般非同步是配合非阻塞使用的,這樣才能發揮非同步的效用。

二、上述例子的問題和理論分析

上面的例子很形象吧?可以我認為他是有問題的,問題在**呢?

先給出三張不同模式下的系統互動圖:

a、同步阻塞模式

b、同步非阻塞模式

c、非同步非阻塞模式

好的,看完這三個圖,你應該在想,這是什麼鬼,不想看了。再聽我囉嗦2句,你就可以跳到下面看小張和狗狗的故事了。

從上面的圖可以看出來,其實不管是任何模式,核心的處理方式都是一樣的,都是

1. wait for data(等待資料);

2. copy data from kernel to user(拷貝資料到使用者層)。

而產生這三種模式的差別在於中間使用的api函式不同。

這和上面的小故事可是有一些差別的。上面的例子中,小張相當於我們的應用程式,而響水壺和普通水壺相當於核心。這就有問題了,其實我們的核心都是相同的,並不存在響水壺和普通水壺的差別,那麼怎麼樣描述才正確呢?

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

出場:1. 小張:相當於我們的客戶端程序

2. 小狗大黑:阻塞處理的io函式

3. 小狗大黃:非阻塞處理的io函式

4. 小狗大白、大紅:非同步處理的io函式

同步阻塞:

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

同步非阻塞:

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

非同步非阻塞:

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

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

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

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

**

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

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

同步 非同步 阻塞 非阻塞

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

同步 非同步 阻塞 非阻塞

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