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