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