色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置: > 華清遠(yuǎn)見(jiàn)教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > 關(guān)于task_struct的認(rèn)識(shí)
關(guān)于task_struct的認(rèn)識(shí)
時(shí)間:2016-12-12作者:華清遠(yuǎn)見(jiàn)

在linux 中每一個(gè)進(jìn)程都由task_struct 數(shù)據(jù)結(jié)構(gòu)來(lái)定義. task_struct就是我們通常所說(shuō)的PCB.她是對(duì)進(jìn)程控制的唯一手段也是有效的手段. 當(dāng)我們調(diào)用fork() 時(shí), 系統(tǒng)會(huì)為我們產(chǎn)生一個(gè)task_struct結(jié)構(gòu)。然后從父進(jìn)程,那里繼承一些數(shù)據(jù), 并把新的進(jìn)程插入到進(jìn)程樹(shù)中, 以待進(jìn)行進(jìn)程管理。因此了解task_struct的結(jié)構(gòu)對(duì)于我們理解任務(wù)調(diào)度(在linux 中任務(wù)和進(jìn)程是同一概念)的關(guān)鍵。

在進(jìn)行剖析task_struct的定義之前,我們先按照我們的理論推一下它的結(jié)構(gòu):

1、進(jìn)程狀態(tài) ,將紀(jì)錄進(jìn)程在等待,運(yùn)行,或死鎖
        2、調(diào)度信息, 由哪個(gè)調(diào)度函數(shù)調(diào)度,怎樣調(diào)度等
        3、進(jìn)程的通訊狀況
        4、因?yàn)橐迦脒M(jìn)程樹(shù),必須有聯(lián)系父子兄弟的指針, 當(dāng)然是task_struct型
        5、時(shí)間信息, 比如計(jì)算好執(zhí)行的時(shí)間, 以便cpu 分配
        6、標(biāo)號(hào) ,決定改進(jìn)程歸屬
        7、可以讀寫(xiě)打開(kāi)的一些文件信息
        8、 進(jìn)程上下文和內(nèi)核上下文
        9、處理器上下文
        10、內(nèi)存信息

