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

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

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

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

在Linux中,PCB結構爲task_struct;數據結構

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

task_struct結構圖:dom

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

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

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

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

各類標識符
域名 含義
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,gid
    uid_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;   //是否使用FPU
    char 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;   //用於申請空間時用的自旋鎖。自旋鎖的主要功能是臨界區保護

};
      
相關文章
相關標籤/搜索