進程控制塊PCB結構體 task_struct 描述

進程控制塊,英文名(Processing Control Block),簡稱 PCB 。

進程控制塊是系統為了管理進程設置的一個專門的數據結構,主要表示進程狀態。

每一個進程都對應一個PCB來維護進程相關的信息;

在Linux中,PCB結構為task_struct;

task_struct是Linux內核的一種數據結構,它會被裝載到RAM里并且包含進程的信息,每個進程都把它的信息放在task_struct這個數據結構里。

task_struct結構圖:

?task_struct描述:
1.進程狀態:是調度和兌換的依據

linux進程的狀態
內核表示 含義
TASK_RUNNING可運行
TASK_INTERRUPTIBLE可中斷的等待狀態
TASK_UNINTERRUPTIBLE不可中斷的等待狀態
TASK_ZOMBIE僵死
TASK_STOPPED暫停
TASK_SWAPPING換入/換出

2.標識符:描述本進程的唯一標識符,用來區別其它進程

  每個進程都有一個唯一的標識符,內核通過這個標識符來識別不同的進程,同時,進程標識符PID也是內核提供給用戶程序的接口,用戶程序通過PID對進程發號施令。PID是32位的無符號整數,它被順序編號:新創建進程的PID通常是前一個進程的PID加1。然而,為了與16位硬件平臺的傳統Linux系統保持兼容,在Linux上允許的最大PID號是32767,當內核在系統中創建第32768個進程時,就必須重新開始使用已閑置的PID號。

各種標識符
域名含義
pid進程標識符
ppid父進程
uid、gid用戶標識符、組標識符
euid、egid有效用戶標識符、有效組標識符
suid、sgid備份用戶標識符、備份組標識符
fsuid、fsgid文件系統用戶標識符、文件系統組標識符

3.進程調度信息

  調度程序利用這部分信息決定系統中哪個進程應該優先運行,并結合進程的狀態信息保證系統運轉的公平和高效。這一部分信息通常包括進程的類別(普通進程還是實時進程)、進程的優先級(priority)等等

進程調度信息
域名含義
need_resched調度標志
nice靜態優先級
counter動態優先級
policy調度策略
rt_priority?實時優先級

need_resched被設置時,在“下一次的調度機會”就調用調度程序schedule()。?counter代表進程剩余的時間片,是進程調度的主要依據,也可以說是進程的動態優先級,因為這個值在不斷地減少;nice是進程的靜態優先級,同時也代表進程的時間片,用于對counter賦值,可以用nice()系統調用改變這個值;policy是適用于該進程的調度策略,實時進程和普通進程的調度策略是不同的;rt_priority只對實時進程有意義,它是實時進程調度的依據。

? ?進程調度的策略
名稱解釋適用范圍
SCHED_OTHER?其它調度?普通進程
?SCHED_FIFO先來先服務調度??實時進程
?SCHED_RR時間片輪轉調度?

4.程序計數器:程序中即將被執行的下一條指令的地址

5.內存指針:包括程序代碼和進程相關數據指針,還有和其他進程共享的內存塊的指針

6.與處理器相關的上下文數據:程序執行時處理器的寄存器中的數據

7.I/O狀態信息:包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表

8.記賬信息:可以包括處理器時間總和,使用的時鐘數總和、時間限制、記賬號等

