linux 進(jìn)程管理

進(jìn)程

1.基本描述

  • 進(jìn)程是處于執(zhí)行期的程序以及相關(guān)的資源總稱谒臼。
  • 相關(guān)的資源:打開的文件艇挨,掛起的信號(hào),內(nèi)核內(nèi)部數(shù)據(jù)负懦,處理器的狀態(tài)筒捺,一個(gè)或是多個(gè)具有內(nèi)存映射的內(nèi)存地址空間及一個(gè)或多個(gè)執(zhí)行線程,存放全局變量的數(shù)據(jù)段等
  • 內(nèi)核調(diào)度的對(duì)象是線程纸厉,資源分配的對(duì)象是進(jìn)程
  • 每個(gè)線程都擁有獨(dú)立的程序計(jì)數(shù)器系吭、進(jìn)程棧和一組進(jìn)程寄存器。
  • 進(jìn)程提供兩種虛擬機(jī)制:虛擬處理器和虛擬內(nèi)存颗品,讓每個(gè)進(jìn)程都自己覺(jué)得好像是獨(dú)占處理器肯尺,獨(dú)占內(nèi)存一樣。
  • 內(nèi)核把進(jìn)程的列表存放在叫做任務(wù)隊(duì)列(task list)的雙向循環(huán)鏈表中抛猫,鏈表每一項(xiàng)都是task_struct(進(jìn)程描述符)的結(jié)構(gòu)蟆盹,大約1.7KB孩灯。包含{打開的文件闺金,進(jìn)程的地址空間,掛起的信號(hào)峰档,進(jìn)程的狀態(tài)}
  • 分配進(jìn)程描述符:linux是通過(guò)slab機(jī)制分配task_struct的败匹,可實(shí)現(xiàn)對(duì)象復(fù)用和緩存著色(cache coloring)
task_struct.jpg
  • 如圖寨昙,利用slab分配器動(dòng)態(tài)生成task_struct,在棧底創(chuàng)建一個(gè)新的數(shù)據(jù)結(jié)構(gòu)struct thread_info掀亩,每個(gè)任務(wù)的thread_info結(jié)構(gòu)在它的內(nèi)核棧的尾部分配舔哪,結(jié)構(gòu)中task域中存放的是指向該任務(wù)實(shí)際task_struct的指針。
  • 內(nèi)核通過(guò)一個(gè)唯一的進(jìn)程標(biāo)識(shí)值(process identification value)或是PID表示每個(gè)進(jìn)程
  • PID的最大默認(rèn)值為32768(short int)槽棍,可以通過(guò)修改/proc/sys/kernel/pid_max來(lái)提高上限捉蚤。
  • 如何通過(guò)current宏查找當(dāng)前正在運(yùn)行進(jìn)程的進(jìn)程描述符:1)對(duì)于寄存器充足的體系結(jié)構(gòu),有一個(gè)專門的寄存器存放當(dāng)前進(jìn)程的task_struct的指針炼七。2)x86體系在內(nèi)核棧的尾部創(chuàng)建thread_info結(jié)構(gòu)缆巧,通過(guò)計(jì)算偏移間接地查找task_struct結(jié)構(gòu)。

2.狀態(tài)轉(zhuǎn)移

process.jpg

linux上進(jìn)程有5種狀態(tài):

  1. 運(yùn)行(正在運(yùn)行或在運(yùn)行隊(duì)列中等待)
  2. 中斷(休眠中, 受阻, 在等待某個(gè)條件的形成或接受到信號(hào))
  3. 不可中斷(收到信號(hào)不喚醒和不可運(yùn)行, 進(jìn)程必須等待直到有中斷發(fā)生)
  4. 僵死(進(jìn)程已終止, 但進(jìn)程描述符存在, 直到父進(jìn)程調(diào)用wait4()系統(tǒng)調(diào)用后釋放)
  5. 停止(進(jìn)程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號(hào)后停止運(yùn)行運(yùn)行)

