色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í)其描述)
主站蜘蛛池模板: 亚洲人成人网站18禁 | 99国产精品免费观看视频re | 国产尺码和欧洲尺码表2023 | freechinese内射少妇 | 久久456| 伊人焦久| 免费观看又色又爽又黄的校园 | 国产又黄又潮娇喘视频在线观看 | 性生交大全免费看 | 91片看 | 在线观看亚洲AV每日更新无码 | 欧美中文字幕一区二区 | 嫩草视频在线播放 | 波多野结衣AV在线无码中文观看 | 亚洲精品国产一区二区三区四区在线 | 毛片网站免费观看 | 四虎永久地址www成人 | 中文字幕无码乱人伦在线 | 国产一伦一伦一伦 | 男人的天堂Aⅴ在线 | 国产成人无码午夜视频在线观看 | 亚洲av综合avav中文 | 中文字幕中文字幕一区二区 | 一本色道无码道DVD在线观看 | 男人把女人桶到爽爆的视频 | 久久99精品国产自在现线小黄鸭 | 免费人成无码视频在线观看 | 亚洲日韩国产一区二区三区在线 | 乱码午夜极品国产内射 | 欧美激情国产精品视频一区二区 | 他一边曰一边吃我奶小说免看 | 哦┅┅快┅┅用力啊┅┅在线观看 | 亚洲日韩欧美一区、二区 | 日韩欧美亚洲一区二区三区 | 欧美精品影院 | 夜夜操狠狠操 | 18以下勿进色禁网站免费看 | 久久精品99国产精品亚洲 | 国产高清一国产aV麻豆网 | 无码无遮挡在线观看免费 | 国产午夜草莓视频在线观看 |