struct task_struct
{volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped *//*表示進程的當前狀態:TASK_RUNNING:正在運行或在就緒隊列run-queue中準備運行的進程,實際參與進程調度。TASK_INTERRUPTIBLE:處于等待隊列中的進程,待資源有效時喚醒,也可由其它進程通過信號(signal)或定時中斷喚醒后進入就緒隊列run-queue。TASK_UNINTERRUPTIBLE:處于等待隊列中的進程,待資源有效時喚醒,不可由其它進程通過信號(signal)或定時中斷喚醒。TASK_ZOMBIE:表示進程結束但尚未消亡的一種狀態(僵死狀態)。此時,進程已經結束運行且釋放大部分資源,但尚未釋放進程控制塊。TASK_STOPPED:進程被暫停,通過其它進程的信號才能喚醒。導致這種狀態的原因有二,或者是對收到SIGSTOP、SIGSTP、SIGTTIN或SIGTTOU信號的反應,或者是受其它進程的ptrace系統調用的控制而暫時將CPU交給控制進程。TASK_SWAPPING: 進程頁面被交換出內存的進程。*/    unsigned long flags;  //進程標志,與管理有關,在調用fork()時給出int sigpending;     //進程上是否有待處理的信號mm_segment_t addr_limit;   //進程地址空間,區分內核進程與普通進程在內存存放的位置不同/*用戶線程空間地址: 0..0xBFFFFFFF。內核線程空間地址: 0..0xFFFFFFFF     */struct exec_domain *exec_domain;  //進程執行域volatile long need_resched;     //調度標志,表示該進程是否需要重新調度,若非0,則當從內核態返回到用戶態,會發生調度unsigned long ptrace;int lock_depth;  //鎖深度long counter;   //進程的基本時間片,在輪轉法調度時表示進程當前還可運行多久,在進程開始運行是被賦為priority的值,以后每隔一個tick(時鐘中斷)遞減1,減到0時引起新一輪調 度。重新調度將從run_queue隊列選出counter值最大的就緒進程并給予CPU使用權,因此counter起到了進程的動態優先級的作用long nice;     //靜態優先級unsigned long policy;  //進程的調度策略,有三種,實時進程:SCHED_FIFO,SCHED_RR,分時進程:SCHED_OTHER
//在Linux 中, 采用按需分頁的策略解決進程的內存需求。task_struct的數據成員mm 指向關于存儲管理的mm_struct結構。struct mm_struct *mm;  //進程內存管理信息int has_cpu, processor;unsigned long cpus_allowed;struct list_head run_list;  //指向運行隊列的指針unsigned long sleep_time;   //進程的睡眠時間//用于將系統中所有的進程連成一個雙向循環鏈表,其根是init_task//在Linux 中所有進程(以PCB 的形式)組成一個雙向鏈表,next_task和prev_task是鏈表的前后向指針struct task_struct *next_task, *prev_task;struct mm_struct *active_mm;  //active_mm 指向活動地址空間。struct linux_binfmt *binfmt;  //進程所運行的可執行文件的格式int exit_code, exit_signal;int pdeath_signal;    //父進程終止是向子進程發送的信號unsigned long personality;int dumpable:1;int did_exec:1;pid_t pid;   //進程標識符,用來代表一個進程pid_t pgrp;  //進程組標識,表示進程所屬的進程組pid_t tty_old_pgrp;    //進程控制終端所在的組標識pid_t session;      //進程的會話標識pid_t tgid;int leader;        //表示進程是否為會話主管
  //指向最原始的進程任務指針,父進程任務指針,子進程任務指針,新兄弟進程任務指針,舊兄弟進程任務指針。 struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;struct list_head thread_group;   //線程鏈表
  //用于將進程鏈入HASH表,系統進程除了鏈入雙向鏈表外,還被加入到hash表中struct task_struct *pidhash_next;struct task_struct **pidhash_pprev; wait_queue_head_t wait_chldexit;   //供wait4()使用struct semaphore *vfork_sem;     //供vfork()使用unsigned long rt_priority;      //實時優先級,用它計算實時進程調度時的weight值
   //it_real_value,it_real_incr用于REAL定時器,單位為jiffies,系統根據it_real_value//設置定時器的第一個終止時間.在定時器到期時,向進程發送SIGALRM信號,同時根據//it_real_incr重置終止時間,it_prof_value,it_prof_incr用于Profile定時器,單位為jiffies。//當進程運行時,不管在何種狀態下,每個tick都使it_prof_value值減一,當減到0時,向進程發送信號SIGPROF,并根據it_prof_incr重置時間.//it_virt_value,it_virt_value用于Virtual定時器,單位為jiffies。當進程運行時,不管在何種//狀態下,每個tick都使it_virt_value值減一當減到0時,向進程發送信號SIGVTALRM,根據it_virt_incr重置初值unsigned long it_real_value, it_prof_value, it_virt_value;unsigned long it_real_incr, it_prof_incr, it_virt_incr;struct timer_list real_timer;  //指向實時定時器的指針struct tms times;         //記錄進程消耗的時間unsigned long start_time;    //進程創建的時間long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS];//記錄進程在每個CPU上所消耗的用戶態時間和核心態時間//內存缺頁和交換信息://min_flt, maj_flt累計進程的次缺頁數(Copyon Write頁和匿名頁)和主缺頁數(從映射文件或交換//設備讀入的頁面數);nswap記錄進程累計換出的頁面數,即寫到交換設備上的頁面數。//cmin_flt, cmaj_flt,cnswap記錄本進程為祖先的所有子孫進程的累計次缺頁數,主缺頁數和換出頁面數。//在父進程回收終止的子進程時,父進程會將子進程的這些信息累計到自己結構的這些域中unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;int swappable:1;   //表示進程的虛擬地址空間是否允許換出//進程認證信息//uid,gid為運行該進程的用戶的用戶標識符和組標識符,通常是進程創建者的uid,gid,euid,egid為有效uid,gid//fsuid,fsgid為文件系統uid,gid,這兩個ID號通常與有效uid,gid相等,在檢查對于文件系統的訪問權限時使用他們。//suid,sgid為備份uid,giduid_t uid,euid,suid,fsuid;gid_t gid,egid,sgid,fsgid;int ngroups;     //記錄進程在多少個用戶組中gid_t groups[NGROUPS];  //記錄進程所在的組kernel_cap_t cap_effective, cap_inheritable, cap_permitted;//進程的權能,分別是有效位集合,繼承位集合,允許位集合int keep_capabilities:1;struct user_struct *user;  //代表進程所屬的用戶struct rlimit rlim[RLIM_NLIMITS];   //與進程相關的資源限制信息unsigned short used_math;   //是否使用FPUchar comm[16];     //進程正在運行的可執行文件名//文件系統信息int link_count;struct tty_struct *tty;  //進程所在的控制終端,如果不需要控制終端,則該指針為空unsigned int locks; /* How many file locks are being held *///進程間通信信息struct sem_undo *semundo;  //進程在信號量上的所有undo操作struct sem_queue *semsleeping;  //當進程因為信號量操作而掛起時,他在該隊列中記錄等待的操作struct thread_struct thread;   //進程的CPU狀態,切換時,要保存到停止進程的task_struct中struct fs_struct *fs;     //文件系統信息,fs保存了進程本身與VFS(虛擬文件系統)的關系信息struct files_struct *files; //打開文件信息//信號處理函數spinlock_t sigmask_lock; /* Protects signal and blocked */struct signal_struct *sig; //信號處理函數sigset_t blocked;      //進程當前要阻塞的信號,每個信號對應一位struct sigpending pending; //進程上是否有待處理的信號unsigned long sas_ss_sp;size_t sas_ss_size;int (*notifier)(void *priv);void *notifier_data;sigset_t *notifier_mask;/* Thread group tracking */u32 parent_exec_id;u32 self_exec_id;spinlock_t alloc_lock; //用于申請空間時用的自旋鎖。自旋鎖的主要功能是臨界區保護};

 

  

轉載于:https://www.cnblogs.com/Lynn-Zhang/p/5589944.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于OpenCV與tensorflow實現實時手勢識別

基于OpenCV與tensorflow object detection API使用遷移學習,基于SSD模型訓練實現手勢識別完整流程,涉及到數據集收集與標注、VOC2012數據集制作,tfrecord數據生成、SSD遷移學習與模型導出,OpenCV攝像頭實時視頻流讀取與檢測處理&a…

學習筆記(25):Python網絡編程并發編程-Thread其他屬性和守護線程

立即學習:https://edu.csdn.net/course/play/24458/296440?utm_sourceblogtoedu 1.Thread其他的屬性 CurrentThread().getName():獲得當前線程的名字 t.is_Alive:判斷線程是否還在運行 t.join():等待線程運行結束再執行join后面的代碼 t.setName("name"):為線程…

AIX主機信任關系配置

1.配置主機信任關系的時候,需要先在兩臺主機/etc/hosts文件中添加要信任主機的IP,假設有(192.168.8.190 aix190,192.168.8.191 aix191)2個主機,在191主機配置如下所示 192.168.8.190 aix190 2.如果系統配置DNS,則需要去…

Sprint2團隊貢獻分

團隊貢獻分: 郭志豪:31% http://www.cnblogs.com/gzh13692021053/ 楊子健:22%http://www.cnblogs.com/yzj666/ 譚宇森:23%http://www.cnblogs.com/yzj666/ 劉森松:24% http://www.cnblogs.com/lssh/轉載于:https://w…

學習筆記(26):Python網絡編程并發編程-GIL與自定義互斥鎖的區別

立即學習:https://edu.csdn.net/course/play/24458/296443?utm_sourceblogtoedu 1.GIL的基本概念 答:GIL本質上就是一把鎖,只是他是一把在python解釋器上的鎖 2.GIL與互斥鎖的區別 答: 1)GIL保護的是在python解釋器上的參數&a…

多目標跟蹤檢測

方法: 1、實時性,每幀視頻10ms 2、方法,首先深度學習檢測到目標,然后再寫跟蹤算法

2014年最具人氣國外WORDPRESS主題

在國外,WrodPress這個博客系統極為受歡迎,使用WordPress來建站可以降低很多成本,另外還能以十分便宜的價格獲得一個漂亮的WP網站模板。 今天向大家分享來自Themeforest 2014年最具人氣的高級WrodPress主題,這些主題無論是設計還是…

軟件工程學習感想

通過這半學期我對軟件工程的學習,從軟件工程的基礎到考試用戶的需求分析與求解,最后到黑盒白盒測試通過自身做過的一些案例,講解了軟件工程這門本身枯燥乏味的課程,這不僅增強了學生學習的積極性,也通過讓我們自己去做…

開源視覺salm算法介紹

當前的開源SLAM方案 開源方案傳感器形式地址鏈接MonoSLAM單目https://github.com/hanmekim/SceneLib2 PTAM單目 http://www.robots.ox.ac.uk/~gk/PTAM/ORB-SLAM 單目為主http://webdiis.unizar.es/~raulmur/orbslam/ORB-SLAM2單目https://github.com/raulmur/ORB_SLAM2LSD-SLAM…

學習筆記(27):Python網絡編程并發編程-GIL與多線程

立即學習:https://edu.csdn.net/course/play/24458/296444?utm_sourceblogtoedu GIL與多線程 1.須知: 1)cpu主要是為了提升計算性能,增加CPU提升計算性能; 2)每一個CPU一旦遇到阻塞狀態都會處于等待狀態&#xff0c…

J0ker的CISSP之路:復習-Access Control(3)

本文同時發表在:[url]http://netsecurity.51cto.com/art/200801/63649.htm[/url] 在《J0ker的CISSP之路》系列的上一篇文章里,J0ker給大家介紹了訪問控制CBK里面一些常見的破壞信息資產保密性的威脅類型,那么什么類型的威脅會破壞信息資產的完…

C#中對泛型List進行分組輸出元素

背景:在輸出列表時,往往需要按照某一字段進行分組,比如在輸出城市列表時,按照首字母進行分組,輸出學生列表時,按照年級進行分組,然后再對分組的結果按照其他的字段進行排序。 如存在以下STU學生…

分頁3

http://www.cnblogs.com/ChrisLee2011/p/4288194.html 頁面的HTML部分如下&#xff1a; < div class "tableContainer"> < input id "currentPage" type "hidden" value " ViewData[ "currentPage"] "/> < i…

最優化課堂筆記01: 第一章 最優化的基本概念

第一章 最優化的基本概念 1.最優化求解的數學模型建立 2.例題&#xff08;考試第一大題&#xff1a;數學模型建立&#xff09; 解析&#xff1a;優化變量、目標函數&#xff08;一般取最小化&#xff09;、約束條件 注意&#xff1a; 1&#xff09;約束條件一般形式為&#…

面向對象中構造函數的小練習

//寫一個Ticket類&#xff0c;有一個距離屬性&#xff08;本屬性只讀&#xff0c;在構造方法中賦值&#xff09;&#xff0c;不能為負數//有一個價格屬性&#xff0c;價格屬性為只讀&#xff0c;并且根據距離distance計算價格Price(1元/公里)//0--100公里 票價不打折//101-20…

EIGRP非等價負載均衡

1、等價負載均衡 當到達目的地有多條路徑時&#xff0c;而有多條路徑的metric值一樣&#xff0c;這時就可以做等價負載均衡&#xff0c;讓數據包均衡轉發&#xff0c;不過要看該路由器的轉發方式&#xff0c;如果是快速轉發方式&#xff0c;這種方式無用&#xff08;本地產生的…

ubuntu100%快速安裝搜狗輸入法

1、進入搜狗官方網站&#xff0c;下載最新版本的for ubuntu輸入法deb安裝包 2、下載完成以后&#xff0c;進入下載好的文件目錄&#xff0c;在空白處點擊鼠標右鍵&#xff0c;打開終端 在終端窗口輸入如下的指令開始安裝搜狗拼音輸入法。 #sudo dpkg -i sogoupinyin_2.2.0.01…

提升權限終極技巧

文章作者&#xff1a;WekweN本篇文章結合了許多高手提升權限的技巧和自己的一些想法 當我們取得一個webshell時候&#xff0c;下一部要做的就是提升權限 個人總結如下&#xff1a; 1: C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\ 看能否跳轉到…

移動設備頁面高度不足時min-height 的尷尬處理

移動設備頁面高度不足時min-height 的尷尬處理 在做html5的頁面時&#xff0c;經常遇到頁面內容太少撐不起來整個手機屏幕的高度。 我們經常使用min-height來處理&#xff0c;比如min-height:568px; 對應的是iPhone5 的高度&#xff1b; 而這樣iPhone6plus下方就會出現空白。 而…

最優化課堂筆記02:第二章 線性規劃

第二章 線性規劃&#xff08;重點&#xff1a;單純形法&#xff09; 1.線性規劃問題及其模型&#xff08;重點&#xff1a;標準形式&#xff09; 題型&#xff1a;是否為標準形式&#xff1f;不是的話化為標準形式&#xff01; 1&#xff09;問題的提出 提出問題&#xff1…