無論是windows還是linux系統都涉及程序和執行緒的概念。程序是系統排程的最小單位,執行緒是系統資源分配的最小單位。程序/執行緒排程(低階排程)的效能直接影響作業系統的效能。以下主要想討論以下linux系統的程序管理。
linux系統中通過呼叫fork()系統呼叫建立新程序的,該系統呼叫通過複製乙個現有的程序來建立乙個新程序。fork()系統呼叫從核心返回兩次:一次回到父程序,另一次回到新的子程序。
通常,建立新的程序都是為了馬上執行!在linux中,呼叫exec*()這族函式可以建立新的位址空間,並把新的程序載入。程序通過呼叫exit()系統呼叫退出執行。
linux核心把程序存放在任務佇列(task list)雙向鍊錶中。鍊錶中每一項都是task_struct型別,稱為程序描述符的結構,祥見linux/sched.**件
// 這裡是任務(程序)資料結構,或稱為程序描述符。
// *************************=
// long state 任務的執行狀態(-1 不可執行,0 可執行(就緒),>0 已停止)。
// long counter 任務執行時間計數(遞減)(滴答數),執行時間片。
// long priority 執行優先數。任務開始執行時counter = priority,越大執行越長。
// long signal 訊號。是點陣圖,每個位元位代表一種訊號,訊號值=位偏移值+1。
// struct sigaction sigaction[32] 訊號執行屬性結構,對應訊號將要執行的操作和標誌資訊。
// long blocked 程序訊號遮蔽碼(對應訊號位圖)。
// --------------------------
// int exit_code 任務執行停止的退出碼,其父程序會取。
// unsigned long start_code **段位址。
// unsigned long end_code **長度(位元組數)。
// unsigned long end_data **長度 + 資料長度(位元組數)。
// unsigned long brk 總長度(位元組數)。
// unsigned long start_stack 堆疊段位址。
// long pid 程序標識號(程序號)。
// long father 父程序號。
// long pgrp 父程序組號。
// long session 會話號。
// long leader 會話首領。
// unsigned short uid 使用者標識號(使用者id)。
// unsigned short euid 有效使用者id。
// unsigned short suid 儲存的使用者id。
// unsigned short gid 組標識號(組id)。
// unsigned short egid 有效組id。
// unsigned short sgid 儲存的組id。
// long alarm 報警定時值(滴答數)。
// long utime 使用者態執行時間(滴答數)。
// long stime 系統態執行時間(滴答數)。
// long cutime 子程序使用者態執行時間。
// long cstime 子程序系統態執行時間。
// long start_time 程序開始執行時刻。
// unsigned short used_math 標誌:是否使用了協處理器。
// --------------------------
// int tty 程序使用tty 的子裝置號。-1 表示沒有使用。
// unsigned short umask 檔案建立屬性遮蔽位。
// struct m_inode * pwd 當前工作目錄i 節點結構。
// struct m_inode * root 根目錄i 節點結構。
// struct m_inode * executable 執行檔案i 節點結構。
// unsigned long close_on_exec 執行時關閉檔案控制代碼位圖標誌。(參見include/fcntl.h)
// struct file * filp[nr_open] 程序使用的檔案表結構。
// --------------------------
// struct desc_struct ldt[3] 本任務的區域性表描述符。0-空,1-**段cs,2-資料和堆疊段ds&ss。
// --------------------------
// struct tss_struct tss 本程序的任務狀態段資訊結構。
// *************************=
struct task_struct
;
每個程序的核心棧底部還分配了乙個thread_info的結構資料,使在彙編**中計算其偏移量變得相對簡單。thread_info結構定義在asm/thread_info.**件中。
current_thread_info()->task
在linux中,程序有五種狀態:(在linux/sched.**件中定義)
// 這裡定義了程序執行可能處的狀態。
#define task_running 0 // 程序正在執行或已準備就緒。
#define task_interruptible 1 // 程序處於可中斷等待狀態。
#define task_uninterruptible 2 // 程序處於不可中斷等待狀態,主要用於i/o 操作等待。
#define task_zombie 3 // 程序處於僵死狀態,已經停止執行,但父程序還沒發訊號。
#define task_stopped 4 // 程序已停止。
[img]
在task_struct的state域中儲存程序的狀態。設定某程序的狀態,可以通過set_task_state(task,state)函式完成。當然也可以使用set_current_state(state)。
LINUX程序管理
1.程序是什麼?乙個程序就是出於執行期的程式,包括 可執行程式 段 開啟的檔案,掛起的訊號,核心內部資料,處理器狀態,位址空間,乙個或多個執行執行緒,當然還包括用來存放全域性變數的資料段,等等.2.什麼是執行緒?它和程序的關係是什麼樣的?執行緒在linux中具體是怎麼樣實現的?是在程序中活動的物件,...
linux程序管理
程序的監控 使用ps aux 檢視當前所有程序。可以使用top檢視當前程序自動更新列表,在top中m 按記憶體大小排列,p 按cpu佔用率排列 終止和管理程序 程序之間通過訊號來進行通訊 top和kill都用於向程序傳送訊號。kill l顯示訊號編號表。kill 9 pid kill pid 向pi...
Linux 程序管理
1.linux程序管理工具,包括ps pgrep top kill killall pkill 等 常用 ps aux 或lax輸出的解釋 user 程序的屬主 pid 程序的id ppid 父程序 cpu 程序占用的cpu百分比 mem 占用記憶體的百分比 ni 程序的nice值,數值大,表示較少...