因?yàn)槊恳粋(gè)PCB都是這樣的, 只有這些結(jié)構(gòu), 才能滿足一個(gè)進(jìn)程的所有要求。打開(kāi)/include/linux/sched.h可以找到task_struct 的定義
struct task_struct {
volatile long state;                 //說(shuō)明了該進(jìn)程是否可以執(zhí)行,還是可中斷等信息
unsigned long flags;                 //Flage 是進(jìn)程號(hào),在調(diào)用fork()時(shí)給出
int sigpending;                 //進(jìn)程上是否有待處理的信號(hào)
mm_segment_t addr_limit;                 //進(jìn)程地址空間,區(qū)分內(nèi)核進(jìn)程與普通進(jìn)程在內(nèi)存存放的位置不同
                   //0-0xBFFFFFFF for user-thead
                   //0-0xFFFFFFFF for kernel-thread
        //調(diào)度標(biāo)志,表示該進(jìn)程是否需要重新調(diào)度,若非0,則當(dāng)從內(nèi)核態(tài)返回到用戶(hù)態(tài),會(huì)發(fā)生調(diào)度
volatile long need_resched;
int lock_depth;                 //鎖深度
long nice;                 //進(jìn)程的基本時(shí)間片
        //進(jìn)程的調(diào)度策略,有三種,實(shí)時(shí)進(jìn)程:SCHED_FIFO,SCHED_RR, 分時(shí)進(jìn)程:SCHED_OTHER
unsigned long policy;
struct mm_struct *mm;                 //進(jìn)程內(nèi)存管理信息
int processor;
        //若進(jìn)程不在任何CPU上運(yùn)行, cpus_runnable 的值是0,否則是1 這個(gè)值在運(yùn)行隊(duì)列被鎖時(shí)更新
unsigned long cpus_runnable, cpus_allowed;
struct list_head run_list;                 //指向運(yùn)行隊(duì)列的指針
unsigned long sleep_time;                 //進(jìn)程的睡眠時(shí)間
        //用于將系統(tǒng)中所有的進(jìn)程連成一個(gè)雙向循環(huán)鏈表, 其根是init_task
struct task_struct *next_task, *prev_task;
struct mm_struct *active_mm;
struct list_head local_pages;                 //指向本地頁(yè)面
unsigned int allocation_order, nr_local_pages;
struct linux_binfmt *binfmt;                 //進(jìn)程所運(yùn)行的可執(zhí)行文件的格式
int exit_code, exit_signal;
int pdeath_signal;                 //父進(jìn)程終止是向子進(jìn)程發(fā)送的信號(hào)
unsigned long personality;
        //Linux可以運(yùn)行由其他UNIX操作系統(tǒng)生成的符合iBCS2標(biāo)準(zhǔn)的程序
int did_exec:1;
pid_t pid;         //進(jìn)程標(biāo)識(shí)符,用來(lái)代表一個(gè)進(jìn)程
pid_t pgrp;         //進(jìn)程組標(biāo)識(shí),表示進(jìn)程所屬的進(jìn)程組
pid_t tty_old_pgrp;         //進(jìn)程控制終端所在的組標(biāo)識(shí)
pid_t session;         //進(jìn)程的會(huì)話標(biāo)識(shí)
pid_t tgid;
int leader;         //表示進(jìn)程是否為會(huì)話主管
struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr;
struct list_head thread_group;         //線程鏈表
struct task_struct *pidhash_next;         //用于將進(jìn)程鏈入HASH表
struct task_struct **pidhash_pprev;
wait_queue_head_t wait_chldexit;         //供wait4()使用
struct completion *vfork_done;                 //供vfork() 使用
unsigned long rt_priority;         //實(shí)時(shí)優(yōu)先級(jí),用它計(jì)算實(shí)時(shí)進(jìn)程調(diào)度時(shí)的weight值
        //it_real_value,it_real_incr用于REAL定時(shí)器,單位為jiffies, 系統(tǒng)根據(jù)it_real_value
        //設(shè)置定時(shí)器的第一個(gè)終止時(shí)間. 在定時(shí)器到期時(shí),向進(jìn)程發(fā)送SIGALRM信號(hào),同時(shí)根據(jù)
        //it_real_incr重置終止時(shí)間,it_prof_value,it_prof_incr用于Profile定時(shí)器,單位為jiffies。
        //當(dāng)進(jìn)程運(yùn)行時(shí),不管在何種狀態(tài)下,每個(gè)tick都使it_prof_value值減一,當(dāng)減到0時(shí),向進(jìn)程發(fā)送
        //信號(hào)SIGPROF,并根據(jù)it_prof_incr重置時(shí)間.
        //it_virt_value,it_virt_value用于Virtual定時(shí)器,單位為jiffies。當(dāng)進(jìn)程運(yùn)行時(shí),不管在何種
        //狀態(tài)下,每個(gè)tick都使it_virt_value值減一當(dāng)減到0時(shí),向進(jìn)程發(fā)送信號(hào)SIGVTALRM,根據(jù)
        //it_virt_incr重置初值。
unsigned long it_real_value, it_prof_value, it_virt_value;
unsigned long it_real_incr, it_prof_incr, it_virt_value;
struct timer_list real_timer;                 //指向?qū)崟r(shí)定時(shí)器的指針
struct tms times;                 //記錄進(jìn)程消耗的時(shí)間
unsigned long start_time;                 //進(jìn)程創(chuàng)建的時(shí)間
        //記錄進(jìn)程在每個(gè)CPU上所消耗的用戶(hù)態(tài)時(shí)間和核心態(tài)時(shí)間
long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS];
        //內(nèi)存缺頁(yè)和交換信息:
        //min_flt, maj_flt累計(jì)進(jìn)程的次缺頁(yè)數(shù)(Copy on Write頁(yè)和匿名頁(yè))和主缺頁(yè)數(shù)(從映射文件或交換 //設(shè)備讀入的頁(yè)面數(shù)); nswap記錄進(jìn)程累計(jì)換出的頁(yè)面數(shù),即寫(xiě)到交換設(shè)備上的頁(yè)面數(shù)。
        //cmin_flt, cmaj_flt, cnswap記錄本進(jìn)程為祖先的所有子孫進(jìn)程的累計(jì)次缺頁(yè)數(shù),主缺頁(yè)數(shù)和換出頁(yè)面數(shù)。
        //在父進(jìn)程回收終止的子進(jìn)程時(shí),父進(jìn)程會(huì)將子進(jìn)程的這些信息累計(jì)到自己結(jié)構(gòu)的這些域中 unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
int swappable:1;         //表示進(jìn)程的虛擬地址空間是否允許換出 //進(jìn)程認(rèn)證信息
        //uid,gid為運(yùn)行該進(jìn)程的用戶(hù)的用戶(hù)標(biāo)識(shí)符和組標(biāo)識(shí)符,通常是進(jìn)程創(chuàng)建者的uid,gid
        //euid,egid為有效uid,gid
        //fsuid,fsgid為文件系統(tǒng)uid,gid,這兩個(gè)ID號(hào)通常與有效uid,gid相等,在檢查對(duì)于文件 //系統(tǒng)的訪問(wèn)權(quán)限時(shí)使用他們。
        //suid,sgid為備份uid,gid
