2008年1月25日 星期五

Linux Process - 1

Linux 將 Process 與 Thread 都視為 Task,所以兩者使用同樣的資料結構
定義於 include/linux/sched.h
事實上,struct task_struct 是很大的結構,又稱為 Process Descriptor,這裏只列出幾個欄位
其中 taskschildrensibling 為 struct list_head 的型態,用來建立所有 Task 彼此間的串列關係
pid 是用來識別各個 Task 的唯一編號

struct list_head
{
  struct list_head *next;
  struct list_head *prev;
};

定義於 include/linux/list.h
這是一個雙向鏈結串列,在 Task 結構中嵌入 struct list_head 的欄位,便可以建立串列
若要經由 list_head 的指標取回 Task 的結構,則使用以下的巨集:

list_entry(ptr, type, member)

此外,在 Kernel 中使用 current 這個巨集,可以直接取得目前正在執行的 Task 的指標
定義於 include/asm-i386/current.h


Linux 第一個執行的 Task 是 swapper(0),以靜態變數 init_task 表示
第二個 Task 是 init(1),是由 swapper 衍生出來的,然後 init 會再衍生出其他 Task
而這兩個最初的 Task 可以畫出以下的串列關係:

沒有留言: