1. 進程狀態(State)
進程執行時,它會根據具體情況改變狀態 。進程狀態是調度和對換的依據。Linux中的進程主要有如下狀態,如表4.1所示。
| 核心表示 |
含義 |
| TASK_RUNNING |
可運行 |
| TASK_INTERRUPTIBLE |
可中斷的等待狀態 |
| TASK_UNINTERRUPTIBLE |
不可中斷的等待狀態 |
| TASK_ZOMBIE |
僵死 |
| TASK_STOPPED |
暫停 |
| TASK_SWAPPING |
換入/換出 |
表4.1 Linux進程的狀態
·可運行狀態
處於這種狀態的進程,要麼正在運行、要麼正準備運行。正在啟動並執行進程就是當前進程(由current所指向的進程),而準備啟動並執行進程只要得到CPU就可以立即投入運行,CPU是這些進程唯一等待的系統資源。系統中有一個運行隊列(run_queue),用來容納所有處於可運行狀態的進程,發送器執行時,從中選擇一個進程投入運行。在後面我們討論進程調度的時候,可以看到運行隊列的作用。當前運行進程一直處於該隊列中,也就是說,current總是指向運行隊列中的某個元素,只是具體指向誰由發送器決定。
·等待狀態
處於該狀態的進程正在等待某個事件(event)或某個資源,它肯定位於系統中的某個等待隊列(wait_queue)中。Linux中處於等待狀態的進程分為兩種:可中斷的等待狀態和不可中斷的等待狀態。處於可中斷等待態的進程可以被訊號喚醒,如果收到訊號,該進程就從等待狀態進入可運行狀態,並且加入到運行隊列中,等待被調度;而處於不可中斷等待態的進程是因為硬體環境不能滿足而等待,例如等待特定的系統資源,它任何情況下都不能被打斷,只能用特定的方式來喚醒它,例如喚醒函數wake_up()等。
·暫停狀態
此時的進程暫時停止運行來接受某種特殊處理。通常當進程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU訊號後就處於這種狀態。例如,正接受調試的進程就處於這種狀態。
·僵死狀態
進程雖然已經終止,但由於某種原因,父進程還沒有執行wait()系統調用,終止進程的資訊也還沒有回收。顧名思義,處於該狀態的進程就是死進程,這種進程實際上是系統中的垃圾,必須進行相應處理以釋放其佔用的資源。
2. 進程調度資訊
發送器利用這部分資訊決定系統中哪個進程最應該運行,並結合進程的狀態資訊保證系統運轉的公平和高效。這一部分資訊通常包括進程的類別(普通進程還是即時進程)、進程的優先順序等等。如表4.2所示:
| 網域名稱 |
含義 |
| need_resched |
調度標誌 |
| Nice |
靜態優先順序 |
| Counter |
動態優先順序 |
| Policy |
調度策略 |
| rt_priority |
即時優先順序 |
表4.2 進程調度資訊
在下一章的進程調度中我們會看到,當need_resched被設定時,在“下一次的調度機會”就調用發送器schedule()。 counter代表進程剩餘的時間片,是進程調度的主要依據,也可以說是進程的動態優先順序,因為這個值在不斷地減少;nice是進程的靜態優先順序,同時也代表進程的時間片,用於對counter賦值,可以用nice()系統調用改變這個值;policy是適用於該進程的調度策略,即時進程和普通進程的調度策略是不同的;rt_priority只對即時進程有意義,它是即時進程調度的依據。
進程的調度策略有三種,如表4.3所示。
| 名稱 |
解釋 |
適用範圍 |
| SCHED_OTHER |
其他調度 |
普通進程 |
| SCHED_FIFO |
先來先服務調度 |
即時進程 |
| SCHED_RR |
時間片輪轉調度 |
表4.3 進程調度的策略
只有root使用者能通過sched_setscheduler()系統調用來改變調度策略。
3 .標識符(Identifiers)
每個進程有進程標識符、使用者識別碼、群組識別碼,如表4.4所示。
不管對核心還是普通使用者來說,怎麼用一種簡單的方式識別不同的進程呢。這就引入了進程標識符(PID:process identifier),每個進程都有一個唯一的標識符,核心通過這個標識符來識別不同的進程,同時,進程標識符PID也是核心提供給使用者程式的介面,使用者程式通過PID對進程發號施令。PID是32位的不帶正負號的整數,它被順序編號:新建立進程的PID通常是前一個進程的PID加1。然而,為了與16位硬體平台的傳統Linux系統保持相容,在Linux上允許的最大PID號是32767,當核心在系統中建立第32768個進程時,就必須重新開始使用已閑置的PID號。
| 網域名稱 |
含義 |
| Pid |
進程標識符 |
| Uid、gid |
使用者識別碼、群組識別碼 |
| Euid、egid |
有效使用者識別碼、有效群組識別碼 |
| Suid、sgid |
備份使用者識別碼、備份群組識別碼 |
| Fsuid、fsgid |
檔案系統使用者識別碼、檔案系統群組識別碼 |
表4.4 各種標識符
另外,每個進程都屬於某個使用者組。task_struct結構中定義有使用者識別碼和群組識別碼。它們同樣是簡單的數字,這兩種標識符用於系統的安全控制。系統通過這兩種標識符控制進程對系統中檔案和裝置的訪問,其它幾個標識符將在檔案系統中討論。
4. 進程通訊有關資訊(IPC:Inter_Process Communication)
為了使進程能在同一項任務上協調工作,進程之間必須能進行通訊即交流資料。