核心將所有程序存放在雙向迴圈鍊錶(程序鍊錶)中,鍊錶的節點都是task_struct,稱為程序控制塊的結構。該結構包含了與乙個程序相關的所有資訊,如程序的狀態、程序的基本資訊、程序識別符號、記憶體相關資訊、父程序相關資訊、與程序相關的終端資訊、當前工作目錄、開啟的檔案資訊、所接收的訊號資訊等。
下面將詳細闡述task_struct結構中最為重要的兩個域:state(程序狀態)和pid(程序識別符號)。
程序狀態
linux中的程序有以下幾種主要狀態。
(1)執行態(task_running):程序當前正在執行,或者正在執行佇列中等待排程。
(2)可中斷的睡眠態(task_interruptible):程序處於阻塞(睡眠)狀態,正在等待某些事件發生或能夠占用某些資源。處在這種狀態下的程序可以被訊號中斷。接收到訊號或被顯式地喚醒呼叫(如呼叫wake_up系列巨集:wake_up、wake_up_interruptible等)喚醒之後,程序將轉變為task_running狀態。
(3)不可中斷的睡眠態(task_uninterruptible):此程序狀態類似於可中斷的阻塞狀態(task_interruptible),只是它不會處理訊號,把訊號傳遞到這種狀態下的程序不能改變它的狀態。只有在它所等待的事件發生時,程序才被顯式地喚醒呼叫喚醒。
(4)停止態(task_stopped):程序的執行被暫停,當程序收到sigstop、sigtstp、sigttin、sigttou等訊號,就會進入暫停狀態。
(5)殭屍態(exit_zombie):子程序執行結束,父程序未退出,並且未使用wait函式族(如使用waitpid()函式)等系統呼叫來**子程序的資源。處在該狀態下的子程序已經放棄了幾乎所有的記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態等資訊供其父程序收集。
(6)消亡態(exit_dead):即程序退出,不占用任何資源,更不會被排程,該狀態不可見。
程序識別符號
linux核心通過唯一的程序識別符號(程序的身份證號)pid(process id)來標識每個程序。pid存放在task_struct的pid欄位中。
當系統啟動後,核心通常作為某乙個程序的代表。乙個指向task_struct的巨集current用來記錄正在執行的程序。current經常作為程序描述符結構指標的形式出現在核心**中,例如,current->pid表示處理器正在執行的程序的pid。當系統需要檢視所有的程序時,則呼叫for_each_process()巨集,這將比系統搜尋陣列的速度要快得多。
在linux中獲得當前程序的程序號(pid)和父程序號(ppid)的系統呼叫函式分別為getpid()和getppid()。
程序識別符號操作函式
每個程序都有乙個非負整型表示的唯一程序 id。雖說是唯一的,但程序 id 是可復用的,當乙個程序終止時,其程序 id 就成為復用的候選者。多數 unix 系統使用延遲復用演算法,使得賦予新建程序的 id 不同於最近終止程序的 id,以免將新程序誤認為是使用同一 id 的某個已終止的先前程序。系統中有...
變數與識別符號學習
一 變數 1.變數的定義 在程式執行期間其值可以改變的量稱為變數,乙個變數在記憶體中佔據乙個儲存單元 2.變數的要素 變數名 變數值 變數的儲存單元 3.變數先宣告再使用 4.變數初始化 變數型別 變數名 初值,變數名 初值,初值可以是常量,也可以是乙個有確定值得表達 5.在使用之前,變數應有確定的...
識別符號與注釋(二)
識別符號只能由字母 數字 下劃線組成。只能以字母和下劃線開頭。識別符號對大小寫敏感。在 python 3 中,可以用中文作為變數名,非 ascii 識別符號也是允許的了。不可以用作其他任何識別符號使用 例項 1 usr bin python3 第乙個python注釋 print hello,worl...