1、进程链表
为了对给定类型的进程进行有效的搜素,内核建立了几个进程链表。每个进程链表由指向进程控制块PCB的指针组成。进程控制块结构体如下:
struct task_struct {
......
struct list_head tasks;// 进程链表
/*
* executable name, excluding path.
*
* - normally initialized setup_new_exec()
* - access it with [gs]et_task_comm()
* - lock it with task_lock()
*/
char comm[TASK_COMM_LEN];
......
}
通过一个双向循环链表把所有进程联系起来,即为进程链表.
2、哈希表
在有些情况下,内核必须能根据进程的PID导出对应的进程控制块.顺序扫描进程链表并检查PCB的PID域是可行但相当低效的.为了加速查找,引入哈希表,要有一个哈希函数把PID转换成表的索引,Linux有一个宏pid_hashfn来实现:
#define pid_hashfn(nr, ns) \
&nb