個人主頁:??在肯德基吃麻辣燙
我的gitee:Linux倉庫
個人專欄:Linux專欄
分享一句喜歡的話:熱烈的火焰,冰封在最沉默的火山深處
前言
本篇文章繼上一篇的馮諾依曼體系結構和操作系統(tǒng)這兩個軟硬件的概念之后,開始講解Linux下三座大山之一的進程
。
因為進程概念雖然不是很多,但比較難以理解,因為它離我們?nèi)粘I畋容^遠,比較抽象,本文章以最平易近人的語言和生活中我們都熟悉的例子對進程進行剖析,希望這篇文章能進一步幫助你理解進程的概念,吃透Linux的其中一座大山。
廢話不多說,我們現(xiàn)在開始。
淺談進程概念
- 進程到底是什么呢?
這里給出一個比較簡單的理解:
一個加載到內(nèi)存的程序就叫做進程。
正在運行的程序,也叫做進程。
我們可以這樣理解,進程,進:進入,程:程序,進入內(nèi)存的程序,就是進程。
自從我們理解馮諾依曼之后,程序加載到內(nèi)存這件事情我們就可以輕松理解。前面我們講過,操作系統(tǒng)是一款進行管理的軟件。 既然操作系統(tǒng)是軟件,那就應該也會被加載到內(nèi)存中運行。我們平時所說的啟動電腦,就是先啟動操作系統(tǒng),也就是將操作系統(tǒng)加載到內(nèi)存中。
以我的電腦為例,當打開任務管理器時,下面一覽無余的任務等,這些就是進程,正在運行的程序。
1. 進程和操作系統(tǒng)的聯(lián)系
其實,程序是一堆數(shù)據(jù)和代碼,最先是被存放到磁盤中。我們知道啟動電腦時,操作系統(tǒng)也會被加載到內(nèi)存中運行,在內(nèi)存中有一塊空間屬于操作系統(tǒng)自己的數(shù)據(jù)和代碼。
當我們想要運行整個程序時,由于CPU只會和內(nèi)存打交道,不會直接和磁盤交互,這就注定了程序想要運行必須加載到內(nèi)存中,這個同時也遵守了馮諾依曼體系結構。
- 這時候我們仔細想想,只能由一個程序能加載到內(nèi)存里面嗎?
其實并不是,我們玩電腦的時候,會同時啟動幾個軟件,我們會一邊看b站一邊登錄qq和微信,一邊敲代碼,這些都可以同時進行。
所以,一個操作系統(tǒng),是可以同時運行多個進程的!
這就像大學里面有大一的,有大二的,有在實習的,有天天在宿舍打游戲的一樣,一個操作系統(tǒng)要想同時運行那么多個進程,就必須將進程管理起來!
- 操作系統(tǒng)如何管理進程呢?
還記得上篇文章那句貫穿整個Linux的話嗎?
先描述,再組織
描述的過程就是讓操作系統(tǒng)先認識進程,再將進程用一個struct
結構體描述起來,然后將眾多進程全部都具體化,而對于進程的管理無非就是多一個進程,少一個進程等等這些操作,所以操作系統(tǒng)再將進程組織起來,就能達到管理。
2.描述進程的對象——PCB
從上面我們可以知道,任何一個程序,加載到內(nèi)存時,操作系統(tǒng)對進程進行描述時,會把進程具象化成一個struct
結構體,而這個結構體就是PCB,全稱是Process Ctrl Block:進程控制塊。
怎么理解進程PCB?
- 這里有一個問題:人是怎么認識一個事物的?
假如這里有一個蘋果,我們都會說,這個蘋果是圓的,是紅色的,大大的一個東西,還是一個甜甜的水果。
又譬如對你大學舍友的描述,長得怎么樣,兩個眼睛扛著兩片眉毛,一個鼻子,一張嘴巴,愛好什么,喜歡做什么等等。
可以看出來,這些描述一個事物,就是通過事物本身的屬性來描述的!
其實我們對一個事物本身并不了解,而是通過該事物的大量屬性來了解這個事物,當屬性足夠多時,這一堆屬性的集合,就是目標事物本身!
所以描述進程的對象——PCB,就是進程屬性的集合!
到這里我們再對程序加載到內(nèi)存這件事情進一步詳談:
程序加載到內(nèi)存中時:
- 1.把數(shù)據(jù)和代碼都加載到內(nèi)存中
- 2.同時創(chuàng)建描述該進程的PCB對象并加載到內(nèi)存中
這就像是,大學新生考上了某所學校時,要證明我真正在那所學校了,就需要在學校的教務系統(tǒng)錄入我的名字信息等等。也許該名同學還在放暑假,可是當學校教務系統(tǒng)有該同學的信息時, 就表明這名同學真正的來這所大學就讀了。
深談進程概念
從前面我們可以知道,一個程序加載到內(nèi)存,一是程序本身的數(shù)據(jù)和代碼加載到內(nèi)存,二是操作系統(tǒng)創(chuàng)建了一個PCB對象并加載到內(nèi)存;
所以,單純的數(shù)據(jù)和代碼不叫進程,單純的PCB對象也不叫進程,而是數(shù)據(jù)和代碼 + 描述該進程的PCB結構體 = 進程!
1)進程的數(shù)據(jù)和代碼是程序員寫的
2)描述該進程的PCB結構體是操作系統(tǒng)維護的
可以想想,在學校中我們對學生的管理是看學生的及格率,掛科率,學分績,宿舍號等屬性進行管理的。
所以,操作系統(tǒng)對進程的管理并不是對數(shù)據(jù)和代碼的管理,而是對描述該進程的PCB結構體進行管理!
因為這個內(nèi)核PCB結構體就是該進程屬性
的集合!
可是,操作系統(tǒng)對進程進行管理,不只是要知道該進程的屬性值,還要獲取進程的數(shù)據(jù)和代碼。因此,在描述該進程的PCB結構體中,一定有指向該進程數(shù)據(jù)和代碼的指針信息!
就像管理學生,學校老師如何通過學生的屬性去獲取指向學生數(shù)據(jù)的 “ 指針信息 ”?
其實就是手機號。手機號是該學生的屬性值,但是這個屬性可以找到學生這個人!
以上就是關于操作系統(tǒng)如何對進程進行描述的過程。
3. 對進程的組織操作
通過上面的信息可以知道,操作系統(tǒng)會對多個進程進行描述,管理這些進程的時候就管理對應描述進程的PCB對象就可以了。
在PCB結構體中大概有這些信息:
前面說過,操作系統(tǒng)對進程的管理方式是:
先描述,再組織。
那么該如何對那么多的進程組織起來呢?
其實我們可以再PCB結構體中再加一個指針信息:
struct PCB* next
,該指針指向下一個PCB結構體對象,如下圖:
從而將操作系統(tǒng)對進程的管理轉化成對一個鏈表的增刪查改!
這個過程就是對進程進行組織的過程!
總結:進程 = 內(nèi)核PCB數(shù)據(jù)結構 + 自己的代碼和數(shù)據(jù)。
操作系統(tǒng)對進程的管理是先描述,再組織的過程;操作系統(tǒng)對進程的數(shù)據(jù)管理是被弱化的,更重要的是對進程的PCB結構體進行管理,然后將這一個個的PCB結構體連接起來,就形成了對鏈表的增刪查改。文章來源:http://www.zghlxwxcb.cn/news/detail-634461.html
總結
本篇文章重點在于理解進程的概念就可以了,進程的相關內(nèi)容比較多且難以理解,從進程概念入手是最合適的,后面會持續(xù)更新如何創(chuàng)建進程,進程的狀態(tài)等詳細的內(nèi)容,更好地理解進程,貫穿整個Linux。文章來源地址http://www.zghlxwxcb.cn/news/detail-634461.html
到了這里,關于【Linux】深入理解進程概念的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!