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

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

Linux中task_struct結(jié)構(gòu)體字段分析

2019-11-08 03:00:31
字體:
供稿:網(wǎng)友

task_struct:是linux內(nèi)核的一種數(shù)據(jù)結(jié)構(gòu)。它放在RAM(運(yùn)行內(nèi)存)里并包含著進(jìn)程的信息。每個(gè)進(jìn)程都把自己的信息放在task_struct數(shù)據(jù)結(jié)構(gòu)里。

task_struct字段分析如下:

task_struct  //進(jìn)程描述符

Struct  task_struct

{

1、支持對(duì)稱多處理器方式(SMP)時(shí)的數(shù)據(jù)成員

  (1)、int PRocessor;  //進(jìn)程正在使用的CPU

  (2)、int last_processor;  //進(jìn)程最后一次使用的CPU

  (3)、int lock_depth;  //上下文切換時(shí)系統(tǒng)內(nèi)核鎖的深度

 2、其他數(shù)據(jù)成員

(1)、unsigned short used_math;  //是否使用MPU

(2)、char comm[16];  //進(jìn)程正在運(yùn)行的可執(zhí)行文件的文件名

(3)、struct rlimit rlim[RLIM_NLIMITS];  //結(jié)構(gòu)rlimit用于資源管理,定義在linux/include/linux/resource.h中,成員共有兩項(xiàng):rlim_cur是資源的當(dāng)前最大數(shù)目;rlim_max是資源可有的最大數(shù)目。

(4)、int errno;  //最后一次出錯(cuò)的系統(tǒng)調(diào)用錯(cuò)誤號(hào),0表示無錯(cuò)誤。系統(tǒng)調(diào)用返回時(shí),全程量也擁有該錯(cuò)誤。

(5)、long debugreg[8];  //保存INTEL CPU調(diào)試寄存器的值,在ptrace系統(tǒng)調(diào)用中使用。

(6) struct exec_domain *exec_domain;  //Linux可以運(yùn)行由80386平臺(tái)其它UNIX操作系統(tǒng)生成的符合iBCS2標(biāo)準(zhǔn)的程序。關(guān)于此類程序與Linux程序差異的消息就由exec_domain結(jié)構(gòu)保存。

(7) unsigned long personality;  //Linux 可以運(yùn)行由80386平臺(tái)其它UNIX操作系統(tǒng)生成的符合iBCS2標(biāo)準(zhǔn)的程序。 Personality進(jìn)一步描述進(jìn)程執(zhí)行的程序?qū)儆诤畏NUNIX平臺(tái)的“個(gè)性”信息。通常有PER_Linux、PER_Linux_32BIT、 PER_Linux_EM86、PER_SVR3、PER_SCOSVR3、PER_WYSEV386、PER_ISCR4、PER_BSD、 PER_XENIX和PER_MASK等,

(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)。

(9) int exit_code,exit_signal;  //引起進(jìn)程退出的返回代碼exit_code,引起錯(cuò)誤的信號(hào)名exit_signal。

(10) int dumpable:1;  //布爾量,表示出錯(cuò)時(shí)是否可以進(jìn)行memory dump。

(11) int did_exec:1;  //按POSIX要求設(shè)計(jì)的布爾量,區(qū)分進(jìn)程是正在執(zhí)行老程序代碼,還是在執(zhí)行execve裝入的新代碼。

(12) int tty_old_pgrp;  //進(jìn)程顯示終端所在的組標(biāo)識(shí)。

(13) struct tty_struct *tty;  //指向進(jìn)程所在的顯示終端的信息。如果進(jìn)程不需要顯示終端,如0號(hào)進(jìn)程,則該指針為空。結(jié)構(gòu)定義在include/linux/tty.h中。

(14) struct wait_queue *wait_chldexit;  //在進(jìn)程結(jié)束時(shí),或發(fā)出系統(tǒng)調(diào)用wait4后,為了等待子進(jìn)程的結(jié)束,而將自己(父進(jìn)程)睡眠在該隊(duì)列上。結(jié)構(gòu)定義在include/linux/wait.h中。

3、 調(diào)度數(shù)據(jù)成員(1) volatile long states;  //表示進(jìn)程的當(dāng)前狀態(tài):? TASK_RUNNING:正在運(yùn)行或在就緒隊(duì)列run-queue中準(zhǔn)備運(yùn)行的進(jìn)程,實(shí)際參與進(jìn)程調(diào)度。? TASK_INTERRUPTIBLE:處于等待隊(duì)列中的進(jìn)程,待資源有效時(shí)喚醒,也可由其它進(jìn)程通過信號(hào)(signal)或定時(shí)中斷喚醒后進(jìn)入就緒隊(duì)列run-queue。? TASK_UNINTERRUPTIBLE:處于等待隊(duì)列中的進(jìn)程,待資源有效時(shí)喚醒,不可由其它進(jìn)程通過信號(hào)(signal)或定時(shí)中斷喚醒。? TASK_ZOMBIE:表示進(jìn)程結(jié)束但尚未消亡的一種狀態(tài)(僵死狀態(tài))。此時(shí),進(jìn)程已經(jīng)結(jié)束運(yùn)行且釋放大部分資源,但尚未釋放進(jìn)程控制塊。?TASK_STOPPED:進(jìn)程被暫停,通過其它進(jìn)程的信號(hào)才能喚醒。導(dǎo)致這種狀態(tài)的原因有二,或者是對(duì)收到SIGSTOP、SIGSTP、SIGTTIN或SIGTTOU信號(hào)的反應(yīng),或者是受其它進(jìn)程的ptrace系統(tǒng)調(diào)用的控制而暫時(shí)將CPU交給控制進(jìn)程。? TASK_SWAPPING: 進(jìn)程頁面被交換出內(nèi)存的進(jìn)程。(2) unsigned long flags;  //進(jìn)程標(biāo)志:?PF_ALIGNWARN 打印“對(duì)齊”警告信息。?PF_PTRACED 被ptrace系統(tǒng)調(diào)用監(jiān)控。?PF_TRACESYS 正在跟蹤。?PF_FORKNOEXEC 進(jìn)程剛創(chuàng)建,但還沒執(zhí)行。?PF_SUPERPRIV 超級(jí)用戶特權(quán)。?PF_DUMPCORE dumped core。?PF_SIGNALED 進(jìn)程被信號(hào)(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)先級(jí)。 Priority的值給出進(jìn)程每次獲取CPU后可使用的時(shí)間(按jiffies計(jì))。優(yōu)先級(jí)可通過系統(tǒng)調(diào)用sys_setpriorty改變(在kernel/sys.c中)。(4) unsigned long rt_priority;  //rt_priority 給出實(shí)時(shí)進(jìn)程的優(yōu)先級(jí),rt_priority+1000給出進(jìn)程每次獲取CPU后可使用的時(shí)間(同樣按jiffies計(jì))。(5) long counter;  //在輪轉(zhuǎn)法調(diào)度時(shí)表示進(jìn)程當(dāng)前還可運(yùn)行多久。在進(jìn)程開始運(yùn)行是被賦為priority的值,以后每隔一個(gè)tick(時(shí)鐘中斷)遞減1,減到0時(shí)引起新一輪調(diào) 度。重新調(diào)度將從run_queue隊(duì)列選出counter值最大的就緒進(jìn)程并給予CPU使用權(quán),因此counter起到了進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí)的作用 (priority則是靜態(tài)優(yōu)先級(jí))。(6) unsigned long policy;  //該進(jìn)程的進(jìn)程調(diào)度策略,可以通過系統(tǒng)調(diào)用sys_sched_setscheduler()更改(見kernel/sched.c)。調(diào)度策略有:

?SCHED_OTHER 0 非實(shí)時(shí)進(jìn)程,基于優(yōu)先權(quán)的輪轉(zhuǎn)法(round robin)。?SCHED_FIFO 1 實(shí)時(shí)進(jìn)程,用先進(jìn)先出算法。?SCHED_RR 2 實(shí)時(shí)進(jìn)程,用基于優(yōu)先權(quán)的輪轉(zhuǎn)法。4、 信號(hào)處理(1) unsigned long signal; //進(jìn)程接收到的信號(hào)。每位表示一種信號(hào),共32種。置位有效。(2) unsigned long blocked;  //進(jìn)程所能接受信號(hào)的位掩碼。置位表示屏蔽,復(fù)位表示不屏蔽。(3) struct signal_struct *sig;  //因?yàn)閟ignal和blocked都是32位的變量,Linux最多只能接受32種信號(hào)。對(duì)每種信號(hào),各進(jìn)程可以由PCB的sig屬性選擇使用自定義的處理 函數(shù),或是系統(tǒng)的缺省處理函數(shù)。指派各種信息處理函數(shù)的結(jié)構(gòu)定義在include/linux/sched.h中。5、進(jìn)程隊(duì)列指針(1) struct task_struct *next_task,*prev_task; //所有進(jìn)程(以PCB的形式)組成一個(gè)雙向鏈表。next_task和就是鏈表的前后指針。鏈表的頭和尾都是init_task(即0號(hào)進(jìn)程)。(2) struct task_struct *next_run,*prev_run;  //由正在運(yùn)行或是可以運(yùn)行的,其進(jìn)程狀態(tài)均為TASK_RUNNING的進(jìn)程所組成的一個(gè)雙向循環(huán)鏈表,即run_queue就緒隊(duì)列。該鏈表的前后向指針用next_run和prev_run,鏈表的頭和尾都是init_task(即0號(hào)進(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)的指針。

進(jìn)程標(biāo)識(shí)(1) unsigned short uid,gid;  //uid和gid是運(yùn)行進(jìn)程的用戶標(biāo)識(shí)和用戶組標(biāo)識(shí)。(2) int groups[NGROUPS];  //與多數(shù)現(xiàn)代UNIX操作系統(tǒng)一樣,Linux允許進(jìn)程同時(shí)擁有一組用戶組號(hào)。在進(jìn)程訪問文件時(shí),這些組號(hào)可用于合法性檢查。(3) unsigned short euid,egid; //euid 和egid又稱為有效的uid和gid。出于系統(tǒng)安全的權(quán)限的考慮,運(yùn)行程序時(shí)要檢查euid和egid的合法性。通常,uid等于euid,gid等于 egid。有時(shí)候,系統(tǒng)會(huì)賦予一般用戶暫時(shí)擁有root的uid和gid(作為用戶進(jìn)程的euid和egid),以便于進(jìn)行運(yùn)作。(4) unsigned short fsuid,fsgid;  //fsuid 和fsgid稱為文件系統(tǒng)的uid和gid,用于文件系統(tǒng)操作時(shí)的合法性檢查,是Linux獨(dú)特的標(biāo)識(shí)類型。它們一般分別和euid和egid一致,但在 NFS文件系統(tǒng)中NFS服務(wù)器需要作為一個(gè)特殊的進(jìn)程訪問文件,這時(shí)只修改客戶進(jìn)程的fsuid和fsgid。(5) unsigned short suid,sgid;  //suid和sgid是根據(jù)POSIX標(biāo)準(zhǔn)引入的,在系統(tǒng)調(diào)用改變uid和gid時(shí),用于保留真正的uid和gid。(6) int pid,pgrp,session;  //進(jìn)程標(biāo)識(shí)號(hào)、進(jìn)程的組織號(hào)及session標(biāo)識(shí)號(hà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的主管,布爾量。7、 時(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保存。具體代碼見kernel/itimer.c中的函數(shù)it_real_fn()。(3) struct timer_list real_timer;  //一種定時(shí)器結(jié)構(gòu)(Linux共有兩種定時(shí)器結(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í)行時(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保存。具體代碼見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保存。 具體代碼見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í)間。8、 信號(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ì)列(見include/linux/sem.h)。進(jìn)程因操作該信號(hào)量集合而阻塞時(shí),它被掛到semsleeping指示的關(guān) 于該信號(hào)量集合的sem_queue隊(duì)列。反過來,semsleeping。sleeper指向該進(jìn)程的PCB。9、 進(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中。10、 文件系統(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給出新建文件的訪問模式(可由系統(tǒng)調(diào)用umask更 改),count是Linux保留的屬性。

struct files_struct *files;  //files包含了進(jìn)程當(dāng)前所打開的文件(struct file *fd[NR_OPEN])。在Linux中,一個(gè)進(jìn)程最多只能同時(shí)打開NR_OPEN個(gè)文件。而且,前三項(xiàng)分別預(yù)先設(shè)置為標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和出錯(cuò)消息輸出文件。 (3) int link_count;  //文件鏈(link)的數(shù)目。11、 內(nèi)存數(shù)據(jù)成員(1) struct mm_struct *mm;  //在linux 中,采用按需分頁的策略解決進(jìn)程的內(nèi)存需求。task_struct的數(shù)據(jù)成員mm指向關(guān)于存儲(chǔ)管理的mm_struct結(jié)構(gòu)。其中包含了一個(gè)虛存隊(duì)列 mmap,指向由若干vm_area_struct描述的虛存塊。同時(shí),為了加快訪問速度,mm中的mmap_avl維護(hù)了一個(gè)AVL樹。在樹中,所有的 vm_area_struct虛存塊均由左指針指向相鄰的低虛存塊,右指針指向相鄰的高虛存塊。 結(jié)構(gòu)定義在include/linux/sched.h中。12、頁面管理(1) int swappable:1;  //進(jìn)程占用的內(nèi)存頁面是否可換出。swappable為1表示可換出。(2) unsigned long swap_address;  //虛存地址比swap_address低的進(jìn)程頁面,以前已經(jīng)換出或已換出過,進(jìn)程下一次可換出的頁面自swap_address開始。

(3)unsigned long min_flt,maj_flt;  //該進(jìn)程累計(jì)的minor缺頁次數(shù)和major缺頁次數(shù)。(4) unsigned long nswap;  //該進(jìn)程累計(jì)換出的頁面數(shù)。(5) unsigned long cmin_flt,cmaj_flt,cnswap;  //以本進(jìn)程作為祖先的所有層次子進(jìn)程的累計(jì)換入頁面、換出頁面計(jì)數(shù)。(6) unsigned long old_maj_flt,dec_flt;(7) unsigned long swap_cnt;  //下一次信號(hào)最多可換出的頁數(shù)。

13. 進(jìn)程隊(duì)列的全局變量

(1) current;  //當(dāng)前正在運(yùn)行的進(jìn)程的指針,在SMP中則指向CPU組中正被調(diào)度的CPU的當(dāng)前進(jìn)程.

(2) struct task_struct init_task;  //即0號(hào)進(jìn)程的PCB,是進(jìn)程的“根”,始終保持初值INIT_TASK。

(3) struct task_struct *task[NR_TASKS];  //進(jìn)程隊(duì)列數(shù)組,規(guī)定系統(tǒng)可同時(shí)運(yùn)行的最大進(jìn)程數(shù)(見kernel/sched.c)。NR_TASKS定義在include/linux/tasks.h 中,值為512。每個(gè)進(jìn)程占一個(gè)數(shù)組元素(元素的下標(biāo)不一定就是進(jìn)程的pid),task[0]必須指向init_task(0號(hào)進(jìn)程)。可以通過 task[]數(shù)組遍歷所有進(jìn)程的PCB。但Linux也提供一個(gè)宏定義for_each_task(),它通過next_task遍歷所有進(jìn)程的PCB。

(4) unsigned long volatile jiffies;  //Linux的基準(zhǔn)時(shí)間。系統(tǒng)初始化時(shí)清0,以后每隔10ms由時(shí)鐘中斷服務(wù)程序do_timer()增1。

(5) int need_resched;  //重新調(diào)度標(biāo)志位。當(dāng)需要Linux調(diào)度時(shí)置位。在系統(tǒng)調(diào)用返回前(或者其它情形下),判斷該標(biāo)志是否置位。置位的話,馬上調(diào)用schedule進(jìn)行CPU調(diào)度。

(6) unsigned long intr_count;  //記錄中斷服務(wù)程序的嵌套層數(shù)。正常運(yùn)行時(shí),intr_count為0。當(dāng)處理硬件中斷、執(zhí)行任務(wù)隊(duì)列中的任務(wù)或者執(zhí) 行bottom half隊(duì)列中的任務(wù)時(shí),intr_count非0。這時(shí),內(nèi)核禁止某些操作,例如不允許重新調(diào)度。

}

 

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴义市| 余庆县| 福贡县| 砀山县| 河北省| 泾源县| 井冈山市| 阿拉善右旗| 新密市| 莲花县| 鹤峰县| 岳阳县| 古田县| 陇川县| 全南县| 申扎县| 林西县| 疏附县| 东港市| 米脂县| 长丰县| 常山县| 西平县| 淮滨县| 平罗县| 互助| 阿图什市| 瑞昌市| 临沧市| 临桂县| 定南县| 营山县| 永泰县| 武川县| 仪陇县| 邻水| 十堰市| 米易县| 夏津县| 玉环县| 军事|