uid_t uid,euid,suid,fsuid;
gid_t gid,egid,sgid,fsgid;
int ngroups;         //記錄進(jìn)程在多少個(gè)用戶(hù)組中
gid_t groups[NGROUPS];         //記錄進(jìn)程所在的組
        //進(jìn)程的權(quán)能,分別是有效位集合,繼承位集合,允許位集合
kernel_cap_t cap_effective, cap_inheritable, cap_permitted;
int keep_capabilities:1;
struct user_struct *user;
struct rlimit rlim[RLIM_NLIMITS];         //與進(jìn)程相關(guān)的資源限制信息
unsigned short used_math;         //是否使用FPU
char comm[16];         //進(jìn)程正在運(yùn)行的可執(zhí)行文件名
        //文件系統(tǒng)信息
int link_count, total_link_count;
        //NULL if no tty 進(jìn)程所在的控制終端,如果不需要控制終端,則該指針為空
struct tty_struct *tty;
unsigned int locks;
        //進(jìn)程間通信信息
struct sem_undo *semundo;         //進(jìn)程在信號(hào)燈上的所有undo操作
struct sem_queue *semsleeping;         //當(dāng)進(jìn)程因?yàn)樾盘?hào)燈操作而掛起時(shí),他在該隊(duì)列中記錄等待的操作
        //進(jìn)程的CPU狀態(tài),切換時(shí),要保存到停止進(jìn)程的task_struct中
struct thread_struct thread;
        //文件系統(tǒng)信息
struct fs_struct *fs;
        //打開(kāi)文件信息
struct files_struct *files;
        //信號(hào)處理函數(shù)
spinlock_t sigmask_lock;
struct signal_struct *sig;         //信號(hào)處理函數(shù)
sigset_t blocked;         //進(jìn)程當(dāng)前要阻塞的信號(hào),每個(gè)信號(hào)對(duì)應(yīng)一位
struct sigpending pending;         //進(jìn)程上是否有待處理的信號(hào)
unsigned long sas_ss_sp;
size_t sas_ss_size;
int (*notifier)(void *priv);
void *notifier_data;
sigset_t *notifier_mask;
u32 parent_exec_id;
u32 self_exec_id;

spinlock_t alloc_lock;
void *journal_info; };

發(fā)表評(píng)論
評(píng)論列表(網(wǎng)友評(píng)論僅供網(wǎng)友表達(dá)個(gè)人看法,并不表明本站同意其觀點(diǎn)或證實(shí)其描述)
主站蜘蛛池模板: 男吃奶玩乳尖高潮视频 | 亚洲AV乱码一区二区三区按摩 | 日本高清免费在线观看 | 欧美另类人妖 | 久久久久久无码精品无码国产人妻丝瓜 | 亚洲精品网站在线观看你懂的 | 中年熟女被啪高潮视频 | 精品成在人线AV无码免费看 | 亚州日韩精品AV片无码中文 | 久久99精品国产99久久6尤物 | 求毛片网站 | 亚洲精品自产拍在线观看 | 国产国拍亚洲精品MV在线观看 | 韩日精品中文字幕 | 国产噜噜噜噜久久久久久久久 | 亚洲AV综合日韩 | 狠狠狠狼鲁欧美综合网 | 国产传媒在线免费观看 | 欧美一级毛片久久99精品蜜桃 | 熟女丝袜潮喷内裤视频网站 | 日韩精品欧美激情 | 丝袜自慰一区二区三区 | 荫蒂添的好舒服a片 | 国产精品久久久久久久久岛国 | 中文字幕人成乱码在线观看 | 欧美精品一区二区性色 | 人人妻人人妻人人人人妻人人 | 高清偷自拍亚洲精品三区 | 成人欧美精品一区二区 | 女上男下gifxxoo吃奶 | 久久久日韩精品一区二区三区 | 99视频精品全部免费 在线 | 久久精品国产欧美日韩 | 亚洲中文无码卡通动漫3D | 热热色影音先锋 | 91精品久久久久久9s密挑 | 国精品午夜福利视频不卡 | 性色黄| 日本久久久久久久做爰片日本 | 免费人成视频X8X8入口 | 麻豆最新国产AV原创精品 |