從 0 開始學習 Linux 系列之「16.進程基本概念」

進程基本概念

版權(quán)聲明:本文為 cdeveloper 原創(chuàng)文章,可以隨意轉(zhuǎn)載,但必須在明確位置注明出處忌傻!

進程基本概念

這篇文章帶你了解 Linux 進程的基本概念沉唠,不解釋了疆虚,快點上車...

程序和進程

先看看程序和進程的區(qū)別梭冠,程序是一個磁盤上的文件蓝丙,而進程通常被定義為一個正在運行的程序?qū)嵗?/strong>,進程由兩部分組成:

  1. 操作系統(tǒng)用來管理進程的內(nèi)核對象:內(nèi)核對象用來存放進程的統(tǒng)計信息
  2. 獨立的內(nèi)存地址空間:包含可執(zhí)行模塊的代碼和數(shù)據(jù)俘种,還包含分配的內(nèi)存空間嘀韧,例如堆篇亭,棧

進程運行過程

運行進程可以簡單的理解為:計算機將磁盤的二進制程序加載到內(nèi)存空間中,并且指引 CPU 在內(nèi)存中尋址锄贷,然后計算的過程:

  1. 將磁盤程序裝載到內(nèi)存译蒂,所謂實例化
  2. 讀取并執(zhí)行內(nèi)存中的程序段內(nèi)容,這個過程會涉及變量分配和內(nèi)存尋址等操作
  3. 結(jié)束或者繼續(xù)執(zhí)行

進程運行特性

進程的運行特性主要可以包含 3 個方面:

  1. 多任務:內(nèi)存中可以存在多個進程
  2. 并發(fā):多個進程可以「并發(fā)」執(zhí)行
  3. 程序獨立:進程之間互不影響

例如 Linux 系統(tǒng)是多任務谊却,分時系統(tǒng)柔昼,每個進程都有獨立的地址空間,操作系統(tǒng)給每個進程都分配一定的 CPU 執(zhí)行時間片炎辨,然后通過進程調(diào)度(時間片輪轉(zhuǎn)調(diào)度算法)來同時調(diào)度運行多個程序岳锁,因為調(diào)度時間被設(shè)置的非常短,模擬了好像每個程序都獨占地使用 CPU 的狀態(tài)蹦魔。如下圖:

CPU 調(diào)度

A激率,B,C勿决,D 每個進程都有固定的運行時間片乒躺。比如當進程 B 的時間片用完了,操作系統(tǒng)就保存 B 進程的狀態(tài)低缩,并將 CPU 切換到另外一個進程 A 去運行嘉冒,之后再次輪到 B 進程運行時,操作系統(tǒng)就恢復之前保存的狀態(tài)繼續(xù)執(zhí)行咆繁。這些切換的時間非常短讳推,以至于在單 CPU 上,可以模擬出「并行執(zhí)行」的效果玩般,但是實際上還是順序執(zhí)行银觅。但在多核 CPU 上,每個 CPU 都可以單獨運行一個程序坏为,那樣才是真正的并行執(zhí)行究驴。

進程地址空間 & 虛擬內(nèi)存

因為系統(tǒng)中同時存在多個進程镊绪,為了避免它們相互干擾,需要某種保護機制洒忧。通常每個進程有一些可以使用的內(nèi)存地址集合蝴韭,如果多個進程需要的總內(nèi)存比物理內(nèi)存小,那么可以在內(nèi)存中存放多個進程熙侍,如果有進程需要使用比物理內(nèi)存還要大的內(nèi)存榄鉴,那么在早期這個進程就不能運行了。

但是現(xiàn)在有一種稱為虛擬內(nèi)存的技術(shù)可以解決這個難題:操作系統(tǒng)創(chuàng)建一個地址空間的抽象蛉抓,作為進程可以引用的地址集合庆尘,例如 32 位上是 2^32 = 4 GB,這個地址空間被分割成一個個的頁面(page)芝雪,常見 4KB 大小。這些頁面被映射到物理內(nèi)存综苔,但并不是所有的頁面都在內(nèi)存中才可以運行程序惩系,而是只加載需要的部分:

  1. 當進程引用到的內(nèi)容在物理內(nèi)存中,就由硬件映射到進程地址空間中
  2. 當進程引用到的內(nèi)存不在物理內(nèi)存中如筛,就由操作系統(tǒng)負責將缺失的部分裝入物理內(nèi)存并重新執(zhí)行失敗的指令堡牡,這個過程也叫做「缺頁中斷」

在 32 bit 系統(tǒng)中,進程地址空間大小為 2 ^ 32 = 4 GB杨刨,具體分配如下圖:

進程地址空間

一個進程地址空間主要包含下面這些:

  1. 代碼段:只讀
  2. 數(shù)據(jù)段:初始化過的變量
  3. BSS 段:未初始化的變量
  4. 堆空間:低地址向高地址增長晤柄,調(diào)用 malloc 分配堆內(nèi)存
  5. 棧空間:高地址向低地址增長妖胀,自動增長和釋放芥颈,用于存儲臨時變量和函數(shù)調(diào)用
  6. 內(nèi)存映射空間:比如用于進程間通信(IPC)的共享內(nèi)存文件

