linux使用上百個雙向鍊錶來儲存核心的各種資料結構, 其中包括程序描述符的task_struct結構.
cpp **
struct list_head ;
在list.h中,形如__***的函式用來操作整個鍊錶,而不是單個鍊錶元素.
程序從pid得到程序描述符pd要一種高效的方法, 提到高效方法,那就用雜湊表啦. 核心在這兒的雜湊方法為一道巨集, 表中有
pidhash_sz個元素(一般情況下
pidhash_sz=
1024):
cpp **
#define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (pidhash_sz - 1))
雜湊表解決衝突的方法以是採取雙向鍊錶. 這是資料結構中一種比較常見的手段. 因為數字比較大的pid很少用到, 這樣的pid一般放在鍊錶尾端。 而數字較小的pid經常用到, 而它們如果衝突也排在鍊錶很前的位置, 所以採取這樣的資料結構速度很快.
核心提供了hash_pid()來加入乙個元素到表中,
unhash_pid()從表中刪除一元素.
這個雜湊表的主要目的是通過pid找到程序描述符,
find_task_by_pid
()提供了這項功能.
cpp **
static
inline
void hash_pid(struct task_struct *p)
static
inline
void unhash_pid(struct task_struct *p)
static
inline
struct task_struct *find_task_by_pid(int pid)
kernel原始碼(四)原始碼檔案結構和啟動過程分析
我們的原始碼選用的是linux0.11版本,因為這個版本簡單好學,我們將以這個版本為基礎學習linux的基本體系結構。boot為啟動相關的 用彙編寫的 init是核心啟動的 fs是虛擬檔案系統 mm記憶體管理 參考核心映像檔案的組成 我們的核心映象檔案儲存在硬碟上,由bootsect.s編譯的二進位...
從kernel原始碼高階C語言
第一章 關於學習和技能提公升 第二章 常見的巨集定義深度分析 2.1 array size arr 巨集深度解析 2.2 max x,y 巨集深度解析 2.3 container of ptr,type,member 巨集深度解析 是否還記得第一次點亮開發板的歡呼雀躍,第一次寫linux驅動時的無從...
原始碼學習 ArrayList的擴容原始碼分析
原始碼如下 下面是arraylist的擴容機制 arraylist的擴容機制提高了效能,如果每次只擴充乙個,那麼頻繁的插入會導致頻繁的拷貝,降低效能,而arraylist的擴容機制避免了這種情況。如有必要,增加此arraylist例項的容量,以確保它至少能容納元素的數量 param mincapac...