ps工具標(biāo)識(shí)進(jìn)程的5種狀態(tài)碼:

  1. D 不可中斷 uninterruptible sleep (usually IO)
  2. R 運(yùn)行 runnable (on run queue)
  3. S 中斷 sleeping
  4. T 停止 traced or stopped
  5. Z 僵死 a defunct (”zombie”) process

3.進(jìn)程樹(pstree)

  • 再次注意進(jìn)程在任務(wù)列表中豌拙,是以循環(huán)鏈表連接的陕悬。
  • 進(jìn)程樹的樹根是0號(hào)進(jìn)程idle,是所有進(jìn)程的祖先按傅。
  1. 0號(hào)進(jìn)程創(chuàng)建1號(hào)進(jìn)程(創(chuàng)建時(shí)是內(nèi)核線程)捉超,1號(hào)進(jìn)程負(fù)責(zé)內(nèi)核部分的初始化工作及系統(tǒng)配置,創(chuàng)建高速緩存和虛擬內(nèi)存管理的內(nèi)核線程
  2. 1號(hào)進(jìn)程調(diào)?execve()運(yùn)?磁盤上的init可執(zhí)?程序唯绍,并演變?yōu)?戶態(tài)1號(hào)進(jìn)程拼岳,init進(jìn)程
  3. init進(jìn)程按照配置?件/etc/initab的要求,完成系統(tǒng)啟動(dòng)?作推捐,創(chuàng)建編號(hào)為1號(hào)裂问,2號(hào),……的Getty進(jìn)程(初始化終端)
  4. getty進(jìn)程監(jiān)控到終端連接信號(hào)時(shí)牛柒,通過(guò)調(diào)用execve()執(zhí)行l(wèi)ogin登錄程序
  5. 如果登錄成功過(guò)堪簿,login程序通過(guò)execve()函數(shù)調(diào)用shell
  6. Shell進(jìn)程接收getty進(jìn)程的pid,取代原來(lái)的getty進(jìn)程皮壁。
  • 0號(hào)進(jìn)程idle
  1. idle進(jìn)程只能從靜態(tài)地填寫thread_inf o和task_struct
  2. idle進(jìn)程讓CPU陷入空閑循環(huán)椭更,空閑運(yùn)行
  3. 多處理器上剛啟動(dòng)只有一個(gè)CPU能運(yùn)行,只有CPU0上的idle進(jìn)程完成初始化后才激活其它CPU蛾魄,并通過(guò)copy_process()創(chuàng)建其他CPU的idle進(jìn)程

