線程和進程的區別是什麼?
不請自來。
看見上面幾位的回答我真的是醉了。說幾句我的理解。首先來一句概括的總論:進程和線程都是一個時間段的描述,是CPU工作時間段的描述。下面細說背景:
CPU+RAM+各種資源(比如顯卡,光碟機,鍵盤,GPS, 等等外設)構成我們的電腦,但是電腦的運行,實際就是CPU和相關寄存器以及RAM之間的事情。
一個最最基礎的事實:CPU太快,太快,太快了,寄存器僅僅能夠追的上他的腳步,RAM和別的掛在各匯流排上的設備完全是望其項背。那當多個任務要執行的時候怎麼辦呢?輪流著來?或者誰優先順序高誰來?不管怎麼樣的策略,一句話就是在CPU看來就是輪流著來。
一個必須知道的事實:執行一段程序代碼,實現一個功能的過程介紹 ,當得到CPU的時候,相關的資源必須也已經就位,就是顯卡啊,GPS啊什麼的必須就位,然後CPU開始執行。這裡除了CPU以外所有的就構成了這個程序的執行環境,也就是我們所定義的程序上下文。當這個程序執行完了,或者分配給他的CPU執行時間用完了,那它就要被切換出去,等待下一次CPU的臨幸。在被切換出去的最後一步工作就是保存程序上下文,因為這個是下次他被CPU臨幸的運行環境,必須保存。
串聯起來的事實:前面講過在CPU看來所有的任務都是一個一個的輪流執行的,具體的輪流方法就是:先載入程序A的上下文,然後開始執行A,保存程序A的上下文,調入下一個要執行的程序B的程序上下文,然後開始執行B,保存程序B的上下文。。。。========= 重要的東西出現了========進程和線程就是這樣的背景出來的,兩個名詞不過是對應的CPU時間段的描述,名詞就是這樣的功能。- 進程就是包換上下文切換的程序執行時間總和 = CPU載入上下文+CPU執行+CPU保存上下文
線程是什麼呢?
進程的顆粒度太大,每次都要有上下的調入,保存,調出。如果我們把進程比喻為一個運行在電腦上的軟體,那麼一個軟體的執行不可能是一條邏輯執行的,必定有多個分支和多個程序段,就好比要實現程序A,實際分成 a,b,c等多個塊組合而成。那麼這裡具體的執行就可能變成:程序A得到CPU =》CPU載入上下文,開始執行程序A的a小段,然後執行A的b小段,然後再執行A的c小段,最後CPU保存A的上下文。
這裡a,b,c的執行是共享了A的上下文,CPU在執行的時候沒有進行上下文切換的。這里的a,b,c就是線程,也就是說線程是共享了進程的上下文環境,的更為細小的CPU時間段。
到此全文結束,再一個總結:進程和線程都是一個時間段的描述,是CPU工作時間段的描述,不過是顆粒大小不同。開個QQ,開了一個進程;開了迅雷,開了一個進程。
在QQ的這個進程里,傳輸文字開一個線程、傳輸語音開了一個線程、彈出對話框又開了一個線程。所以運行某個軟體,相當於開了一個進程。在這個軟體運行的過程里(在這個進程里),多個工作支撐的完成QQ的運行,那麼這「多個工作」分別有一個線程。
所以一個進程管著多個線程。
通俗的講:「進程是爹媽,管著眾多的線程兒子」...1。單進程單線程:一個人在一個桌子上吃菜。2。單進程多線程:多個人在同一個桌子上一起吃菜。3。多進程單線程:多個人每個人在自己的桌子上吃菜。
進程是cpu資源分配的最小單位,線程是cpu調度的最小單位。以前進程既是資源分配也是調度的最小單位,後來為了更合理的使用cpu(實際上是cpu性能越來越好),才將資源分配和調度分開,就有了線程。線程是建立在進程的基礎上的一次程序運行單位。
進程是應用程序的執行實例。比如說,當你雙擊的Microsoft Word的圖標,你就開始運行的Word的進程。線程是執行進程中的路徑。另外,一個過程可以包含多個線程。啟動Word時,操作系統創建一個進程並開始執行該進程的主線程。由於一個進程可以由多個線程,線程可以被認為是「輕量級」的過程。因此,一個線程和一個進程之間的本質區別在於,每一個用來完成的工作。線程用於小任務,而進程用於更多的"重量級"的任務 - 應用基本執行。一個線程和進程之間的另一個區別是,在同一進程中的線程共享相同的地址空間,而不同的進程沒有。因此線程可以讀寫同樣的數據結構和變數,便於線程之間的通信。相反,進程間通信(IPC)很困難且消耗更多資源。
Why:
由於CPU與其他PC資源之間速度的不協調,人們想提高資源利用率,所以人們提出了多任務系統。得益於CPU的計算速度,我們可以「同時」運行多個任務,實質上是多個任務之間輪流使用CPU資源,由於速度超快,給用戶的感覺就是連續的。
How:
1)任務的執行需要依賴各個PC資源,我們可以稱為計算機執行的上下文環境。要實現「同時執行」,就需要不斷輪換,為了後來繼續從當前狀態執行下去,計算機需要保存切換前的程序上下文。所以有了進程:用進程去描述程序當前上下文的狀態信息----內存位置、變數值、任務ID……所以,進程是資源分配的單位。一般來說宏觀上可以看做是一個軟體的運行,例如一個word文檔的打開。
2)多個任務之間切換因為要保存上下文、調入上下文,一旦多了的時候,還是有一定的時間消耗的。為了進一步提高資源利用率,人們在進程中,引入了線程,線程只是CPU輪流調度的單位,其他上下文信息用所在進程中的。這樣上下文切換的耗時就降了下來。同樣的,宏觀上來可以看做是一個軟體中的多個處理功能,例如上述打開word中拼寫檢查功能、字體加粗……
So, What:
一般來說,進程是資源的分配單位,線程是CPU在進程內切換的單位,線程屬於進程。
這個問題,是操作系統里問的最多的問題之一,也是被誤解最深的概念之一。Alan Kay說過,好的角度可以提升80分的智商。理解它們的差別,我從資源使用的角度出發。所謂的資源就是計算機里的中央處理器,內存,文件,網路等等。
進程,在一定的環境下,把靜態的程序代碼運行起來,通過使用不同的資源,來完成一定的任務。比如說,進程的環境包括環境變數,進程所掌控的資源,有中央處理器,有內存,打開的文件,映射的網路埠等等。
這裡我把進程對內存的管理稍微展開說一下。一個系統中,有很多進程,它們都會使用內存。為了確保內存不被別人使用,每個進程所能訪問的內存都是圈好的。一人一份,誰也不干擾誰。還有內存的分頁,虛擬地址我就不深入探討了。這裡給大家想強調的就是,進程需要管理好它的資源。
其中,線程作為進程的一部分,扮演的角色就是怎麼利用中央處理器去運行代碼。這其中牽扯到的最重要資源的是中央處理器和其中的寄存器,和線程的棧(stack)。這裡想強調的是,線程關注的是中央處理器的運行,而不是內存等資源的管理。
當只有一個中央處理器的時候,進程中只需要一個線程就夠了。隨著多處理器的發展,一個進程中可以有多個線程,來並行的完成任務。比如說,一個web伺服器,在接受一個新的請求的時候,可以大動干戈的fork一個子進程去處理這個請求,也可以只在進程內部創建一個新的線程來處理。線程更加輕便一點。線程可以有很多,但他們並不會改變進程對內存(heap)等資源的管理,線程之間會共享這些資源。
總結一下,我上面的解釋是通過計算機操作系統的角度出發的。進程和線程不是同一個層面上的概念,線程是進程的一部分,線程主抓中央處理器執行代碼的過程,其餘的資源的保護和管理由整個進程去完成。- 定義方面:進程是程序在某個數據集合上的一次運行活動;線程是進程中的一個執行路徑。
- 角色方面:在支持線程機制的系統中,進程是系統資源分配的單位,線程是系統調度的單位。
- 資源共享方面:進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。同時線程還有自己的棧和棧指針,程序計數器等寄存器。
- 獨立性方面:進程有自己獨立的地址空間,而線程沒有,線程必須依賴於進程而存在。
詳情請移步
android 線程與進程 區別 聯繫關於線程和進程的一篇文章。歡迎大佬拍磚
用純比喻說 把計算機整體看成國家總預算,進程就是各類專項預算(教育,國防等),線程就是更細分的一級某個特定用途預算(比如具體生產,員工津貼)基本上就很清楚了
打一個通俗易懂的比方吧!
比如你去一個食堂吃飯。裡面有A,B,C,D等一些窗口可以打飯菜或者米粉麻辣燙什麼的。
但是每一個窗口又有打這些菜的師傅。
那麼這些窗口就是進程。
那個那些窗口裡面打菜的師傅就是線程。
這個食堂就是系統了。
系統去分配這些進程。
《深入理解計算機系統》
簡單概括:按操作系統描述來說,線程是cpu調度最小單元,是一種有限的系統資源。
進程一般則是只一個執行單元。
一個進程可以有多個線程,所以進程與線程是包含與被包含的關係。
我覺得核心點,進程是操作系統分配的,對於開發者來說,線程是你自己的程序分配的,簡言之,你控制的了線程,卻控制不了進程,進程之間通信比較困難,但並不是不可以,常用的操作時safari來呼起特定的app,但這需要操作系統預留通道
感覺概念上也很容易講清楚了,不過不知道怎麼用。。希望早日用上
推薦閱讀:
※操作系統的系統開銷比率怎麼計算?
※為什麼要了解進程與線程的區別,了解二者的區別有什麼意義呢?
※安卓系統的通病後台啟動進程過多,待機狀態下就占內存一半,怎麼解決這種問題呢?
※如何看待針對 Windows 系統的 "AtomBombing" 內存注入攻擊 ?
※在單線程的情況下,NodeJs是如何分發子任務去執行的?
TAG:進程 |