其中每個部分都有很多可以學習的,這里只是介紹基本的的概念赚抡。

進程生命周期

進程主要的生命周期有 3 個爬坑,在不同的系統(tǒng)中都是大同小異:

  1. 運行
  2. 掛起
  3. 消亡

整個生命周期可以用下圖來表示:

進程狀態(tài)

例如在 Linux 中:

  1. 進程通過 fork 系統(tǒng)調(diào)用被創(chuàng)建,進入 TASK_RUNNING 準備運行狀態(tài)
  2. 如果此進程被內(nèi)核schedule 調(diào)度器調(diào)度運行涂臣,則會進入運行狀態(tài)TASK_RUNNING
  3. 如果進程睡眠或者等待 IO 則會處于任務掛起狀態(tài)(TASK_INTERRUPTIBLE)或(TASK_UNINTERRUPTIBLE)盾计,這兩者的區(qū)別是能否被中斷喚醒。
  4. 如果進程退出赁遗,例如調(diào)用 do_exit 則進入消亡狀態(tài)

進程表

在許多操作系統(tǒng)中署辉,與一個進程有關(guān)的所有信息,除了該進程自身地址空間的內(nèi)容以外岩四,均放在操作系統(tǒng)的一張表中哭尝,稱為進程表(process table),進程表是數(shù)組或者鏈表結(jié)構(gòu)剖煌,當前存在的每個進程都要占用其中的一項刚夺。每個表項描述的進程信息有下面 3 類:

  1. 進程管理信息:比如使用的寄存器狀態(tài)献丑,PSW,進程優(yōu)先級侠姑,父進程创橄,棧指針等等
  2. 文件管理信息:比如當前工作目錄,用戶 ID莽红,組 ID 等等
  3. 存儲管理信息:比如常見的進程的代碼段指針妥畏,數(shù)據(jù)段指針等等

進程樹

在 Linux 中一個進程可以創(chuàng)建子進程,子進程也可以創(chuàng)建子進程安吁,這樣就可形成一棵進程樹醉蚁,像下面這樣:

進程樹

在這個進程樹中,進程 A 創(chuàng)建了它的 2 個子進程 B 和 C鬼店,進程 B 又創(chuàng)建了它的 3 個子進程 D网棍,E,F(xiàn)妇智,這樣就形成了一顆樹滥玷,要注意的是,進程樹的深度一般是 2 - 3 層巍棱,不會太多惑畴。但是在 Windows 中卻沒有子進程和進程樹這些概念,Windows 上的進程都是平等的航徙。

僵尸進程 & 孤兒進程

有時候父子進程之間會出現(xiàn)點異常如贷,例如下面這兩種狀態(tài):

孤兒進程:父進程退出,而它的一個或多個子進程還在運行到踏,那么那些子進程將成為孤兒進程杠袱。孤兒進程將被 init 進程(進程號為 1) 所收養(yǎng),并由 init 進程對它們完成狀態(tài)收集工作窝稿,這樣的進程稱為孤兒進程霞掺。

僵尸進程:一個進程使用 fork 創(chuàng)建子進程,如果子進程退出讹躯,而父進程并沒有調(diào)用 waitwaitpid 獲取子進程的狀態(tài)信息菩彬,那么子進程的進程描述符仍然保存在系統(tǒng)中,這樣的進程稱之為僵尸進程潮梯。

結(jié)語

在學習 Linux 的進程之前骗灶,這些概念是需要了解的,這會幫助我們更好的理解和編寫進程相關(guān)的代碼秉馏。進程管理也是內(nèi)核中的一個非常重要的模塊耙旦,畢竟我們天天玩的都是一個個的進程,了解它的原理太有必要了萝究!

最后免都,感謝你的閱讀锉罐,我們下次再見 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绕娘,隨后出現(xiàn)的幾起案子脓规,更是在濱河造成了極大的恐慌,老刑警劉巖险领,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侨舆,死亡現(xiàn)場離奇詭異,居然都是意外死亡绢陌,警方通過查閱死者的電腦和手機挨下,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脐湾,“玉大人臭笆,你說我怎么就攤上這事〕诱疲” “怎么了愁铺?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長机杜。 經(jīng)常有香客問我帜讲,道長衅谷,這世上最難降的妖魔是什么椒拗? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮获黔,結(jié)果婚禮上蚀苛,老公的妹妹穿的比我還像新娘。我一直安慰自己玷氏,他們只是感情好堵未,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盏触,像睡著了一般渗蟹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赞辩,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天雌芽,我揣著相機與錄音,去河邊找鬼辨嗽。 笑死世落,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的糟需。 我是一名探鬼主播屉佳,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼谷朝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了武花?” 一聲冷哼從身側(cè)響起圆凰,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎髓堪,沒想到半個月后送朱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡干旁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年驶沼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片争群。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡回怜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出换薄,到底是詐尸還是另有隱情玉雾,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布轻要,位于F島的核電站复旬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冲泥。R本人自食惡果不足惜驹碍,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凡恍。 院中可真熱鬧志秃,春花似錦、人聲如沸嚼酝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闽巩。三九已至钧舌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涎跨,已是汗流浹背洼冻。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留六敬,地道東北人碘赖。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親普泡。 傳聞我的和親對象是個殘疾皇子播掷,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容