進程線程、同步異步、阻塞非阻塞、并發并行

一、進程和線程

1??【進程Process】是Windows系統中的一個基本概念,它包含著一個運行程序所需要的資源。一個正在運行的應用程序在操作系統中被視為一個進程,進程可以包括一個或多個線程。

進程之間是相對獨立的,一個進程無法訪問另一個進程的數據(除非利用分布式計算方式),一個進程運行的失敗也不會影響其他進程的運行,Windows系統就是利用進程把工作劃分為多個獨立的區域的。進程可以理解為一個程序的基本邊界。是應用程序的一個運行例程,是應用程序的一次動態執行過程。

2??【線程Thread】是進程中的基本執行單元,是操作系統分配CPU時間的基本單位,一個進程可以包含若干個線程,在進程入口執行的第一個線程被視為這個進程的主線程。線程主要是由CPU寄存器、調用棧和線程本地存儲器(Thread Local Storage,TLS)組成的。CPU寄存器主要記錄當前所執行線程的狀態,調用棧主要用于維護線程所調用到的內存與數據,TLS主要用于存放線程的狀態信息。

3??進程和線程的區別

進程和線程的主要差別在于它們是操作系統不同的資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。

4??小結
線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。

  • 一個程序至少有一個進程,一個進程至少有一個線程。
  • 線程的劃分尺度小于進程,使得多線程程序的并發性高。
  • 進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
  • 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
  • 從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

二、同步Sync異步Async

1??同步:所謂同步,就是發出一個功能調用時,在沒有得到結果之前,該調用就不返回或不能繼續執行后續操作。簡單來說,同步就是必須一件一件事做,等前一件做完了才能做下一件事。

例如:B/S 模式中的表單提交,具體過程是:客戶端提交請求->等待服務器處理->處理完畢返回,在這個過程中客戶端(瀏覽器)不能做其他事。

2??異步:異步與同步相對,當一個異步過程調用發出后,調用者在沒有得到結果之前,就可以繼續執行后續操作。當這個調用完成后,一般通過狀態、通知和回調來通知調用者。對于異步調用,調用的返回并不受調用者控制。

對于通知調用者的三種方式,具體如下:

  1. 狀態:即監聽被調用者的狀態(輪詢),調用者需要每隔一定時間檢查一次,效率會很低。
  2. 通知:當被調用者執行完成后,發出通知告知調用者,無需消耗太多性能。
  3. 回調:與通知類似,當被調用者執行完成后,會調用調用者提供的回調函數。
    例如:B/S 模式中的 ajax 請求,具體過程是:客戶端發出 ajax 請求--->服務端處理--->處理完畢執行客戶端回調。在客戶端(瀏覽器)發出請求后,仍然可以做其他的事。

3??同步和異步的區別:請求發出后,是否需要等待結果,才能繼續執行其他操作。

三、阻塞和非阻塞

這兩個概念與程序(線程)等待消息通知(無所謂同步或者異步)時的狀態有關。也就是說阻塞與非阻塞主要是從程序(線程)等待消息通知時的狀態角度來說的。阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態。阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。

四、并發和并行

1??并發:在操作系統中,是指同一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。

當有多個線程在操作時,如果系統只有一個 CPU,則它根本不可能真正同時進行一個以上的線程,它只能把 CPU 運行時間劃分成若干個時間段,再將時間段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處于掛起狀。這種方式稱之為并發(Concurrent)。

2??并行:當系統有一個以上 CPU 時,則線程的操作有可能非并發。當一個 CPU 執行一個線程時,另一個 CPU 可以執行另一個線程,兩個線程互不搶占 CPU 資源,可以同時進行,這種方式稱之為并行(Parallel)。

3??并發和并行的區別:

你吃飯吃到一半,電話來了,你一直到吃完了以后才去接,這就說明你不支持并發也不支持并行。
你吃飯吃到一半,電話來了,你停了下來接了電話,接完后繼續吃飯,這說明你支持并發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支持并行。
并發的關鍵是你有處理多個任務的能力,指同一時間段運行多個程序,不一定要同時。并行的關鍵是你有同時處理多個任務的能力,強調的是同一個時間點并行運行,指的是同一時刻。很顯然,并行要求需要多核,而并發可以單核切換運行程序,由于 cpu 的高速運轉,所以看起來并發很類似并行執行,但是本質上兩者是不同的。

