Linux進(jìn)程創(chuàng)建

進(jìn)程描述符

進(jìn)程描述符(process descriptor)包含了一個具體進(jìn)程的所有信息。他的結(jié)構(gòu)體定義在<linux/sched.h>中,代碼見linux/sched.h转质,類型為task_struct临庇。進(jìn)城描述符幾乎包含了所有進(jìn)程相關(guān)的上下文,下面簡單列舉了一些:

  • state: 描述了進(jìn)程的當(dāng)前狀態(tài)信息(runable=0, unrunable=-1, stopped>0)
  • pid: 唯一的進(jìn)程標(biāo)志
  • cpu / recent_used_cpu等cpu相關(guān)信息
  • mm等內(nèi)存相關(guān)信息
  • exitcode / exitstate等進(jìn)程退出相關(guān)信息荣月,通常由wait4()接收
  • 調(diào)度相關(guān)信息
  • parent / sibling: 父進(jìn)程和兄弟進(jìn)程等信息
  • fs / files / nsproxy: 文件系統(tǒng)信息,打開的文件描述符以及命名空間等信息
  • signal / signalhand: 信號量以及處理函數(shù)等信息
  • irq: 軟/硬中斷請求信息
  • bio_list / journal_info: 塊設(shè)備信息槐脏,文件系統(tǒng)日志信息等IO相關(guān)的上下文
  • cgroups: 控制組相關(guān)信息
  • thread: 線程相關(guān)上下文

進(jìn)程描述符的存放

在kernel<2.6中喉童,進(jìn)程的task_struct存放在各自的內(nèi)核棧的尾部,不過在后來的內(nèi)核中,由于使用了slab分配器來動態(tài)生成task_struct堂氯,所以還需要在棧尾部的thread_info中存放task_struct的指針蔑担。

在寄存器富裕的硬件體系架構(gòu),可能會有一個專門的寄存器用來存放當(dāng)前進(jìn)程task_struct的指針咽白,因為在內(nèi)核的進(jìn)程處理相關(guān)邏輯中啤握,這個結(jié)構(gòu)體經(jīng)常被用到。不過在x86這種寄存器不富裕的架構(gòu)晶框,當(dāng)通過current宏返回進(jìn)程描述符時排抬,就需要通過內(nèi)核棧尾部的thread_info尋找task_struct的位置了。

state 進(jìn)程狀態(tài)

當(dāng)內(nèi)核需要調(diào)整某個進(jìn)程的狀態(tài)時授段,可以使用set_task_state(task, state)蹲蒲,可以調(diào)整到如下五種狀態(tài):

  • runable=0
    • TASK_RUNNING: 進(jìn)程處于可執(zhí)行狀態(tài),它要么在執(zhí)行隊列中等待被執(zhí)行侵贵,要么正在被執(zhí)行
  • unrunable>0
    • TASK_INTERRUPTIBLE: 進(jìn)程處于阻塞狀態(tài)届搁,等待某些條件達(dá)成。當(dāng)收到信號的時候窍育,進(jìn)程會被提前喚醒卡睦。
    • TASK_UNINTERRUPTIBLE: 進(jìn)程處于阻塞狀態(tài),等待某些條件達(dá)成漱抓。這個狀態(tài)下會忽略信號表锻,不可中斷。
    • __TASK_TRACED: 進(jìn)程正在被其他進(jìn)程跟蹤乞娄,通常用于ptrace等調(diào)試工具調(diào)試
  • stopped=-1
    • __TASK_STOPPED: 進(jìn)程停止運行

進(jìn)程創(chuàng)建

當(dāng)調(diào)用fork創(chuàng)建子進(jìn)程時瞬逊,Linux會通過拷貝當(dāng)前進(jìn)程來創(chuàng)建子進(jìn)程。由于使用了寫時拷貝頁技術(shù)(CopyOnWrite)仪或,所以進(jìn)程的創(chuàng)建只需要復(fù)制頁表和創(chuàng)建進(jìn)程描述符码耐,速度是比較快的。

