2008年1月26日 星期六

Linux Process - 2

Linux Kernel 將所有的 Task 藉由 struct list_head 串成串列
依據指標鏈結方式的不同,會得到不同的串列結果

• 由 tasks 構成的行程的環狀雙向鏈結串列
串列首為 init_task,即 swapper(0),最後一個行程的 tasks 指標會指回 swapper(0)

假設系統中只存在 3個行程,分別為 swapper、init 及 Process-X,則 tasks 串列如下:
(以下的圖形都只畫出 next 方向的指標)

欲走訪 tasks 串列的所有節點,可使用以下方式:

struct task_struct *task = NULL;

for_each_process( task )
{
  //列出所有行程的名稱與 PID
  printk("%s(%d)\n", task->comm, task->pid);
}


• 由 children & sibliing 構成的父程序與子程序串列
每一個行程都可能會衍生出子行程,以 children 指標表示其第一個子行程
而子行程彼此之間以 sibling 指標鏈結,最後一個子行程的 sibling 指標則指向父行程
至於沒有子行程的行程,其 children 指標會指向自己

假設 Process-A 衍生出 Process-B,而 Process-B 衍生出 Process-C
children & sibling 串列如下:

假設 Process-D 衍生出 Process-E 與 Process-F,則 children & sibling 串列如下:

欲搜尋目前行程的所有子行程,可使用以下方式:

struct task_struct *task = NULL;
struct list_head *list = NULL;

list_for_each(list, &(current->children))
{
  task = list_entry(list, struct task_struct, sibling);
  //現在 task 已指向 current 的某個子行程
}

沒有留言: