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

首頁 > 學院 > 開發設計 > 正文

Linux下PCB的task_struck結構體

2019-11-08 03:04:14
字體:
來源:轉載
供稿:網友

linux中,把每一個進程的基本信息抽象成一個結構體,這就是task_struct結構體,在include/linux/sched.h文件中定義。      一說到進程,就要想到task_struct結構體。每個進程都會被分配一個task_struct結構,它包含了這個進程的所有信息。在任何時候,操作系統都能跟蹤這個結構的信息。struct task_struct {  volatile long state;/ /這個是進程的運行時狀態,-1代表不可運行,0代表可運行,>0代表已停止。可運行狀態 TASK_RUNNING處于這種狀態的進程,要么正在運行、要么正準備運行。正在運行的進程就是當前進程(由current所指向的進程),而準備運行的進程只要得到CPU就可以立即投入運行,CPU是這些進程唯一等待的系統資源。系統中有一個運行隊列(run_queue),用來容納所有處于可運行狀態的進程,調度程序執行時,從中選擇一個進程投入運行。在后面我們討論進程調度的時候,可以看到運行隊列的作用。當前運行進程一直處于該隊列中,也就是說,current總是指向運行隊列中的某個元素,只是具體指向誰由調度程序決定。等待狀態 TASK_INTERRUPTIBLE可中斷 TASK_UNINTERRUPTIBLE不可中斷 處于該狀態的進程正在等待某個事件(event)或某個資源,它肯定位于系統中的某個等待隊列(wait_queue)中。Linux中處于等待狀態的進程分為兩種:可中斷的等待狀態和不可中斷的等待狀態。處于可中斷等待態的進程可以被信號喚醒,如果收到信號,該進程就從等待狀態進入可運行狀態,并且加入到運行隊列中,等待被調度;而處于不可中斷等待態的進程是因為硬件環境不能滿足而等待,例如等待特定的系統資源,它任何情況下都不能被打斷,只能用特定的方式來喚醒它,例如喚醒函數wake_up()等。暫停狀態TASK_STOPPED此時的進程暫時停止運行來接受某種特殊處理。通常當進程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信號后就處于這種狀態。例如,正接受調試的進程就處于這種狀態。僵死狀態TASK_ZOMBIE進程雖然已經終止,但由于某種原因,父進程還沒有執行wait()系統調用,終止進程的信息也還沒有回收。顧名思義,處于該狀態的進程就是死進程,這種進程實際上是系統中的垃圾,必須進行相應處理以釋放其占用的資源  unsigned int flags;  /*flags是進程當前的狀態標志,具體的如:0x00000002表示進程正在被創建;0x00000004表示進程正準備退出;0x00000040 表示此進程被fork出,但是并沒有執行exec;0x00000400表示此進程由于其他進程發送相關信號而被殺死 。*/ unsigned int rt_PRiority;//表示此進程的運行優先級   struct list_head tasks;//這里出現了list_head結構體,詳情請參考  struct mm_struct *mm;//這里出現了mm_struct 結構體,該結構體記錄了進程內存使用的相關情況,詳情請參考 /* 接下來是進程的一些狀態參數*/ int exit_state; int exit_code, exit_signal;//這個是進程號 pid_t pid; //這個是進程組號 pid_t tgid; //real_parent是該進程的”親生父親“,不管其是否被“寄養”。 struct task_struct *real_parent; //parent是該進程現在的父進程,有可能是”繼父“ struct task_struct *parent;  //這里children指的是該進程孩子的鏈表,可以得到所有孩子的進程描述符,但是需使用list_for_each和list_entry,list_entry其實直接使用了container_of,詳情請參考 struct list_head children;  //同理,sibling該進程兄弟的鏈表,也就是其父親的所有孩子的鏈表。用法與children相似。 struct list_head sibling;  //這個是主線程的進程描述符,也許你會奇怪,為什么線程用進程描述符表示,因為linux并沒有單獨實現線程的相關結構體,只是用一個進程來代替線程,然后對其做一些特殊的處理。 struct task_struct *group_leader;  //這個是該進程所有線程的鏈表。 struct list_head thread_group; //顧名思義,這個是該進程使用cpu時間的信息,utime是在用戶態下執行的時間,stime是在內核態下執行的時間。 cputime_t utime, stime; //下面的是啟動的時間,只是時間基準不一樣。 struct timespec start_time;    struct timespec real_start_time; //comm是保存該進程名字的字符數組,長度最長為15,因為TASK_COMM_LEN為16。 char comm[TASK_COMM_LEN]; /* 文件系統信息計數*/ int link_count, total_link_count; /*該進程在特定CPU下的狀態*/ struct thread_struct thread;/* 文件系統相關信息結構體*/ struct fs_struct *fs;/* 打開的文件相關信息結構體 */ struct files_struct *files;  /* 信號相關信息的句柄*/ struct signal_struct *signal; struct sighand_struct *sighand;  /*這些是松弛時間值,用來規定select()和poll()的超時時間,單位是納秒nanoseconds  */ unsigned long timer_slack_ns; unsigned long default_timer_slack_ns;};


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西城区| 通海县| 天台县| 阿拉善右旗| 甘泉县| 隆安县| 廊坊市| 淳安县| 砀山县| 克什克腾旗| 读书| 灵武市| 宁蒗| 大丰市| 叙永县| 正定县| 宝丰县| 陆川县| 沐川县| 武强县| 历史| 沛县| 杭锦后旗| 城口县| 石狮市| 锡林浩特市| 麻江县| 会宁县| 兴文县| 静宁县| 汉川市| 怀宁县| 井冈山市| 固镇县| 辉县市| 鄂伦春自治旗| 财经| 张家港市| 高平市| 灵丘县| 大竹县|