程序 vs 執行緒

2021-10-05 03:32:32 字數 2789 閱讀 9258

本總結主要參考了

在以前cpu通常是單核的,即使是單核,同樣可以執行多工,因為我們知道cpu執行**都是書序執行的,單核cpu執行多工是通過作業系統輪流讓各個任務交替執行,例如:任務1執行了0.01秒,切換到任務2,任務2執行了0.001秒,之後再切換到任務3.....這樣反覆執行下去,雖然本質上每個任務在交替執行,但是因為碎度太快,在表面上我們會感覺所有任務都在同時執行一樣。

真正的並行執行多工只能在多核cpu上實現,但是,通常任務數量遠遠多於cpu核心數量,所以,作業系統也會自動把很多任務輪流排程到每個核心上執行。對於作業系統來說,乙個任務就是乙個程序(process),比如開啟了乙個記事本就是啟動了乙個記事本程序,開啟兩個就啟動了兩個記事本程序。

而有的程序往往不止同時幹一件事情,比如我們在寫**時呀開啟word,它可以同時執行打字,檢查,列印等任務,在這乙個程序內部,就需要同時執行多個『子任務』,我們把程序內的這些『子任務』稱為執行緒(thread)。由於每個程序至少要幹一件事,因此,乙個程序至少有乙個執行緒。當然乙個程序也會像word乙個同時有多個執行緒,多執行緒的執行方式和多程序是一樣的,也是通過作業系統在多個執行緒之間的快速切換,讓每個執行緒都短暫地交替執行,使得我們看起來就像同時執行一樣。而通過多核cpu可以實現同時執行多執行緒。我們平常編寫的很多程式都是執行單任務的程序,也就是說只有乙個執行緒,如果我們想同時執行多個任務有三種解決方案:①啟動多個程序,每個程序執行乙個執行緒,多個執行緒可以一塊執行多個任務;②啟動乙個程序,在乙個程序內啟動多個執行緒,多個執行緒可以一塊執行多個任務;③啟動多個程序,每個程序再啟動多個執行緒,這種模型更複雜,很少採用。

同時執行多個任務通常各個任務直線並不是沒有關聯的,而是需要相互通訊和協調,有時,任務1必須暫停等待任務2完成後才能繼續執行,有時,某些任務又不能同時執行。所以,在編寫多程序和多執行緒的程式往往要比我們編寫單程序單執行緒程式複雜的多。

對於多程序和多執行緒程式的編寫不再本篇幅的討論範圍內,這裡不再講解。

在簡單介紹了多程序和多執行緒後,接下來簡單談論下這兩種方式的優缺點。

對於多程序來說,最大的優點就是穩定性高,因為如果乙個子程序崩潰了,不會影響主程序和其他子程序。(若主程序掛了,則所有程序全部崩潰,但是主程序往往只負責分配任務,因此掛掉的可能性很低),著名的apache最早採用的就是多程序模式。

多程序的缺點是建立程序的代價較大,在unix/linus系統中還行,在windows下建立程序開銷巨大。除此之外,作業系統能同時執行的程序數是有限的,在記憶體和cpu的限制下,如果上千個程序同時執行,作業系統連排程都會成問題。

多執行緒通常要比多程序快,但也不會快太多,多執行緒有乙個比較致命的缺點就是倘若乙個執行緒掛掉可能會導致整個程序崩潰,因為所有執行緒共享程序的記憶體。例如在windows作業系統中,如果乙個執行緒執行的**出現了問題,我們經常會看到提示「程式執行了非法操作,即將關閉」,這往往就是某個執行緒出現了問題,但是作業系統會強制結束整個程序。由於windows下,多執行緒的效率要比多程序高,因此微軟的iis伺服器預設採用多執行緒模式,但是多執行緒存在穩定性問題,目前很多人又將目標指向了多程序+多執行緒的混合模式。

之前我們說的多執行緒模式,看似同時執行,本質上仍然是多工的來回切換,而由常識可知,切換往往是要付出代價的,例如假如今晚你既要學習數學建模,又要學python和看**,為了使任務同時進行,你可能選擇每樣每次做一分鐘,然後來回切換,倘若速度夠快,別人看來你就是在同時學習這三門課程。但是假如你正在學習數學建模,現在你要切換到看**的狀態,此時你需要收拾數學建模的資料,然後開啟電腦,開啟看**模式。因此這一過程是需要時間的。在作業系統中切換程序和執行緒也是同樣的道理,它需要先儲存當前執行的現場環境(cpu暫存器狀態,記憶體頁等),然後,把新任務的執行環境準備好,這個切換過程雖然快,但是也需要耗費時間。倘若現在有幾千個任務同時執行,作業系統可能就主要忙著切換任務,根本沒有多少時間去執行任務了,這種情況往往表現為點視窗無反應、硬碟巨響、系統處於假死狀態。

上述說明,多工一旦多到乙個限度,就會消耗光系統所有資源,使得效率急劇下降,最終所有任務都做不好。

對於是否採用多工,我們往往需要考慮任務型別,其中計算機通常所執行的任務大致分為計算密集型io密集型

對於io密集型任務,常見的有磁碟io、網路io等,這類任務的特點是cpu消耗很少,任務的大部分時間都在等待io操作完成(因為io的速度遠遠低於cpu和記憶體的速度)。對於這類任務,任務越多,cpu效率越高,但是也有乙個限度。對於這類任務的編寫,用執行速度快的c語言完全無法提公升執行效率,反而python語言是首選,因為其開發效率高(**量少)。

對於上述第二類任務,我們知道,由於cpu的計算速度相比於io來說速度極快,由於存在這樣巨大的速度差異,乙個任務在執行的過程中大部分時間可能都在等待io操作,多程序和多執行緒模型的出現使得其情況得到了極大的改善,在此基礎上,現代作業系統對io操作也進行了改進,其中最大的特點就是支援非同步io。如果充分利用作業系統提供的非同步io支援,就可以同單程序單執行緒模型來執行多工,這種全新的模型成為事件驅動模型,nginx就是支援非同步io的web伺服器,它在單核cpu上採用單程序模型就可以高效的支援多工。在多核cpu上,可以執行多個程序(數量和cpu核心數相同),充分利用多核cpu。由於系統總的程序數量十分有限,因此作業系統排程非常高效。未來用非同步io程式設計模型來實現多工是乙個主要的趨勢。

因為所學知識和目前的水平有限,在未來的學習中會對本文中不嚴謹的地方以及欠缺的地方加以補充(本文主要是為了做筆記而用,因此很多不嚴謹的地方還望見諒)。

程序 vs 執行緒

程序 vs.執行緒 我們介紹了多程序和多執行緒,這是實現多工最常用的兩種方式。現在,我們來討論一下這兩種方式的優缺點。首先,要實現多工,通常我們會設計master worker模式,master負責分配任務,worker負責執行任務,因此,多工環境下,通常是乙個master,多個worker。如果用...

程序 vs 執行緒

我們介紹了多程序和多執行緒,這是實現多工最常用的兩種方式。現在,我們來討論一下這兩種方式的優缺點。首先,要實現多工,通常我們會設計master worker模式,master負責分配任務,worker負責執行任務,因此,多工環境下,通常是乙個master,多個worker。如果用多程序實現maste...

程序vs執行緒

程序 process 和執行緒 thread 是作業系統的基本概念,但是它們比較抽象,不容易掌握。乙個程序可以包含多個執行緒 1.計算機的核心是cpu,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。2.假定工廠的電力有限,一次只能供給乙個車間使用。也就是說,乙個車間開工的時候,其他車間都必須停...