深入Linux核心架構筆記 程序管理與排程2

2021-09-25 00:21:12 字數 1698 閱讀 4746

程序表示

state : 執行程序的狀態

task_running : 表示程序可以執行

task_interruptiable : 程序因為等待某種事件或者資源而睡眠,可以通過訊號喚醒

task_uninterruptible : 程序因為等待某種事件或者資源而睡眠,不能由訊號喚醒

task_stopped : 程序停止執行,比如由偵錯程式暫停

task_traced : 用於從停止的程序中,將被除錯的程序與常規的程序分開

exit_zombie : 程序已經停止執行,但是資源未完全釋放

exit_dead : 父程序發出wait系統呼叫,但是程序資源完全從系統移除之前的狀態,只有多個執行緒同時對同乙個程序發wait呼叫時,該狀態才有意義

資源限制

struct rlimit 

rlim_curr : 程序的當前資源限制,可有setrlimit系統呼叫來修改,也稱之為軟限制

rlim_max : 程序限制的最大容許值,也稱之為硬限制

程序型別命名空間程序id號unix程序總是會分配乙個號碼用於在其命名空間中唯一地標識它們,該號碼稱為程序id號,簡稱pid。使用fork或者clone產生的每個程序都由核心自動分配了乙個新的唯一的pid.

管理pid 函式

給定task_struct, id型別和命名空間,獲取命名空間區域性的數字id

static inline struct pid *task_pid(struct task_struct *task)

static inline struct pid *task_pgrp(struct task_struct *task)

pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns)

return nr;

}

給出區域性數字id和對應的命名空間,查詢task_struct例項

根據程序的區域性數字id和關聯的命名空間的指標進行雜湊,得到在pid_hash陣列的索引,然後遍歷雜湊表直至找到所要的元素,如下:

struct pid * fastcall find_pid_ns(int nr, struct pid_namespace *ns)

pid_task取出pid->tasks[type]雜湊表中的第乙個task_struct例項
struct task_struct *find_task_by_pid_type_ns(int type, int nr,

struct pid_namespace *ns)

struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type)

return result;

}

生成唯一的pid

程序關係

深入Linux核心架構筆記 程序管理與排程

概述 程序相關的基本概念 硬體實時程序有嚴格的時間限制,必須在可保證的時間範圍內得到處理,否則會有很嚴重的後果,請注意,這並不意味著所要求的時間範圍特別短,linux主流版本不支援硬實時處理 軟實時程序是硬實時程序的一種弱化形式,儘管仍然需要快速得到結果,但是稍微晚一點關係也不是很大,比如對cd機的...

《深入Linux核心架構》讀書筆記

1.關於udev page.318 每當核心檢測到裝置時,都會建立乙個核心物件,並向使用者空間傳送乙個熱插拔訊息,該訊息包含了驅動程式為裝置分配的主從裝置號。udevd守護程序監聽該訊息,並根據訊息在 dev中建立對應的項,接下來就可以從使用者層訪問該裝置了。由於引入了udev機制,dev不再放置到...

深入Linux核心架構筆記 動態時鐘

為節省系統功耗,只在有些任務需要實際執行時,才啟用週期時鐘,否則會臨時禁用週期時鐘,對該技術的支援可以在編譯時選擇,啟用此選項的系統也稱無時鐘系統。判斷原則 當系統排程選擇idle程序來執行時,動態時鐘系統會禁用週期時鐘,直到下乙個定時器即將到期為止 struct tich sched idle t...