4.進(jìn)程的創(chuàng)建與撤銷

  • 在Linux系統(tǒng)中虑瀑,系統(tǒng)通過(guò)fork()函數(shù)復(fù)制一個(gè)現(xiàn)有的進(jìn)程創(chuàng)建一個(gè)新進(jìn)程。接著滴须,調(diào)用exec()函數(shù)創(chuàng)建新進(jìn)程的地址空間舌狗,并把新程序載入其中。最終扔水,程序通過(guò)調(diào)用exit()系統(tǒng)調(diào)用退出運(yùn)行痛侍。進(jìn)程退出后被設(shè)置為僵死狀態(tài),直到父進(jìn)程檢查之后調(diào)用wait()魔市,才刪除進(jìn)程描述符資源主届。
  • frok赵哲,vfork,clone函數(shù)(重點(diǎn))
    Linux中fork君丁,vfork和clone詳解(區(qū)別與聯(lián)系)
  1. fork:fork創(chuàng)建的子進(jìn)程是父進(jìn)程的完整副本枫夺,==復(fù)制==父進(jìn)程的全部資源,包括內(nèi)存的task_struct內(nèi)容绘闷。復(fù)制父進(jìn)程的頁(yè)表(虛擬地址相同)
  2. vfork:vfork創(chuàng)建的子進(jìn)程與父進(jìn)程==共享==所有的內(nèi)存橡庞,而且由vfork創(chuàng)建的子進(jìn)程先于父進(jìn)程運(yùn)行。(exit()退出)印蔗,子進(jìn)程在vfork()返回后直接運(yùn)行在父進(jìn)程的棻兴溃空間,并使用父進(jìn)程的內(nèi)存和數(shù)據(jù)喻鳄。這意味著子進(jìn)程可能破壞父進(jìn)程的數(shù)據(jù)結(jié)構(gòu)或棧扼倘,造成失敗。
  3. clone:linux提供的創(chuàng)建線程的系統(tǒng)調(diào)用除呵≡倬眨可以傳入很多參數(shù),選擇性的繼承父進(jìn)程的資源(clone_vm//clone_vfork),不再?gòu)?fù)制父進(jìn)程的椦赵空間纠拔,而是自己創(chuàng)建一個(gè)新的。(在linux下系統(tǒng)堆椃汉溃空間是2頁(yè)面稠诲,就是8K的內(nèi)存,其中在這塊內(nèi)存中诡曙,低地址上放入了值臀叙,這個(gè)值就是進(jìn)程控制塊task_struct的值)
  4. copy-on-write:
  5. 底層do_fork函數(shù)的實(shí)現(xiàn)
  • 各種進(jìn)程:
  1. 前臺(tái)進(jìn)程:它會(huì)獨(dú)占命令行窗口,只有運(yùn)行完了或者手動(dòng)中止价卤,才能執(zhí)行其他命令劝萤。
  2. 后臺(tái)進(jìn)程:&

1.繼承當(dāng)前 session(對(duì)話)的標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯(cuò)誤(stderr)。因此慎璧,后臺(tái)任務(wù)的所有輸出依然會(huì)同步地在命令行下顯示床嫌。

2.不再繼承當(dāng)前 session的標(biāo)準(zhǔn)輸入(stdin)。你無(wú)法向這個(gè)任務(wù)輸入指令了胸私。如果它試圖讀取標(biāo)準(zhǔn)輸入厌处,就會(huì)暫停執(zhí)行(halt)。

  1. 守護(hù)進(jìn)程:特殊的后臺(tái)進(jìn)程岁疼,運(yùn)行在后臺(tái)阔涉,不受任何終端控制(syslogd、login、crond洒敏、at系統(tǒng)守護(hù)進(jìn)程)

1.創(chuàng)建子進(jìn)程,終止父進(jìn)程

2.在子進(jìn)程中創(chuàng)建新會(huì)話

3.改變工作目錄

4.重設(shè)文件創(chuàng)建的掩碼

5.關(guān)閉當(dāng)前文件描述符

  1. 孤兒進(jìn)程:父進(jìn)程先于子進(jìn)程結(jié)束疙驾,子進(jìn)程沒(méi)了父親凶伙,會(huì)交付給init進(jìn)程,處理回收工作它碎。
  2. 僵尸進(jìn)程:子進(jìn)程結(jié)束函荣,并未被父進(jìn)程調(diào)用wait函數(shù)回收,

進(jìn)程與線程

  1. 區(qū)別:
  • 進(jìn)程是資源分配的基本單位扳肛,線程是調(diào)度的基本單位傻挂。
  • 實(shí)體間(進(jìn)程間,線程間挖息,進(jìn)線程間)通信方式的不同:

進(jìn)程間通信:共享內(nèi)存金拒、消息隊(duì)列、信號(hào)量套腹、有名管道绪抛、匿名管道、socket电禀、信號(hào)幢码、文件。
線程間通信:線程間的通信方式可沿用上述進(jìn)程間的方式尖飞,且還有獨(dú)特的幾種方式:互斥量症副、自旋鎖、條件變量政基、讀寫鎖贞铣、線程信號(hào)、全局變量沮明。

  • 進(jìn)程有??關(guān)系咕娄,線程只有?個(gè)?線程,其他都為?線程
  1. 多線程優(yōu)勢(shì):
  • ==空間的花費(fèi)==:它是一種非常"節(jié)儉"的多任務(wù)操作方式珊擂,在Linux系統(tǒng)下圣勒,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)自的地址空間,建立眾多的數(shù)據(jù)表來(lái)維護(hù)它的代碼段摧扇、堆棧段和數(shù)據(jù)段圣贸,這是一種"昂貴"的多任務(wù)工作方式。而運(yùn)行于進(jìn)程中的多個(gè)線程扛稽,它們彼此之間使用相同的地址空間吁峻,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間,而且用含,線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間矮慕。
  • ==線程間方便的通信機(jī)制==。對(duì)不同進(jìn)程來(lái)說(shuō)啄骇,它們具有獨(dú)自的數(shù)據(jù)空間痴鳄,要進(jìn)行數(shù)據(jù)的傳遞只能通過(guò)通信的方式進(jìn)行,這種方式不僅費(fèi)時(shí)缸夹,而且很不方便痪寻。線程則不然,由于****同一進(jìn)程下的線程之間共享數(shù)據(jù)空間****虽惭,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用橡类,這不僅快捷,而且方便芽唇。
  • 使多CPU系統(tǒng)更加有效顾画。操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)時(shí),不同的線程運(yùn)行于不同的CPU上匆笤。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亲雪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疚膊,更是在濱河造成了極大的恐慌义辕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寓盗,死亡現(xiàn)場(chǎng)離奇詭異灌砖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)傀蚌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門基显,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人善炫,你說(shuō)我怎么就攤上這事撩幽。” “怎么了箩艺?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窜醉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我艺谆,道長(zhǎng)榨惰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任静汤,我火速辦了婚禮琅催,結(jié)果婚禮上居凶,老公的妹妹穿的比我還像新娘。我一直安慰自己藤抡,他們只是感情好侠碧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缠黍,像睡著了一般弄兜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫁佳,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音谷暮,去河邊找鬼蒿往。 笑死,一個(gè)胖子當(dāng)著我的面吹牛湿弦,可吹牛的內(nèi)容都是我干的瓤漏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼颊埃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔬充!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起班利,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饥漫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后罗标,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庸队,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年闯割,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彻消。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宙拉,死狀恐怖宾尚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谢澈,我是刑警寧澤煌贴,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站锥忿,受9級(jí)特大地震影響崔步,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缎谷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一井濒、第九天 我趴在偏房一處隱蔽的房頂上張望灶似。 院中可真熱鬧,春花似錦瑞你、人聲如沸酪惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)春感。三九已至,卻和暖如春虏缸,著一層夾襖步出監(jiān)牢的瞬間鲫懒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工刽辙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窥岩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓宰缤,卻偏偏與公主長(zhǎng)得像颂翼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慨灭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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

  • Linux進(jìn)程管理原理 Linux的進(jìn)程管理氧骤,就是對(duì)硬件各資源進(jìn)行分配呻疹、調(diào)度、銷毀等工作筹陵,其主要部件的管理為:CP...
    魏鎮(zhèn)坪閱讀 1,240評(píng)論 0 6
  • 又來(lái)到了一個(gè)老生常談的問(wèn)題诲宇,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問(wèn)題開始惶翻,來(lái)談?wù)劜?..
    tangsl閱讀 4,134評(píng)論 0 23
  • Linux 進(jìn)程管理與程序開發(fā) 進(jìn)程是Linux事務(wù)管理的基本單元姑蓝,所有的進(jìn)程均擁有自己獨(dú)立的處理環(huán)境和系統(tǒng)資源,...
    JamesPeng閱讀 2,471評(píng)論 1 14
  • 俗話說(shuō):民以食為天吕粗!吃纺荧,自然成了日常嘴邊常嘮的話題。說(shuō)到吃颅筋,我最喜歡的還是各類水果宙暇,喜歡各式水果里的酸酸甜甜和水潤(rùn)...
    Bonnie的書房閱讀 283評(píng)論 0 0
  • 今天在空間看見(jiàn)你的說(shuō)說(shuō)。 照片上仍舊是長(zhǎng)得眉目如畫的人兒议泵。 只是比以往多了幾分自信與英氣占贫。 你說(shuō)一年過(guò)去了,不說(shuō)好...
    張泊寧閱讀 391評(píng)論 0 1