五、異步和多線程區別(原理篇)

1??異步和多線程的區別
異步是目的,多線程是實現該目的的方法。異步是說,A 發起一個操作后(一般都是比較耗時的操作,如果不耗時的操作就沒有必要異步了),可以繼續自顧自的處理它自己的事情,不用干等著這個耗時操作返回。

2??多線程和異步操作的異同
多線程和異步操作兩者都可以達到避免調用線程阻塞的目的,從而提高軟件的可響應性。甚至有些時候就認為多線程和異步操作是等同的概念。但是,多線程和異步操作還是有一些區別的。而這些區別造成了使用多線程和異步操作的時機的區別。

3??異步操作的本質
所有的程序最終都會由計算機硬件來執行,所以為了更好的理解異步操作的本質,有必要了解一下它的硬件基礎。硬盤、光驅的技術規格中都有明確DMA的模式指標,其實網卡、聲卡、顯卡也是有DMA功能的。

DMA就是直接內存訪問的意思,也就是說,擁有DMA功能的硬件在和內存進行數據交換的時候可以不消耗CPU資源。只要CPU在發起數據傳輸時發送一個指令,硬件就開始自己和內存交換數據,在傳輸完成之后硬件會觸發一個中斷來通知操作完成。這些無須消耗CPU時間的I/O操作正是異步操作的硬件基礎。所以即使在DOS 這樣的單進程(而且無線程概念)系統中也同樣可以發起異步的DMA操作。

4??線程的本質
線程不是一個計算機硬件的功能,而是操作系統提供的一種邏輯功能,線程本質上是進程中一段并發運行的代碼,所以線程需要操作系統投入 CPU 資源來運行和調度。

5??異步操作的優缺點
因為異步操作無須額外的線程負擔,并且使用回調的方式進行處理,在設計良好的情況下,處理函數可以不必使用共享變量(即使無法完全不用,最起碼可以減少共享變量的數量),減少了死鎖的可能。當然異步操作也并非完美無暇。編寫異步操作的復雜程度較高,程序主要使用回調方式進行處理,與普通人的思維方式有些出入,而且難以調試。

6??多線程的優缺點
多線程的優點很明顯,線程中的處理程序依然是順序執行,符合普通人的思維習慣,所以編程簡單。但是多線程的缺點也同樣明顯,線程的使用(濫用)會給系統帶來上下文切換的額外負擔。并且線程間的共享變量可能造成死鎖的出現。

多線程意義:

有時程序需要在特定時間做特定的事情。比如有一個可見窗口的程序。該程序可能正在進行大量的后臺數字運算,但是它仍然可以響應用戶事件(例如單擊按鈕并調整其大小),這種情況可以通過異步處理來完成,異步處理將需要一個線程重復檢查 GUI 工作是否間隔執行,暫停正在執行的操作以及處理 GUI 一段時間。許多事情都是通過這種方式完成的。

然而,處理它的另一種可能更好的方法是使用線程。無需擔心該程序在邏輯運算和 GUI 管理之間來回切換,操作系統將自行管理。即使只有一個內核,仍然可以運行多個線程,并且操作系統將盡最大努力確保所有正在運行的進程中的所有正在運行的線程都能公平分配 CPU 時間。

六、理解異步,多線程和并行的區別

沒有 12306 的時候,買票只能去火車站買。因為都要過年回家,都還不想等,火車站只有一個,窗口只有那么多,頭疼啊。更頭疼的是,排到窗口的那個人,各種挑剔,不要貴的,不要晚上的,不要站票……跟售票員各種墨跡,后面的人更加著急。

