一、進程4要素
1、有一段程式供其執行。這段程式不一定是某個進程專用,可以和其他進程共用
2、有進程專用的核心空間堆棧
3、在核心中有一個 task_struct 資料結構(實際上就是PCB 進程式控制制塊)
4、有獨立的使用者空間
PS. Linux系統中 進程、使用者線程、核心線程 的辨析:(記住這個圖就好)
二、進程描述
1、在Linux中,線程、進程都是用 struct task_struct 來表示(該資料結構就是我們說的PCB了),它包含了大量描述進程/線程 的資訊,這裡只列出來一些比較重要的
(1)pid_t pid; //進程號,最大值10億。 實際上線程(使用者線程、核心線程)和進程都對應一個pid
(2)volatile long state; //進程狀態
== TASK_RUNNING ,對應著就緒和執行態,進程剛被建立就處於TASK_RUNNING。所以說只要一個進程能夠執行,就處於TASK_RUNNING
== TASK_INTERRPTIBLE,對應著阻塞態中的可中斷的阻塞。(除了等待條件為真時可以被喚醒,也可以通過訊號或中斷喚醒它)
== TASK_UNINTERRPTIBLE,對應著阻塞態中的不可中斷的阻塞。(只有等待資源有效時才喚醒,不可以通過訊號或中斷喚醒它)
== TASK_STOPPED,對應著阻塞態中的終止執行。當接收到SIGSTOP和SIGTSTP等訊號時,進程進入該狀態,接收到SIGCONT訊號後,進程重新回到TASK_RUNNING。
== TASK_KILLABLE,對應著阻塞態中的睡眠態,原理類似於TASK_UNINTERRPTIBLE,但是可以被致命訊號 SIGKILL喚醒
== TASK_TRACED,處於調試狀態的進程。我們在調試代碼階段可以控制進程停止、運行等
== TASK_DEAD,進程退出時(調用 do_exit),state欄位被設定為該狀態
(3)int exit_state; //進程退出時的狀態(Linux把進程退出又分成很多狀態,它不是一下由TASK_RUNNING 變成 TASK_DEAD的)
== EXIT_ZOMBIE(僵死進程):進程的執行被終止,但父進程還沒有發布waitpid()來收集有關死亡進程的資訊。(人死了,屍體還留在那)
== EXIT_DEAD(僵死撤銷狀態): 表示進程的最終狀態。父進程已經使用wait4()或waitpid()系統調用來收集資訊,因此進程將由系統刪除。(人死了,屍體也燒了)
2、struct mm_struct * mm; //進程使用者空間描述指標,核心線程該指標為空白(因為沒有)
3、unsigned int policy; //該進程的調度策略
4、int prio; //進程優先順序,在(0-MAX_PRIO - 1)範圍內屬於即時進程。在(MAX_RT_PRIO - MX_PRIO-1)屬於非即時進程。MAX_PRIO==100。
5、int static_prio;//靜態優先順序
6、struct sched_rt_entiry rt; rt->time_slic; //時間片,進程預設情況下的時間片與進程的靜態優先順序有關
7、struct 在核心中的分布圖:
由於隨著核心的不斷髮展擴大,是的task_struct的內容不斷增多,為了固定一個進程描述資訊的固定大小(一個或兩個頁面),這樣從2.6核心以後,我們把task_struct 獨立出去,用thread_info struct取代了原來的task_struct的位置,然後在thread_info 中設定一個指標指向外面的task_struct,這樣就保證了進程的固定大小
8、current:在linux核心中用current指標指向當前正在啟動並執行進程的task_struct
三、進程建立圖
四、進程銷毀圖
進程銷毀可以通過幾個事件驅動:正常的進程結束、訊號、或exit函數的調用。不管如何退出,進程的結束都要藉助核心功能do_exit的調用