同步 非同步 阻塞 非阻塞 併發 並行

2022-09-09 23:33:30 字數 3476 閱讀 8417

乙個小故事

故事:小a燒開水。

出場人物:小a

出場道具:普通水壺(放在煤氣灶上的那種,為了方便簡稱:水壺);會響的水壺(水燒開了會響的那種,簡稱:響壺)。

故事目的:小a要拿開水泡咖啡

小a為了實現目的,指定了4個計畫:

1、用水壺燒水,並且站在煤氣灶旁邊,啥事不幹,兩眼直勾勾的盯著水壺,等水燒開。燒開後就去泡咖啡。-同步阻塞

假設燒水和泡咖啡是在同乙個執行緒中執行。

2、仍然用水壺煮水,不過此時不再傻傻得站在那裡看水開沒開,而是去玩局lol,每當自己死了,就過來看看水開了沒有。如果水開了就去泡咖啡。-同步非阻塞

假設這裡玩lol,是另乙個執行緒執行的。

3、動用響壺燒水,仍然站在煤氣灶旁邊,不過此時不兩眼直勾勾的盯著壺了,而是聽響,因為響壺水開時會用響聲通知小a。-非同步阻塞

4、在計畫3的基礎上,小a不站在煤氣灶旁邊了,而是去玩局lol,等聽到響壺的聲音提醒後,再去跑咖啡。-非同步非阻塞

有了上邊的故事鋪墊,我們再來看一看概念

同步:

同步這個詞在很多場合下都會被使用,如果單從字面意思來看:相同的步驟。但是在程式設計的領域裡講,字面意思就不那麼準確了。

對於程式設計領域來說,同步就是發起乙個請求,直到請求返回結果之後,才進行下一步操作。簡單來說,同步就是必須一件事一件事的做,等前一件做完了,才能做下一件事。

例子:此種模式很常見,比如我發起乙個網路請求查詢乙個人的身份證,然後根據身份證檢視這個人的詳細資訊。那麼我查詢詳細資訊的操作需要等待查詢身份證的操作,那麼此時查詢身份證的操作就是乙個同步操作。

非同步:非同步很明顯是與同步相對,二者的區別在於是否需要等待某操作的返回結果。簡單來說,我們還是乙個網路請求,如果我們此時不需要依賴這個請求的結果就能進行後續操作,那麼此時這個網路請求就是乙個非同步操作。

當乙個非同步操作發出後,呼叫者在沒有得到結果之前,可以繼續執行後續操作。這就是非同步。

同步和非同步的區別:

二者的區別還是很明顯的:請求發出後,是否需要等待請求結果,才能繼續執行其他操作。

阻塞

阻塞的概念往往伴隨這執行緒。阻塞一般是指:在呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會被喚醒執行後續的操作。

非阻塞那麼非阻塞,毫無疑問是阻塞的反向操作。非阻塞式的呼叫指:在結果沒有返回之前,該呼叫不會阻塞住當前執行緒。

是不是感覺阻塞/非阻塞和同步/非同步有異曲同工的地方?

其實,這兩者存在本質的區別,面向的物件是不同的。

- 阻塞/非阻塞:程序/執行緒需要操作的資料如果尚未就緒,是否妨礙了當前程序/執行緒的後續操作。

併發和並行

二者的區分度非常的高,就在於四個字:是否同時。

併發:當有多個執行緒在操作時,如果系統只有乙個cpu,作業系統只能把cpu執行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行,在乙個時間段的快速的切換不同的執行緒**執行。

並行:當系統有多個cpu時,可以存在當乙個cpu執行乙個執行緒時,另乙個cpu可以執行另乙個執行緒,兩個執行緒互不搶占cpu資源,可以同時進行。

舉個小例子

小a吃飯吃到一半,**來了,小a一直到吃完了以後才去接。即不支援併發也不支援並行

小a吃飯吃到一半,**來了,小a停了下來接了**,接完後繼續吃飯。支援併發

小a吃飯吃到一半,**來了,小a一邊打**一邊吃飯。支援並行

一切的開始,讓我們從乙個小故事出發:(故事靈感來自網際網路)

乙個小故事

故事:小a燒開水。

出場人物:小a

出場道具:普通水壺(放在煤氣灶上的那種,為了方便簡稱:水壺);會響的水壺(水燒開了會響的那種,簡稱:響壺)。

故事目的:小a要拿開水泡咖啡

小a為了實現目的,指定了4個計畫:

1、用水壺燒水,並且站在煤氣灶旁邊,啥事不幹,兩眼直勾勾的盯著水壺,等水燒開。燒開後就去泡咖啡。-同步阻塞

假設燒水和泡咖啡是在同乙個執行緒中執行。