進(jìn)程拷貝調(diào)用鏈為fork -> clone -> do_fork(kernel/fork.c) -> copy_process溶其,其中copy_process

  1. 首先創(chuàng)建一個內(nèi)核棧,并拷貝父進(jìn)程的thread_info以及進(jìn)程描述符到內(nèi)核棧中
  2. 將進(jìn)程描述符中非繼承的統(tǒng)計量設(shè)初始值敦间,并將狀態(tài)置為TASK_UNINTERRUPTIABLE瓶逃,保證進(jìn)程不會運行
  3. 分配一個有效的PID
  4. 拷貝或共享打開的文件句柄,文件系統(tǒng)信息廓块,信號處理函數(shù)厢绝,進(jìn)城地址空間和命名空間等。
  5. 掃尾工作并返回子進(jìn)程指針
線程僅僅被視為與其他進(jìn)程共享某些資源的進(jìn)程

進(jìn)程終結(jié)

當(dāng)進(jìn)程顯式調(diào)用exit()或者main()函數(shù)返回隱式調(diào)用exit带猴,或者接收到無法處理/忽略的信號量或異常昔汉,就得調(diào)用do_exit來終結(jié)這個進(jìn)程:

  1. 狀態(tài)轉(zhuǎn)換,將task_struct中的flag設(shè)置為PF_EXITING
  2. 清理/釋放IPC信號拴清、地址空間靶病、定時器会通、文件引用計數(shù)等系統(tǒng)資源
  3. 在進(jìn)程描述符中設(shè)置exitcode,并設(shè)置exit_state為EXIT_ZOMBIE
  4. 最后調(diào)用schedule()切換到執(zhí)行新的進(jìn)程,該進(jìn)程結(jié)束
    不過還剩下了task_struct以及內(nèi)核棧中的數(shù)據(jù)沒有被釋放娄周,他們的作用就是通知父進(jìn)程涕侈,子進(jìn)程的結(jié)束狀態(tài)。父進(jìn)程將會收到一個信號量煤辨,此時可以通過wait來獲取exitcode以及刪除子進(jìn)程的參與信息(內(nèi)核棧裳涛,進(jìn)程描述符,線程信息)

孤兒進(jìn)程

當(dāng)一個父進(jìn)程退出時众辨,就需要為他的子進(jìn)程重新設(shè)置父進(jìn)程端三,來接收未來的exitcode。首先會嘗試在當(dāng)前進(jìn)程組中尋找一個進(jìn)程作為父親鹃彻,如果找不到郊闯,就讓init進(jìn)程作為父進(jìn)程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浮声,一起剝皮案震驚了整個濱河市虚婿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泳挥,老刑警劉巖然痊,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屉符,居然都是意外死亡剧浸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門矗钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唆香,“玉大人,你說我怎么就攤上這事吨艇」” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵东涡,是天一觀的道長冯吓。 經(jīng)常有香客問我,道長疮跑,這世上最難降的妖魔是什么组贺? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮祖娘,結(jié)果婚禮上失尖,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好掀潮,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布菇夸。 她就那樣靜靜地躺著,像睡著了一般胧辽。 火紅的嫁衣襯著肌膚如雪峻仇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天邑商,我揣著相機(jī)與錄音摄咆,去河邊找鬼。 笑死人断,一個胖子當(dāng)著我的面吹牛吭从,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恶迈,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼涩金,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暇仲?” 一聲冷哼從身側(cè)響起步做,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奈附,沒想到半個月后全度,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡斥滤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年将鸵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佑颇。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡顶掉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挑胸,到底是詐尸還是另有隱情痒筒,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布茬贵,位于F島的核電站凸克,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闷沥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一咐容、第九天 我趴在偏房一處隱蔽的房頂上張望舆逃。 院中可真熱鬧,春花似錦、人聲如沸路狮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奄妨。三九已至涂籽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砸抛,已是汗流浹背评雌。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留直焙,地道東北人景东。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像奔誓,于是被迫代替她去往敵國和親斤吐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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