国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

linux task_struct的字段(PCB)

2019-11-08 02:39:21
字體:
供稿:網(wǎng)友
linux內(nèi)核通過一個被稱為進(jìn)程描述符的task_struct結(jié)構(gòu)體來管理進(jìn)程。task_struct是Linux中的【進(jìn)程控制塊PCB結(jié)構(gòu)】的具體數(shù)據(jù)結(jié)構(gòu)。這個結(jié)構(gòu)體包含了一個進(jìn)程所需的所有信息。下面對task_struct這個結(jié)構(gòu)體 進(jìn)行各個字段的詳細(xì)介紹:1. 調(diào)度數(shù)據(jù)成員(1) volatile long states表示進(jìn)程的當(dāng)前狀態(tài):TASK_RUNNING:正在運行或在就緒隊列run-queue中準(zhǔn)備運行的進(jìn)程,實際參與進(jìn)程調(diào)度。TASK_INTERRUPTIBLE:處于等待隊列中的進(jìn)程,待資源有效時喚醒,也可由其它進(jìn)程通過信號(signal)或定時中斷喚醒后進(jìn)入就緒隊列run-queue。TASK_UNINTERRUPTIBLE:處于等待隊列中的進(jìn)程,待資源有效時喚醒,不可由其它進(jìn)程通過信號(signal)或定時中斷喚醒。TASK_ZOMBIE:表示進(jìn)程結(jié)束但尚未消亡的一種狀態(tài)(僵死狀態(tài))。此時,進(jìn)程已經(jīng)結(jié)束運行且釋放大部分資源,但尚未釋放進(jìn)程控制塊。TASK_STOPPED:進(jìn)程被暫停,通過其它進(jìn)程的信號才能喚醒。TASK_SWAPPING: 進(jìn)程頁面被交換出內(nèi)存的進(jìn)程。(2) unsigned long flags進(jìn)程標(biāo)志:PF_ALIGNWARN        打印“對齊”警告信息。PF_PTRACED           被ptrace系統(tǒng)調(diào)用監(jiān)控。PF_TRACESYS          正在跟蹤。PF_FORKNOEXEC       進(jìn)程剛創(chuàng)建,但還沒執(zhí)行。PF_SUPERPRIV         超級用戶特權(quán)。PF_DUMPCORE         dumped core。PF_SIGNALED          進(jìn)程被信號(signal)殺出。PF_STARTING          進(jìn)程正被創(chuàng)建。PF_EXITING            進(jìn)程開始關(guān)閉。PF_USEDFPU           該進(jìn)程使用FPU(SMP only)。PF_DTRACE            delayed trace (used on m68k)。(3) long priority進(jìn)程優(yōu)先級。 Priority的值給出進(jìn)程每次獲取CPU后可使用的時間(按jiffies計)。優(yōu)先級可通過系統(tǒng)調(diào)用sys_setpriorty改變(在kernel/sys.c中)。(4) unsigned long rt_priorityrt_priority   給出實時進(jìn)程的優(yōu)先級,rt_priority+1000給出進(jìn)程每次獲取CPU后可使用的時間(同樣按jiffies計)。實時進(jìn)程的優(yōu)先級可通過系統(tǒng)調(diào)用sys_sched_setscheduler()改變(5) long counter在輪轉(zhuǎn)法調(diào)度時表示進(jìn)程當(dāng)前還可運行多久。在進(jìn)程開始運行是被賦為priority的值,以后每隔一個tick(時鐘中斷)遞減1,減到0時引起新一輪調(diào)度。重新調(diào)度將從run_queue隊列選出counter值最大的就緒進(jìn)程并給予CPU使用權(quán),因此counter起到了進(jìn)程的動態(tài)優(yōu)先級的作用(priority則是靜態(tài)優(yōu)先級)。(6) unsigned long policy該進(jìn)程的進(jìn)程調(diào)度策略,可以通過系統(tǒng)調(diào)用sys_sched_setscheduler()更改調(diào)度策略有:SCHED_OTHER   0   非實時進(jìn)程,基于優(yōu)先權(quán)的輪轉(zhuǎn)法(round robin)。SCHED_FIFO     1   實時進(jìn)程,用先進(jìn)先出算法。SCHED_RR       2   實時進(jìn)程,用基于優(yōu)先權(quán)的輪轉(zhuǎn)法。2. 信號處理(1) unsigned long signal進(jìn)程接收到的信號。每位表示一種信號,共32種。置位有效。(2)  unsigned long blocked進(jìn)程所能接受信號的位掩碼。置位表示屏蔽,復(fù)位表示不屏蔽。(3) struct signal_struct *sig因為signal和blocked都是32位的變量,Linux最多只能接受32種信號。對每種信號,各進(jìn)程可以由PCB的sig屬性選擇使用自定義的處理函數(shù),或是系統(tǒng)的缺省處理函數(shù)。指派各種信息處理函數(shù)的結(jié)構(gòu)定義在include/linux/sched.h中。對信號的檢查安排在系統(tǒng)調(diào)用結(jié)束后,以及“慢速型”中斷服務(wù)程序結(jié)束后(IRQ#_interrupt(),參見Array。5節(jié)“啟動內(nèi)核”)。3. 進(jìn)程隊列指針(1) struct task_struct *next_task,*prev_task;所有進(jìn)程(以PCB的形式)組成一個雙向鏈表。next_task和就是鏈表的前后指針。鏈表的頭和尾都是init_task(即0號進(jìn)程)。(2) struct task_struct *next_run,*prev_run;由正在運行或是可以運行的,其進(jìn)程狀態(tài)均為TASK_RUNNING的進(jìn)程所組成的一個雙向循環(huán)鏈表,即run_queue就緒隊列。該鏈表的前后向指針用next_run和prev_run,鏈表的頭和尾都是init_task(即0號進(jìn)程)。(3) struct task_struct *p_oPPTr,*p_pptr;和struct task_struct *p_cptr,*p_ysptr,*p_osptr;        以上分別是指向原始父進(jìn)程(original parent)、父進(jìn)程(parent)、子進(jìn)程(youngest child)及新老兄弟進(jìn)程(younger sibling,older sibling)的指針。     4. 進(jìn)程標(biāo)識(1) unsigned short uid,gid;uid和gid是運行進(jìn)程的用戶標(biāo)識和用戶組標(biāo)識。(2) int groups[NGROUPS];與多數(shù)現(xiàn)代UNIX操作系統(tǒng)一樣,Linux允許進(jìn)程同時擁有一組用戶組號。在進(jìn)程訪問文件時,這些組號可用于合法性檢查。(3) unsigned short euid,egid;euid和egid又稱為有效的uid和gid。出于系統(tǒng)安全的權(quán)限的考慮,運行程序時要檢查euid和egid的合法性。通常,uid等于euid,gid等于egid。有時候,系統(tǒng)會賦予一般用戶暫時擁有root的uid和gid(作為用戶進(jìn)程的euid和egid),以便于進(jìn)行運作。(4) unsigned short fsuid,fsgid;fsuid和fsgid稱為文件系統(tǒng)的uid和gid,用于文件系統(tǒng)操作時的合法性檢查,是Linux獨特的標(biāo)識類型。它們一般分別和euid和egid一致,但在NFS文件系統(tǒng)中NFS服務(wù)器需要作為一個特殊的進(jìn)程訪問文件,這時只修改客戶進(jìn)程的fsuid和fsgid。(5) unsigned short suid,sgid;suid和sgid是根據(jù)POSIX標(biāo)準(zhǔn)引入的,在系統(tǒng)調(diào)用改變uid和gid時,用于保留真正的uid和gid。(6) int pid,pgrp,session;進(jìn)程標(biāo)識號、進(jìn)程的組織號及session標(biāo)識號,相關(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;用于軟件定時,指出進(jìn)程間隔多久被重新喚醒。采用tick為單位。(2) unsigned long it_real_value,it_real_iner;用于itimer(interval timer)軟件定時。采用jiffies為單位,每個tick使it_real_value減到0時向進(jìn)程發(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)于進(jìn)程用戶態(tài)執(zhí)行時間的itimer軟件定時。采用jiffies為單位。進(jìn)程在用戶態(tài)運行時,每個tick使it_virt_value減1,減到0時向進(jìn)程發(fā)信號SIGVTALRM,并重新置初值。初值由it_virt_incr保存。具體代碼見kernel/sched.c中的函數(shù)do_it_virt()。(5) unsigned long it_prof_value,it_prof_incr;同樣是itimer軟件定時。采用jiffies為單位。不管進(jìn)程在用戶態(tài)或內(nèi)核態(tài)運行,每個tick使it_prof_value減1,減到0時向進(jìn)程發(fā)信號SIGPROF,并重新置初值。初值由it_prof_incr保存。 具體代碼見kernel/sched.c中的函數(shù)do_it_prof。(6) long utime,stime,cutime,cstime,start_time;以上分別為進(jìn)程在用戶態(tài)的運行時間、進(jìn)程在內(nèi)核態(tài)的運行時間、所有層次子進(jìn)程在用戶態(tài)的運行時間總和、所有層次子進(jìn)程在核心態(tài)的運行時間總和,以及創(chuàng)建該進(jìn)程的時間。6. 信號量數(shù)據(jù)成員(1) struct sem_undo *semundo;進(jìn)程每操作一次信號量,都生成一個對此次操作的undo操作,它由sem_undo結(jié)構(gòu)描述。這些屬于同一進(jìn)程的undo操作組成的鏈表就由semundo屬性指示。當(dāng)進(jìn)程異常終止時,系統(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)。進(jìn)程因操作該信號量集合而阻塞時,它被掛到semsleeping指示的關(guān)于該信號量集合的sem_queue隊列。反過來,semsleeping。sleeper指向該進(jìn)程的PCB。7. 進(jìn)程上下文環(huán)境(1) struct desc_struct *ldt;進(jìn)程關(guān)于CPU段式存儲管理的局部描述符表的指針,用于仿真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對應(yīng),如各種通用寄存器.CPU調(diào)度時,當(dāng)前運行進(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)運行時,每個進(jìn)程都有一個內(nèi)核堆棧,其基地址就保存在kernel_stack_page中。8. 文件系統(tǒng)數(shù)據(jù)成員(1) struct fs_struct *fs;fs保存了進(jìn)程本身與VFS的關(guān)系消息,其中root指向根目錄結(jié)點,pwd指向當(dāng)前目錄結(jié)點,umask給出新建文件的訪問模式(可由系統(tǒng)調(diào)用umask更改),count是Linux保留的屬性,如下頁圖所示。結(jié)構(gòu)定義在include/linux/sched.h中。(2) struct files_struct *files;files包含了進(jìn)程當(dāng)前所打開的文件(struct file *fd[NR_OPEN])。在Linux中,一個進(jìn)程最多只能同時打開NR_OPEN個文件。而且,前三項分別預(yù)先設(shè)置為標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和出錯消息輸出文件。 (3) int link_count;文件鏈(link)的數(shù)目。Array. 內(nèi)存數(shù)據(jù)成員(1) struct mm_struct *mm;在linux中,采用按需分頁的策略解決進(jìn)程的內(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;進(jìn)程占用的內(nèi)存頁面是否可換出。swappable為1表示可換出。對該標(biāo)志的復(fù)位和置位均在do_fork()函數(shù)中執(zhí)行(見kerenl/fork.c)。(2) unsigned long swap_address;虛存地址比swap_address低的進(jìn)程頁面,以前已經(jīng)換出或已換出過,進(jìn)程下一次可換出的頁面自swap_address開始。參見swap_out_process()和swap_out_pmd()(見mm/vmscan.c)。(3)    unsigned long min_flt,maj_flt;該進(jìn)程累計的minor缺頁次數(shù)和major缺頁次數(shù)。maj_flt基本與min_flt相同,但計數(shù)的范圍比后者廣(參見fs/buffer.c和mm/page_alloc.c)。min_flt只在do_no_page()、do_wp_page()里(見mm/memory.c)計數(shù)新增的可以寫操作的頁面。(4) unsigned long nswap;該進(jìn)程累計換出的頁面數(shù)。(5) unsigned long cmin_flt,cmaj_flt,cnswap;以本進(jìn)程作為祖先的所有層次子進(jìn)程的累計換入頁面、換出頁面計數(shù)。(6) unsigned long old_maj_flt,dec_flt;(7) unsigned long swap_cnt;下一次信號最多可換出的頁數(shù)。11. 支持對稱多處理器方式(SMP)時的數(shù)據(jù)成員(1) int processor;進(jìn)程正在使用的CPU。(2) int last_processor;進(jìn)程最后一次使用的CPU。(3) int lock_depth;上下文切換時系統(tǒng)內(nèi)核鎖的深度。12. 其它數(shù)據(jù)成員(1) unsigned short used_math;是否使用FPU。(2) char comm[16];進(jìn)程正在運行的可執(zhí)行文件的文件名。(3) struct rlimit rlim[RLIM_NLIMITS];結(jié)構(gòu)rlimit用于資源管理,定義在linux/include/linux/resource.h中,成員共有兩項:rlim_cur是資源的當(dāng)前最大數(shù)目;rlim_max是資源可有的最大數(shù)目。在i386環(huán)境中,受控資源共有RLIM_NLIMITS項,即10項,定義在linux/include/asm/resource.h中,見下表:(4) int errno;最后一次出錯的系統(tǒng)調(diào)用的錯誤號,0表示無錯誤。系統(tǒng)調(diào)用返回時,全程量也擁有該錯誤號。(5) long debugreg[8];保存INTEL CPU調(diào)試寄存器的值,在ptrace系統(tǒng)調(diào)用中使用。(6) struct exec_domain *exec_domain;Linux可以運行由80386平臺其它UNIX操作系統(tǒng)生成的符合iBCS2標(biāo)準(zhǔn)的程序。關(guān)于此類程序與Linux程序差異的消息就由exec_domain結(jié)構(gòu)保存。(7) unsigned long personality;Linux可以運行由80386平臺其它UNIX操作系統(tǒng)生成的符合iBCS2標(biāo)準(zhǔn)的程序。 Personality進(jìn)一步描述進(jìn)程執(zhí)行的程序?qū)儆诤畏NUNIX平臺的“個性”信息。通常有PER_Linux、PER_Linux_32BIT、PER_Linux_EM86、PER_SVR3、PER_SCOSVR3、PER_WYSEV386、PER_ISCR4、PER_BSD、PER_XENIX和PER_MASK等,參見include/linux/personality.h。(8) struct linux_binfmt *binfmt;指向進(jìn)程所屬的全局執(zhí)行文件格式結(jié)構(gòu),共有a。out、script、elf和java等四種。結(jié)構(gòu)定義在include/linux/binfmts.h中(core_dump、load_shlib(fd)、load_binary、use_count)。(Array) int exit_code,exit_signal;引起進(jìn)程退出的返回代碼exit_code,引起錯誤的信號名exit_signal。(10) int dumpable:1;布爾量,表示出錯時是否可以進(jìn)行memory dump。(11) int did_exec:1;按POSIX要求設(shè)計的布爾量,區(qū)分進(jìn)程是正在執(zhí)行老程序代碼,還是在執(zhí)行execve裝入的新代碼。(12) int tty_old_pgrp;進(jìn)程顯示終端所在的組標(biāo)識。(13) struct tty_struct *tty;指向進(jìn)程所在的顯示終端的信息。如果進(jìn)程不需要顯示終端,如0號進(jìn)程,則該指針為空。結(jié)構(gòu)定義在include/linux/tty.h中。(14) struct wait_queue *wait_chldexit;在進(jìn)程結(jié)束時,或發(fā)出系統(tǒng)調(diào)用wait4后,為了等待子進(jìn)程的結(jié)束,而將自己(父進(jìn)程)睡眠在該隊列上。結(jié)構(gòu)定義在include/linux/wait.h中。13. 進(jìn)程隊列的全局變量(1) current;當(dāng)前正在運行的進(jìn)程的指針,在SMP中則指向CPU組中正被調(diào)度的CPU的當(dāng)前進(jìn)程:           #define current(0+current_set[smp_processor_id()])/*sched.h*/           struct task_struct *current_set[NR_CPUS];(2) struct task_struct init_task;即0號進(jìn)程的PCB,是進(jìn)程的“根”,始終保持初值INIT_TASK。(3) struct task_struct *task[NR_TASKS];進(jìn)程隊列數(shù)組,規(guī)定系統(tǒng)可同時運行的最大進(jìn)程數(shù)(見kernel/sched.c)。NR_TASKS定義在include/linux/tasks.h中,值為512。每個進(jìn)程占一個數(shù)組元素(元素的下標(biāo)不一定就是進(jìn)程的pid),task[0]必須指向init_task(0號進(jìn)程)。可以通過task[]數(shù)組遍歷所有進(jìn)程的PCB。但Linux也提供一個宏定義for_each_task()(見include/linux/sched.h),它通過next_task遍歷所有進(jìn)程的PCB:         #define for_each_task(p) \              for(p=&init_task;(p=p->next_task)!=&init_task;)(4) unsigned long volatile jiffies;Linux的基準(zhǔn)時間(見kernal/sched.c)。系統(tǒng)初始化時清0,以后每隔10ms由時鐘中斷服務(wù)程序do_timer()增1。(5) int need_resched;重新調(diào)度標(biāo)志位(見kernal/sched.c)。當(dāng)需要Linux調(diào)度時置位。在系統(tǒng)調(diào)用返回前(或者其它情形下),判斷該標(biāo)志是否置位。置位的話,馬上調(diào)用schedule進(jìn)行CPU調(diào)度。(6) unsigned long intr_count;記錄中斷服務(wù)程序的嵌套層數(shù)(見kernal/softirq.c)。正常運行時,intr_count為0。當(dāng)處理硬件中斷、執(zhí)行任務(wù)隊列中的任務(wù)或者執(zhí)行bottom half隊列中的任務(wù)時,intr_count非0。這時,內(nèi)核禁止某些操作,例如不允許重新調(diào)度。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 烟台市| 东乡族自治县| 威海市| 武乡县| 山阳县| 静乐县| 禄丰县| 淮北市| 怀来县| 叙永县| 阜城县| 东乡县| 保山市| 新巴尔虎右旗| 张掖市| 江川县| 永丰县| 惠来县| 建水县| 长寿区| 乌兰县| 绵竹市| 巴林左旗| 巨鹿县| 青河县| 临潭县| 祁东县| 仙游县| 祁连县| 曲沃县| 枣阳市| 罗江县| 西充县| 贵德县| 阿坝县| 五原县| 株洲市| 富阳市| 福泉市| 建湖县| 平乐县|