如何理解 程式 程序 執行緒 併發 並行 高併發?

時間 2021-05-06 17:24:38

1樓:大魚

這篇文章講得挺細的,可以看看https://

markdowner.net/article/

142723313666699264

2樓:zhang

單程序:

包含多個磁碟讀寫請求(IO)

非併發:

單程序單執行緒同步

說明:乙個程序,多個請求同步執行,請求阻塞說明:同一時間段只執行乙個請求

併發:單程序

單執行緒非同步

說明:乙個程序,多個請求序列、掛起,請求非阻塞說明:同一時間段只執行乙個請求

多執行緒同步(安全)

說明:乙個程序,多個請求分給若干執行緒。

說明:同一時間可執行多個執行緒(請求),多個執行緒訪問同乙個資源時,執行緒同步阻塞

非同步(不安全,死鎖)

說明:乙個程序,多個請求分給若干執行緒。

說明:同一時間可執行多個執行緒(請求),多個執行緒訪問同乙個資源時,執行緒非同步非阻塞,會造成死鎖

多程序同步並行(多程序)

非同步並行(多程序)

多執行緒並行(多程序)

3樓:卡爾的貓

如果乙個系統支援兩個或兩個以上任務同時存在,則是併發

如果乙個系統支援兩個或兩個以上任務同時執行,則是並行

並行是併發的子集;

並行的實現依賴於多核CPU;

4樓:

又遇到這樣的問題,我們又沒玩過原始計算機,也不知道原始計算機怎麼讀紙帶。

假如有乙個機器能夠不斷讀取打了孔的紙帶,你把這個機器看成發動機也好柴油機也好,總之機器轉動起了,要停下來重新啟動就得費時費力。

最原始的計算機,發動起來了,一次性只能放一條紙帶進去。讀完之後你得停下機器,把另乙個紙帶換上去。

稍後的計算機可以在不關機器的情況下換紙帶,但換紙帶還是要很長時間。換紙帶的空隙機器空轉耗油耗時。

再後來,我們設計了乙個紙帶切換裝置掛在發動機的旁邊,在機器讀完一張紙帶後這個裝置能夠馬上切換成下一張紙帶。這樣我們一次性把很多條紙帶一起放進這個無縫切換裝置裡。

再後來,我們的一條紙帶越來越長越來越複雜,機器讀到中間位置,計算出了乙個值,我們要停下來記錄。這時機器又空轉著。

再後來,我們又改進了乙個裝置,在我要記錄計算中間結果時,我讓這個裝置切換到其他紙帶去讀取。

未完待續,參考計算機作業系統。

5樓:

最初的計算機沒有程序、執行緒、併發這些概念。最初的計算機更接近乙個計算機或者算盤:一邊接受輸入的計算指令,一邊給出輸出,指令以帶孔紙帶的形式輸入。

如果要執行某個計算任務,首先把任務分解成一系列計算機指令,然後根據指令和孔的對應關係打紙帶。再把紙帶輸到計算機裡,計算機就可以執行上面的任務。這乙個計算任務,或者說這一捲紙帶,就是乙個程式。

這時的計算機一次只能執行乙個程式。

回到單核CPU的情況,為了充分利用CPU,我們可以開多程序或者多執行緒,防止IO操作時CPU閒置。但是切換程序和執行緒都需要一定的成本,這個成本能不能進一步降低呢?某個執行緒A遇到IO後,CPU會閒置,然後被其他執行緒搶占;執行緒A的上下文狀態會暫存起來,這是無法避免的。

那麼如果執行緒A遇到IO後,暫時跳過IO,繼續執行後續的需要CPU的計算呢?這樣不就可以避免執行緒的切換了嗎?這個思路繼續下去,就產生了協程的概念:

協程的排程發生在同乙個執行緒內,由執行緒控制排程。由於切換協程的成本更低,使用了協程以後即使是單執行緒,併發都可以達到乙個很高的量級。redis作為單執行緒服務併發能力很強,其底層實現——事件迴圈+IO多路復用,和協程的思路是一致的。

6樓:

區分這幾個概念主要抓住幾個關鍵字:

(1)併發:時間段、單核

(2)並行:時間點、多核

(3)執行緒:程式流執行的最小單元

(4)程序:分配資源的最小單元,可包含多個執行緒

多程序和多執行緒是並行還是併發?

mao.gang 我現在的理解是 按網上的並行,併發的解釋來看,概括的說,併發就是巨集觀上一起進行著的,微觀上是交替的,並行是微觀上是重疊的,還有一種說法是並行包含了併發,而多執行緒,當然,是並行的了,如果按並行包含併發來理解,如果並行概念不包含併發的話,那麼多執行緒則同時包括併發,和並行。在單cp...

並行程式設計中多程序和多執行緒,什麼情況下多程序能解決的多執行緒無法解決?

腹黑小太陽 1 當你需要資源隔離的時候,多程序有優勢。乙個worker的崩潰了,其它worker照樣可以工作。2 當你需要多機並行的時候,必須是多程序。因為你不可能直接訪問另外一台機器的記憶體開啟執行緒,而只能通過網路,網路是一種常用的程序間通訊工具。 Viscent大千 實際上多程序和多執行緒也並...

linux下如何測量程序執行緒context switch花費的時間?

XZiar 最近課程需要,測了一波context switch的時間。首先繫結執行緒親和性是必要的。測時間方面直接用了 rdtscp。測試的思路就是,兩個執行緒各自記錄時間,通過主動觸發context switch來使兩個執行緒輪流獲得執行機會。通過計算兩個執行緒的時間差來得到context swi...