主要內(nèi)容:
- 進(jìn)程概念
- 進(jìn)程生命周期
- 進(jìn)程的創(chuàng)建
- 命名空間機(jī)制
1、進(jìn)程概念
????進(jìn)程也即是在機(jī)器中運(yùn)行的程序,在系統(tǒng)中資源分配是以進(jìn)程為單位進(jìn)行分配。在Linux內(nèi)核中進(jìn)程是用task_struct結(jié)構(gòu)體來(lái)表示的,他可以分為實(shí)時(shí)進(jìn)程和非實(shí)時(shí)進(jìn)程。
- 實(shí)時(shí)進(jìn)程:它必須在可保證的時(shí)間范圍內(nèi)得到處理。這類進(jìn)程他的實(shí)時(shí)性要求比較高,低延遲。
- 非實(shí)時(shí)進(jìn)程:大多數(shù)進(jìn)程的運(yùn)行沒有時(shí)間約束的普通進(jìn)程,但是還是會(huì)根據(jù)重要性來(lái)分配優(yōu)先級(jí)。
2、進(jìn)程生命周期
????在Linux中進(jìn)程的狀態(tài)主要有運(yùn)行、等待和睡眠三種狀態(tài),進(jìn)程在這3種狀態(tài)中切換過程就構(gòu)成了進(jìn)程的生命周期。
- 運(yùn)行:進(jìn)程獲得了cpu時(shí)間片,此刻在cpu中執(zhí)行。
- 等待:進(jìn)程所需資源都已獲得分配,獲得了運(yùn)行前的所有資源,等待分配cpu時(shí)間片執(zhí)行,此刻進(jìn)程是在就緒隊(duì)列中排隊(duì),等待調(diào)度器的調(diào)度執(zhí)行。
- 睡眠:進(jìn)程在等待外部事件,調(diào)度器無(wú)法在下一次任務(wù)切換時(shí)選擇調(diào)度該進(jìn)程。
????在Linux中的task_struct結(jié)構(gòu)中的state字段用來(lái)表示當(dāng)前進(jìn)程的狀態(tài): - TASK_RUNNING:表示進(jìn)程處于可運(yùn)行狀態(tài)。
- TASK_INTERRUPTIBLE:表示進(jìn)程等待外部事件或其他資源的睡眠狀態(tài)
- TASK_UNINTERRUPTIBLE:表示因內(nèi)核而停用的睡眠進(jìn)程,他不能由外部信號(hào)喚醒,必須由內(nèi)核喚醒。
- EXIT_ZOMBIE:表示僵尸狀態(tài)
-
EXIT_DEAD:wait系統(tǒng)調(diào)用已發(fā)出,當(dāng)前進(jìn)程完全從系統(tǒng)移除之前的狀態(tài)。
linux進(jìn)程生命周期.png
????僵尸進(jìn)程:資源都已經(jīng)釋放,但進(jìn)程表中仍然有表項(xiàng),ps命令依然能查到對(duì)應(yīng)的進(jìn)程信息。進(jìn)程銷毀必須滿足兩個(gè)條件,其一,程序必須由另一個(gè)進(jìn)程或用戶殺死,其二,進(jìn)程的父進(jìn)程在子進(jìn)程終止時(shí)必須調(diào)用wait4系統(tǒng)調(diào)用,這相當(dāng)于向內(nèi)核證實(shí)父進(jìn)程已經(jīng)確認(rèn)子進(jìn)程的終結(jié)。該系統(tǒng)調(diào)用使得內(nèi)核可以釋放為子進(jìn)程保留的資源。僵尸進(jìn)程就是在第一個(gè)條件發(fā)生而第二個(gè)條件不成立的條件的情況下的狀態(tài)。
3、進(jìn)程創(chuàng)建
????在UNIX中新進(jìn)程是使用fork和exec系統(tǒng)調(diào)用產(chǎn)生的:
- fork:生成當(dāng)前進(jìn)程的一個(gè)完整相同的副本,該副本稱為子進(jìn)程。除了pid不同,其它的都是相同的。
- exec:從一個(gè)可執(zhí)行的二進(jìn)制文件加載另一個(gè)應(yīng)用程序,來(lái)代替當(dāng)前運(yùn)行的進(jìn)程。exec并不創(chuàng)建新進(jìn)程,所以必須先通過fork復(fù)制一個(gè)舊程序,然后調(diào)用exec在系統(tǒng)中創(chuàng)建另一個(gè)應(yīng)用程序。
????Linux還提供了clone系統(tǒng)調(diào)用來(lái)創(chuàng)建進(jìn)程或線程,只是對(duì)應(yīng)的調(diào)用clone函數(shù)對(duì)應(yīng)的參數(shù)不同。
4、命名空間
????本質(zhì)上,命名空間建立了系統(tǒng)的不同視圖。Linux中通過采用層次結(jié)構(gòu)來(lái)表示命名空間,子命名空間的內(nèi)容對(duì)父命名空間是可見的。Docker容器技術(shù)就是在namespace機(jī)制的基礎(chǔ)上實(shí)現(xiàn)的
