面試題:線程與進程的區別


線程與進程的區別

面試,一個考官問的,覺得自己回答的很不好~概念要好好的充實一下。

下面的回答感覺挺好,實在容易理解。分享並記錄~

首先來一句概括的總論:進程和線程都是一個時間段的描述,是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工作時間段的描述,不過是顆粒大小不同。
 
轉自知乎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM