1. 程式人生 > >程序和執行緒、併發和並行、同步和非同步

程序和執行緒、併發和並行、同步和非同步

作業系統有三大特性:

1.併發  2.共享  3.非同步

1.談到併發,就不得不提序列和並行了。這三點容易混淆。

如下圖所示,

序列:一個時間段內,執行一個任務的同時不能執行其他任務,只能等到第一個任務完成後才能進行第二個。

並行:一個時間段內有多個任務,可以同時執行兩個或多個任務。

併發:一個時間段中有幾個任務都處於已啟動執行到執行完畢之間,且這幾個任務都是在同一個處理機上執行,但任一個時刻點上只有一個程式在處理機上執行。

他們之間的區別:

你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。

你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支援併發。

你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援並行。

併發的關鍵是你有處理多個任務的能力,不一定要同時。

並行的關鍵是你有同時處理多個任務的能力。

所以它們最關鍵的點就是:是否是『同時』。


2.其次是共享:系統中的資源可供多個併發的程序共同使用。

兩種共享方式:互斥共享方式和同時訪問方式。

3.同步和非同步

同步:所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。

非同步:非同步的概念和同步相對。當一個非同步過程呼叫發出後,呼叫者不能立刻得到結果。實際處理這個呼叫的部件在完成後,通過狀態、通知和回撥來通知呼叫者。

這裡提一下阻塞和非阻塞的概念:

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。


非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。

知乎上大牛的解釋:(怎樣理解阻塞非阻塞與同步非同步的區別? - 嚴肅的回答 - 知乎https://www.zhihu.com/question/19732473/answer/20851256)


“阻塞”與"非阻塞"與"同步"與“非同步"不能簡單的從字面理解,提供一個從分散式系統角度的回答。
1.同步與非同步
同步和非同步關注的是訊息通訊機制(synchronous communication/ asynchronous communication)
所謂同步,就是在發出一個*呼叫*時,在沒有得到結果之前,該*呼叫*就不返回。但是一旦呼叫返回,就得到返回值了。
換句話說,就是由*呼叫者*主動等待這個*呼叫*的結果。

而非同步則是相反,*呼叫*在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在*呼叫*發出後,*被呼叫者*通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。

典型的非同步程式設計模型比如Node.js

舉個通俗的例子:
你打電話問書店老闆有沒有《分散式系統》這本書,如果是同步通訊機制,書店老闆會說,你稍等,”我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。
而非同步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裡老闆通過“回電”這種方式來回調。

2. 阻塞與非阻塞
阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。

還是上面的例子,
你打電話問書店老闆有沒有《分散式系統》這本書,你如果是阻塞式呼叫,你會一直把自己“掛起”,直到得到這本書有沒有的結果,如果是非阻塞式呼叫,你不管老闆有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老闆有沒有返回結果。
在這裡阻塞與非阻塞與是否同步非同步無關。跟老闆通過什麼方式回答你結果無關。

先說一下程序和執行緒的概念:(此處參考:https://www.cnblogs.com/zhang-can/p/7215506.html)

程序:

計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。程序由程式,資料集,程序控制塊三部分組成。程式用來描述程序哪些功能以及如何完成;資料集是程式執行過程中所使用的資源;程序控制塊用來儲存程式執行的狀態。

我們電腦的應用程式,都是程序,假設我們用的電腦是單核的,cpu同時只能執行一個程序。當程式處於I/O阻塞的時候,cpu如果和程式一起等待,那就太浪費了,cpu會去執行其他的程式,此時就涉及到切換,切換前要儲存上一個程式執行的狀態,才能恢復,所以就需要有個東西來記錄這個東西,就可以引出程序的概念了。

執行緒:

執行緒,有時被稱為輕量級程序,是程式執行流的最小單元。執行緒是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行。

程序和執行緒的關係:

1.一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒

2.資源分配給程序,程序是程式的主體,同一程序的所有執行緒共享該程序的所有資源

3.cpu分配給執行緒,即真正在cpu上執行的是執行緒

4.執行緒是最小的執行單元,程序是最小的資源管理單元

一個例子:開個QQ,開了一個程序;開了迅雷,開了一個程序。

在QQ的這個程序裡,傳輸文字開一個執行緒、傳輸語音開了一個執行緒、彈出對話方塊又開了一個執行緒。所以一個程序管著多個執行緒。