在linux中每一個進程都由task_struct資料結構來定義.task_struct就是我們通常所說的PCB.她是對進程式控制制的唯一手段也是最有效手段.當我們調用fork()時, 系統會為我們產生一個task_struct結構。然後從父進程,那裡繼承一些資料, 並把新的進程插入到進程樹中,以待進行進程管理。因此瞭解task_struct的結構對於我們理解任務調度(在linux中任務和進程是同一概念)的關鍵。
task_struct:
進程狀態 ,將紀錄進程在等待,運行,或死結 調度資訊, 由哪個調度函數調度,怎樣調度等 進程的通訊狀況 因為要插入進程樹,必須有聯絡父子兄弟的指標, 當然是task_struct型 時間資訊, 比如計算好執行的時間, 以便cpu分配 標號 ,決定改進程歸屬 可以讀寫開啟的一些檔案資訊 進程上下文和核心上下文 處理器上下文 記憶體資訊 因為每一個PCB都是這樣的, 只有這些結構, 才能滿足一個進程的所有要求。開啟./usr/src/kernels/2.6.32-431.el6.i686/include/linux/sched.h(centos6.5)可以找到task_struct的定義
struct task_struct {volatile long state; //說明了該進程是否可以執行,還是可中斷等資訊unsigned long flags; //Flage 是進程號,在調用fork()時給出int sigpending; //進程上是否有待處理的訊號mm_segment_t addr_limit; //進程地址空間,區分核心進程與普通進程在記憶體存放的位置不同//0-0xBFFFFFFF for user-thead//0-0xFFFFFFFF for kernel-thread//調度標誌,表示該進程是否需要重新調度,若非0,則當從核心態返回到使用者態,會發生調度volatile long need_resched;int lock_depth; //鎖深度long nice; //進程的基本時間片//進程的調度策略,有三種,即時進程:SCHED_FIFO,SCHED_RR, 分時進程:SCHED_OTHERunsigned long policy;struct mm_struct *mm; //進程記憶體管理資訊int processor;//若進程不在任何CPU上運行, cpus_runnable 的值是0,否則是1 這個值在運行隊列被鎖時更新unsigned long cpus_runnable, cpus_allowed;struct list_head run_list; //指向運行隊列的指標unsigned long sleep_time; //進程的睡眠時間//用於將系統中所有的進程連成一個雙向迴圈鏈表, 其根是init_taskstruct task_struct *next_task, *prev_task;struct mm_struct *active_mm;struct list_head local_pages; //指向本地頁面 unsigned int allocation_order, nr_local_pages;struct linux_binfmt *binfmt; //進程所啟動並執行可執行檔的格式int exit_code, exit_signal;int pdeath_signal; //父進程終止是向子進程發送的訊號unsigned long personality;//Linux可以運行由其他UNIX作業系統產生的符合iBCS2標準的程式int did_exec:1; pid_t pid; //進程標識符,用來代表一個進程pid_t pgrp; //進程組標識,表示進程所屬的進程組pid_t tty_old_pgrp; //進程式控制制終端所在的組標識pid_t session; //進程的會話標識pid_t tgid;int leader; //表示進程是否為會話主管struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr;struct list_head thread_group; //線程鏈表struct task_struct *pidhash_next; //用於將進程鏈入HASH表struct task_struct **pidhash_pprev;wait_queue_head_t wait_chldexit; //供wait4()使用struct completion *vfork_done; //供vfork() 使用unsigned long rt_priority; //即時優先順序,用它計算即時進程調度時的weight值//it_real_value,it_real_incr用於REAL定時器,單位為jiffies, 系統根據it_real_value//設定定時器的第一個終止時間. 在定時器到期時,向進程發送SIGALRM訊號,同時根據//it_real_incr重設終止時間,it_prof_value,it_prof_incr用於Profile定時器,單位為jiffies。//當進程運行時,不管在何種狀態下,每個tick都使it_prof_value值減一,當減到0時,向進程發送//訊號SIGPROF,並根據it_prof_incr重設時間.//it_virt_value,it_virt_value用於Virtual定時器,單位為jiffies。當進程運行時,不管在何種//狀態下,每個tick都使it_virt_value值減一當減到0時,向進程發送訊號SIGVTALRM,根據//it_virt_incr重設初值。unsigned long it_real_value, it_prof_value, it_virt_value;unsigned long it_real_incr, it_prof_incr, it_virt_value;struct timer_list real_timer; //指向即時定時器的指標struct tms times; //記錄進程消耗的時間unsigned long start_time; //進程建立的時間//記錄進程在每個CPU上所消耗的使用者態時間和核心態時間long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS]; //記憶體缺頁和交換資訊://min_flt, maj_flt累計進程的次缺頁數(Copy on Write頁和匿名頁)和主缺頁數(從對應檔或交換//裝置讀入的頁面數); nswap記錄進程累計換出的頁面數,即寫到交換裝置上的頁面數。//cmin_flt, cmaj_flt, cnswap記錄本進程為祖先的所有子孫進程的累計次缺頁數,主缺頁數和換出頁面數。//在父進程回收終止的子進程時,父進程會將子進程的這些資訊累計到自己結構的這些域中unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;int swappable:1; //表示進程的虛擬位址空間是否允許換出//進程認證資訊//uid,gid為運行該進程的使用者的使用者識別碼和群組識別碼,通常是進程建立者的uid,gid//euid,egid為有效uid,gid//fsuid,fsgid為檔案系統uid,gid,這兩個ID號通常與有效uid,gid相等,在檢查對於檔案//系統的存取權限時使用他們。//suid,sgid為備份uid,giduid_t uid,euid,suid,fsuid;gid_t gid,egid,sgid,fsgid;int ngroups; //記錄進程在多少個使用者組中gid_t groups[NGROUPS]; //記錄進程所在的組//進程的權能,分別是有效位集合,繼承位集合,允許位集合kernel_cap_t cap_effective, cap_inheritable, cap_permitted;int keep_capabilities:1;struct user_struct *user;struct rlimit rlim[RLIM_NLIMITS]; //與進程相關的資源限制資訊unsigned short used_math; //是否使用FPUchar comm[16]; //進程正在啟動並執行可執行檔名//檔案系統資訊int link_count, total_link_count;//NULL if no tty 進程所在的控制終端,如果不需要控制終端,則該指標為空白struct tty_struct *tty;unsigned int locks;//處理序間通訊資訊struct sem_undo *semundo; //進程在號誌上的所有undo操作struct sem_queue *semsleeping; //當進程因為號誌操作而掛起時,他在該隊列中記錄等待的操作//進程的CPU狀態,切換時,要儲存到停止進程的task_struct中struct thread_struct thread;//檔案系統資訊struct fs_struct *fs;//開啟檔案資訊struct files_struct *files;//訊號處理函數spinlock_t sigmask_lock;struct signal_struct *sig; //訊號處理函數sigset_t blocked; //進程當前要阻塞的訊號,每個訊號對應一位struct sigpending pending; //進程上是否有待處理的訊號unsigned long sas_ss_sp;size_t sas_ss_size;int (*notifier)(void *priv);void *notifier_data;sigset_t *notifier_mask;u32 parent_exec_id;u32 self_exec_id;spinlock_t alloc_lock;void *journal_info;};