進程標識號、進程的組織號及session標識號,相關系統調用(見程序kernel/sys.c)有sys_setpgid、sys_getpgid、sys_setpgrp、sys_getpgrp、sys_getsid及sys_setsid幾種。
(7) int leader;
是否是session的主管,布爾量。
5. 時間數據成員 (1) unsigned long timeout;
用于軟件定時,指出進程間隔多久被重新喚醒。采用tick為單位。
(2) unsigned long it_real_value,it_real_iner;
用于itimer(interval timer)軟件定時。采用jiffies為單位,每個tick使it_real_value減到0時向進程發信號SIGALRM,并重新置初值。初值由it_real_incr保存。具體代碼見kernel/itimer.c中的函數it_real_fn()。
(3) struct timer_list real_timer;
一種定時器結構(Linux共有兩種定時器結構,另一種稱作old_timer)。數據結構的定義在include/linux/timer.h中,相關操作函數見kernel/sched.c中add_timer()和del_timer()等。
(4) unsigned long it_virt_value,it_virt_incr;
關于進程用戶態執行時間的itimer軟件定時。采用jiffies為單位。進程在用戶態運行時,每個tick使it_virt_value減1,減到0時向進程發信號SIGVTALRM,并重新置初值。初值由it_virt_incr保存。具體代碼見kernel/sched.c中的函數do_it_virt()。
(5) unsigned long it_prof_value,it_prof_incr;
同樣是itimer軟件定時。采用jiffies為單位。不管進程在用戶態或內核態運行,每個tick使it_prof_value減1,減到0時向進程發信號SIGPROF,并重新置初值。初值由it_prof_incr保存。 具體代碼見kernel/sched.c中的函數do_it_prof。
(6) long utime,stime,cutime,cstime,start_time;
以上分別為進程在用戶態的運行時間、進程在內核態的運行時間、所有層次子進程在用戶態的運行時間總和、所有層次子進程在核心態的運行時間總和,以及創建該進程的時間。
6. 信號量數據成員 (1) struct sem_undo *semundo;
進程每操作一次信號量,都生成一個對此次操作的undo操作,它由sem_undo結構描述。這些屬于同一進程的undo操作組成的鏈表就由semundo屬性指示。當進程異常終止時,系統會調用undo操作。sem_undo的成員semadj指向一個數據數組,表示各次undo的量。結構定義在include/linux/sem.h。
(2) struct sem_queue *semsleeping;
每一信號量集合對應一個sem_queue等待隊列(見include/linux/sem.h)。進程因操作該信號量集合而阻塞時,它被掛到semsleeping指示的關于該信號量集合的sem_queue隊列。反過來,semsleeping。sleeper指向該進程的PCB。
7. 進程上下文環境 (1) struct desc_struct *ldt;
進程關于CPU段式存儲管理的局部描述符表的指針,用于仿真WINE Windows的程序。其他情況下取值NULL,進程的ldt就是arch/i386/traps.c定義的default_ldt。
(2) struct thread_struct tss;
任務狀態段,其內容與INTEL CPU的TSS對應,如各種通用寄存器.CPU調度時,當前運行進程的TSS保存到PCB的tss,新選中進程的tss內容復制到CPU的TSS。結構定義在include/linux/tasks.h中。
(3) unsigned long saved_kernel_stack;
為MS-DOS的仿真程序(或叫系統調用vm86)保存的堆棧指針。
(4) unsigned long kernel_stack_page;
在內核態運行時,每個進程都有一個內核堆棧,其基地址就保存在kernel_stack_page中。
8. 文件系統數據成員 (1) struct fs_struct *fs;
fs保存了進程本身與VFS的關系消息,其中root指向根目錄結點,pwd指向當前目錄結點,umask給出新建文件的訪問模式(可由系統調用umask更改),count是Linux保留的屬性,如下頁圖所示。結構定義在include/linux/sched.h中。
(2) struct files_struct *files;
files包含了進程當前所打開的文件(struct file *fd[NR_OPEN])。在Linux中,一個進程最多只能同時打開NR_OPEN個文件。而且,前三項分別預先設置為標準輸入、標準輸出和出錯消息輸出文件。
(3) int link_count;文件鏈(link)的數目。
Array. 內存數據成員
(4) struct mm_struct *mm;
在linux中,采用按需分頁的策略解決進程的內存需求。task_struct的數據成員mm指向關于存儲管理的mm_struct結構。其中包含了一個虛存隊列mmap,指向由若干vm_area_struct描述的虛存塊。同時,為了加快訪問速度,mm中的mmap_avl維護了一個AVL樹。在樹中,所有的vm_area_struct虛存塊均由左指針指向相鄰的低虛存塊,右指針指向相鄰的高虛存塊。 結構定義在include/linux/sched.h中。
10. 頁面管理 (1) int swappable:1;
進程占用的內存頁面是否可換出。swappable為1表示可換出。對該標志的復位和置位均在do_fork()函數中執行(見kerenl/fork.c)。
(2) unsigned long swap_address;
評論
查看更多