不同角度來剖析進程

通過cpu角度去理解進程的概念:

進程和線程都是一個時間段的描述,是對CPU工作時間段的一個描述。
下面細說背景:

CPU+RAM+各種資源(比如顯卡,光驅(qū),鍵盤,GPS, 等等外設)構成我們的電腦,但是電腦的運行,實際就是CPU和相關寄存器以及RAM之間的事情。

一個最最基礎的事實:

CPU太快,太快,太快了,寄存器僅僅能夠追的上他的腳步,RAM和別的掛在各總線上的設備完全是望其項背。那當多個任務要執(zhí)行的時候怎么辦呢?輪流著來?或者誰優(yōu)先級高誰來?不管怎么樣的策略,一句話就是在CPU看來就輪流著來。

一個必須知道的事實:

執(zhí)行一段程序代碼,實現(xiàn)一個功能的過程介紹 ,當?shù)玫紺PU的時候,相關的資源必須也已經(jīng)就位,就是顯卡啊,GPS啊什么的必須就位,然后CPU開始執(zhí)行。這里除了CPU以外所有的就構成了這個程序的執(zhí)行環(huán)境,也就是我們所定義的程序上下文。當這個程序執(zhí)行完了,或者分配給他的CPU執(zhí)行時間用完了,那它就要被切換出去,等待下一次CPU的臨幸。在被切換出去的最后一步工作就是保存程序上下文,因為這個是下次他被CPU臨幸的運行環(huán)境,必須保存。

串聯(lián)起來的事實:

前面講過在CPU看來所有的任務都是一個一個的輪流執(zhí)行的,具體的輪流方法就是:先加載程序A的上下文,然后開始執(zhí)行A,保存程序A的上下文,調(diào)入下一個要執(zhí)行的程序B的程序上下文,然后開始執(zhí)行B,保存程序B的上下文。。。。

========= 重要的東西出現(xiàn)了========

進程和線程就是這樣的背景出來的,兩個名詞不過是對應的CPU時間段的描述,名詞就是這樣的功能。

進程就是包換上下文切換的程序執(zhí)行時間總和 = CPU加載上下文+CPU執(zhí)行+CPU保存上下文線程是什么呢?

進程的顆粒度太大,每次都要有上下的調(diào)入,保存,調(diào)出。如果我們把進程比喻為一個運行在電腦上的軟件,那么一個軟件的執(zhí)行不可能是一條邏輯執(zhí)行的,必定有多個分支和多個程序段,就好比要實現(xiàn)程序A,實際分成 a,b,c等多個塊組合而成。那么這里具體的執(zhí)行就可能變成:

程序A得到CPU =》CPU加載上下文,開始執(zhí)行程序A的a小段,然后執(zhí)行A的b小段,然后再執(zhí)行A的c小段,最后CPU保存A的上下文。這里a,b,c的執(zhí)行是共享了A的上下文,CPU在執(zhí)行的時候沒有進行上下文切換的。

這里的a,b,c就是線程,也就是說線程是共享了進程的上下文環(huán)境,的更為細小的CPU時間段。到此全文結束,
再一個總結:進程和線程都是一個時間段的描述,是CPU工作時間段的描述,不過是顆粒大小不同。

并發(fā)的本質(zhì):是在時間上重疊的多個邏輯流,也就是說同時運行的多個邏輯流。

關于進程和線程,大家總是說的一句話是“進程是操作系統(tǒng)分配資源的最小單元,線程是操作系統(tǒng)調(diào)度的最小單元”。這句話理論上沒問題,我們來看看什么是所謂的“資源”呢。

什么是計算機資源

經(jīng)典的馮諾依曼結構把計算機系統(tǒng)抽象成 CPU + 存儲器 + IO,那么計算機資源無非就兩種:
  1. 計算資源
  2. 存儲資源

CPU是計算單元,單純從CPU的角度來說它是一個黑盒,它只對輸入的指令和數(shù)據(jù)進行計算,然后輸出結果,它不負責管理計算哪些”指令和數(shù)據(jù)“。 換句話說CPU只提供了計算能力,但是不負責分配計算資源。

計算資源是操作系統(tǒng)來分配的,也就是常說的操作系統(tǒng)的調(diào)度模塊,由操作系統(tǒng)按照一定的規(guī)則來分配什么時候由誰來獲得CPU的計算資源,比如分時間片

存儲資源就是內(nèi)存,磁盤這些存儲設備的資源。在這篇計算機底層知識拾遺(一)理解虛擬內(nèi)存機制 我們說了操作系統(tǒng)使用了虛擬內(nèi)存機制來管理存儲器,從緩存原理的角度來說,把內(nèi)存作為磁盤的緩存。進程是面向磁盤的,為什么這么說呢,進程表示一個運行的程序,程序的代碼段,數(shù)據(jù)段這些都是存放在磁盤中的,在運行時加載到內(nèi)存中。所以虛擬內(nèi)存面向的是磁盤,虛擬頁是對磁盤文件的分配,然后被緩存到物理內(nèi)存的物理頁中。

所以存儲資源是操作系統(tǒng)由虛擬內(nèi)存機制來管理和分配的。進程應該是操作系統(tǒng)分配存儲資源的最小單元。

再來看看線程,理論上說Linux內(nèi)核是沒有線程這個概念的,只有內(nèi)核調(diào)度實體(Kernal Scheduling Entry, KSE)這個概念。Linux的線程本質(zhì)上是一種輕量級的進程,是通過clone系統(tǒng)調(diào)用來創(chuàng)建的。何謂“輕量級”會在后面細說。進程是一種KSE,線程也是一種KSE。所以“線程是操作系統(tǒng)調(diào)度的最小單元”這句話沒問題。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容