現在假設整個城市就只有一列火車,一個售票員,每個乘客咨詢售票員后需要思考一分鐘再決定買哪趟車的票。

  1. 異步:在買票的人咨詢后,需要思考一分鐘,馬上靠邊站,但不用重新排隊,什么時候想清楚可以立馬去跟售票員去買票。在該人站在旁邊思考的時候,后面的人趕緊上去接著買。這時候隊伍是很快的挪動的,沒有阻塞,售票員的最大化的效率。

  2. 多線程:火車站開 n 個窗口(但還是只有一個人售票),外面同時排 n 個隊,售票員回答咨詢者問題后,立馬馬上去下個窗口,然后繼續輪換到下個窗口…..哪個窗口的人決定好了,售票員立馬過去賣給他。這個時候乘客比較簡單,但萬一那個隊伍有人思考半天糾結,后面的人就悲劇了。

  3. 并行:復制 n 個火車站,同時賣票,能力大大增強。大家也可以哪個火車站人少,就去那個買票。

可見:在只有一個火車站,且只有一個售票員的情況下,賣完一個再賣一個就會導致資源浪費,效率低下,隊伍卡死,很難往前挪動。1/2 優化的辦法都解決了隊伍不動,售票率低下的問題。但增加火車站,增加窗口,增加售票員才是好辦法。

結論:

  1. 異步和多線程其實效率差不多,但是開的窗口不多例如三個,同時有很多人都是去花五分鐘,而不是一分鐘去糾結的時候,多線程效率實際是低于異步的,因為售票員還是常遇到三個隊伍同時卡在那糾結不能買票的時候。

  2. 這兩個概念拿來對比也有點不合適,因為不是一個維度,多線程的目的還是為了實現異步,多線程應該是一種實現異步的手段。異步應該去跟同步比較才對。

  3. 多線程比較簡單,但需要增設窗口,增加成本,且售票員比較累。

  4. 并行,類似同時利用多核 cpu 的各個核去計算。并發可分為偽并發、真并發。前者例如單核處理器的并發,后者發是指多核處理器的并發。

  5. 終極辦法是并行計算,并且每個 cpu 下進行異步計算,這樣每個核都充分利用。只不過對編程要求很高,如果不是密集型計算,例如大型有限元計算(多采用并發),或者服務器同時處理上千的訪問(多采用異步或者多線程),還是老老實實的用傳統的辦法吧,畢竟常規程序的計算量對現在的硬件來說,問題都不大。

七、理解同步阻塞、同步非阻塞、異步阻塞、異步阻塞、異步非阻塞

同步/異步關注的是消息通知的機制,而阻塞/非阻塞關注的是程序(線程)等待消息通知時的狀態。

以小明下載文件打個比方,從這兩個關注點來再次說明這兩組概念:

1??同步阻塞:小明一直盯著下載進度條,到 100% 的時候就完成。
同步體現在:等待下載完成通知;
阻塞體現在:等待下載完成通知過程中,不能做其他任務處理;

2??同步非阻塞:小明提交下載任務后就去干別的,每過一段時間就去瞄一眼進度條,看到 100% 就完成。
同步體現在:等待下載完成通知;
非阻塞體現在:等待下載完成通知過程中,去干別的任務了,只是時不時會瞄一眼進度條;小明必須要在兩個任務間切換,關注下載進度。

3??異步阻塞:小明換了個有下載完成通知功能的軟件,下載完成就“?!币宦?。不過小明仍然一直等待“叮”的聲音。
異步體現在:下載完成“?!币宦曂ㄖ?br> 阻塞體現在:等待下載完成“?!币宦曂ㄖ^程中,不能做其他任務處理;

4??異步非阻塞:仍然是那個會“叮”一聲的下載軟件,小明提交下載任務后就去干別的,聽到“?!钡囊宦暰椭劳瓿闪?。
異步體現在:下載完成“?!币宦曂ㄖ?br> 非阻塞體現在:等待下載完成“?!币宦曂ㄖ^程中,去干別的任務了,只需要接收“叮”聲通知即可;軟件處理下載任務,小明處理其他任務,不需關注進度,只需接收軟件“叮”聲通知,即可。

也就是說,同步/異步是“下載完成消息”通知的方式(機制),而阻塞/非阻塞則是在等待“下載完成消息”通知過程中的狀態(能不能干其他任務),在不同的場景下,同步/異步、阻塞/非阻塞的四種組合都有應用。

綜上所述,同步和異步僅僅是關注的消息如何通知的機制,而阻塞與非阻塞關注的是等待消息通知時的狀態。也就是說,同步的情況下,是由處理消息者自己去等待消息是否被觸發,而異步的情況下是由觸發機制來通知處理消息者,所以在異步機制中,處理消息者和觸發機制之間就需要一個連接的橋梁。在小明的例子中,這個橋梁就是軟件“?!钡穆曇?。

1??同步阻塞形式:效率是最低的。
拿上面的例子來說,就是專心等待下載完成,什么別的事都不做。實際程序中:就是未對 fd 設置 O_NONBLOCK 標志位的 read/write 操作;

2??異步阻塞形式:異步操作是可以被阻塞住的,只不過它不是在處理消息時阻塞,而是在等待消息通知時被阻塞。
比如 select 函數,假如傳入的最后一個 timeout 參數為 NULL,那么如果所關注的事件沒有一個被觸發,程序就會一直阻塞在這個 select 調用處。

3??同步非阻塞形式:實際上是效率低下的。
想象一下一邊干別的事情一邊還需要抬頭看下載完成沒有,如果把干別的事情和觀察下載完成情況的位置看成是程序的兩個操作的話,這個程序需要在這兩種不同的行為之間來回的切換,效率可想而知是低下的。

很多人會寫阻塞的 read/write 操作,但是別忘了可以對 fd 設置 O_NONBLOCK 標志位,這樣就可以將同步操作變成非阻塞的了。

4??異步非阻塞形式:效率更高。
因為等待下載完成是等待者的事情,而通知則是電腦(消息觸發機制)的事情,程序沒有在兩種不同的操作中來回切換。

八、多核

具有多個邏輯 CPU 內核并且可以物理上同時執行多條指令的計算機的處理器。計算機的“核心數”是計算機擁有的核心總數。計算機可能具有多個處理器,每個處理器可能具有多個核心;核心數是所有處理器上的核心總數。

多核的優勢

多核技術具有超線程技術的所有優點并且具有更多的優勢。超線程技術為每個物理內核使用兩個虛擬內核來更有效地處理任務,而多內核技術則增加了物理內核。由于單個物理核心比單個虛擬核心更強大,因此雙核處理器比具有超線程的單核處理器更強大。許多較新的型號CPU是超線程和多核的,從而實現了更高的性能。

多線程和多核關系

首先兩者本質上沒有必然的聯系,多線程可以運行在單核上,也可以運行在多核上。一個線程可以某一時間段在一個核心上運行,下一刻在另一個核心上運行。

線程是內核調度的最小單位。一個進程可以有多個線程,它們共同完成某個任務。線程是被包裹在進程中的,進程提供了線程運行的資源。

進程之間互不影響,一個進程掛掉,并不影響其它進程,然而一個進程內的一個線程出現問題 ,其它線程也無法正常運行。

九、CPU

CPU也叫內核,是由單晶硅以一定的生產工藝制造出來的,CPU所有的計算、接受/存儲命令、處理數據都由核心執行。

CPU執行多個程序靠的是它的時鐘,通過時鐘中斷,它可以在不同的程序之間切換,這樣看上去,我們的程序就彷佛在并行執行。

十、超線程技術

超線程技術為CPU中存在的每個物理核心創建兩個虛擬處理核心。物理核心為虛擬核心提供動力,然后虛擬核心承擔任務處理的責任。每個虛擬內核都彼此相同,盡管兩者都不像物理內核那么強大,但是當不啟用HT時,它們合起來遠遠超過了物理內核的能力。這些虛擬內核的使用使CPU可以實時在內核之間委派任務。

超線程的優點

由CPU密集型操作(例如同時運行兩個苛刻的程序)創建的工作負載(該操作會降低單個物理核心的運行速度,而不論其原始功率如何)都會在處理器的虛擬核心之間分配利用HT技術。使用兩個虛擬內核同時處理任務,處理時間更短,程序打開速度更快,并且在多任務處理期間您的計算機將保持更高的響應速度。簡而言之,超線程可提高處理效率。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380