2、仍然用水壺煮水,不過此時不再傻傻得站在那裡看水開沒開,而是去玩局lol,每當自己死了,就過來看看水開了沒有。如果水開了就去泡咖啡。-同步非阻塞

假設這裡玩lol,是另乙個執行緒執行的。

3、動用響壺燒水,仍然站在煤氣灶旁邊,不過此時不兩眼直勾勾的盯著壺了,而是聽響,因為響壺水開時會用響聲通知小a。-非同步阻塞

4、在計畫3的基礎上,小a不站在煤氣灶旁邊了,而是去玩局lol,等聽到響壺的聲音提醒後,再去跑咖啡。-非同步非阻塞

有了上邊的故事鋪墊,我們再來看一看概念

同步:

同步這個詞在很多場合下都會被使用,如果單從字面意思來看:相同的步驟。但是在程式設計的領域裡講,字面意思就不那麼準確了。

對於程式設計領域來說,同步就是發起乙個請求,直到請求返回結果之後,才進行下一步操作。簡單來說,同步就是必須一件事一件事的做,等前一件做完了,才能做下一件事。

例子:此種模式很常見,比如我發起乙個網路請求查詢乙個人的身份證,然後根據身份證檢視這個人的詳細資訊。那麼我查詢詳細資訊的操作需要等待查詢身份證的操作,那麼此時查詢身份證的操作就是乙個同步操作。

非同步:非同步很明顯是與同步相對,二者的區別在於是否需要等待某操作的返回結果。簡單來說,我們還是乙個網路請求,如果我們此時不需要依賴這個請求的結果就能進行後續操作,那麼此時這個網路請求就是乙個非同步操作。

當乙個非同步操作發出後,呼叫者在沒有得到結果之前,可以繼續執行後續操作。這就是非同步。

同步和非同步的區別:

二者的區別還是很明顯的:請求發出後,是否需要等待請求結果,才能繼續執行其他操作。

阻塞

阻塞的概念往往伴隨這執行緒。阻塞一般是指:在呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會被喚醒執行後續的操作。

非阻塞那麼非阻塞,毫無疑問是阻塞的反向操作。非阻塞式的呼叫指:在結果沒有返回之前,該呼叫不會阻塞住當前執行緒。

是不是感覺阻塞/非阻塞和同步/非同步有異曲同工的地方?

其實,這兩者存在本質的區別,面向的物件是不同的。

- 阻塞/非阻塞:程序/執行緒需要操作的資料如果尚未就緒,是否妨礙了當前程序/執行緒的後續操作。

併發和並行

二者的區分度非常的高,就在於四個字:是否同時。

併發:當有多個執行緒在操作時,如果系統只有乙個cpu,作業系統只能把cpu執行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行,在乙個時間段的快速的切換不同的執行緒**執行。

並行:當系統有多個cpu時,可以存在當乙個cpu執行乙個執行緒時,另乙個cpu可以執行另乙個執行緒,兩個執行緒互不搶占cpu資源,可以同時進行。

舉個小例子

小a吃飯吃到一半,**來了,小a一直到吃完了以後才去接。即不支援併發也不支援並行

小a吃飯吃到一半,**來了,小a停了下來接了**,接完後繼續吃飯。支援併發

小a吃飯吃到一半,**來了,小a一邊打**一邊吃飯。支援並行

同步非同步?阻塞非阻塞?併發並行?

阻塞呼叫是指呼叫結果返回之前,呼叫者會進入阻塞狀態等待。只有在得到結果之後才會返回。非阻塞呼叫是指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。同步 在發出乙個同步呼叫時,在沒有得到結果之前,該呼叫就不返回。非同步 在發出乙個非同步呼叫後,呼叫者不會立刻得到結果,該呼叫就返回了。同...

併發 並行,阻塞 非阻塞,同步 非同步

1.阻塞,非阻塞 乙個執行緒 程序經歷的5個狀態,建立,就緒,執行,阻塞,終止。各個狀態的轉換條件如上圖,其中有個阻塞狀態,就是說當執行緒中呼叫某個函式,需要io請求,或者暫時得不到競爭資源的,作業系統會把該執行緒阻塞起來,避免浪費cpu資源,等到得到了資源,再變成就緒狀態,等待cpu排程執行。定義...

同步 非同步 阻塞 非阻塞 併發 並行

同步和非同步關注的是訊息通訊機制 synchronous communication asynchronous communication 所謂同步,就是在發出乙個呼叫時,在沒有得到結果之前,該呼叫就不返回。但是一旦呼叫返回,就得到返回值了。換句話說,就是由呼叫者主動等待這個呼叫的結果。而非同步則是...