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

来源:http://www.cnblogs.com/Lynn-Zhang/archive/2016/06/16/5589944.html
-Advertisement-
Play Games

進程式控制制塊,英文名(Processing Control Block),簡稱 PCB 。 進程式控制制塊是系統為了管理進程設置的一個專門的數據結構,主要表示進程狀態。 每一個進程都對應一個PCB來維護進程相關的信息; 在Linux中,PCB結構為task_struct; task_struct是Linu ...


進程式控制制塊,英文名(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,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; //用於申請空間時用的自旋鎖。自旋鎖的主要功能是臨界區保護 };   

 

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介 在上篇文章中我們談到了查詢優化器和執行計劃緩存的關係,以及其二者之間的衝突。本篇文章中,我們會主要闡述執行計劃緩存常見的問題以及一些解決辦法。 將執行緩存考慮在內時的流程 上篇文章中提到了查詢優化器解析語句的過程,當將計劃緩存考慮在內時,首先需要查看計劃緩存中是否已經有語句的緩存,如果沒有,才 ...
  • 第13章 可擴展性設計之 MySQL Replication 前言: MySQL Replication 是 MySQL 非常有特色的一個功能,他能夠將一個 MySQL Server 的 Instance 中的數據完整的複製到另外一個 MySQL Server 的 Instance 中。雖然複製過程 ...
  • 安裝SQL Server2016正式版 今天終於有時間安裝SQL Server2016正式版,下載那個安裝包都用了一個星期 安裝包可以從這裡下載: http://www.itellyou.cn/ https://msdn.microsoft.com/zh-cn/subscriptions/downl ...
  • 環境:SQL Server2012 SP3 企業版,開發伺服器,並沒有什麼負載,全庫索引統一Rebuild過 經反覆執行驗證過, 不算太複雜的SQL(存儲過程中代入參數摳出來的SQL代碼) 預設情況下,執行完成需要3秒鐘 非要用紅色圈中子查詢中的表(是一個相關子查詢)去驅動其他表, 添加OPTION ...
  • 1. 配置防火牆 正確配置防火牆的過濾規則,否則會造成NFS文件系統的掛載失敗,NIS賬戶認證的失敗,mpirun遠程任務實例投放的失敗。一般情況下,計算集群是在內部區域網中使用,所以可以不用太顧及安全問題,直接關閉掉所有節點伺服器的防火牆即可。 相關命令如下: 2. 配置集群區域網ip與主機名的映 ...
  • 一、nginx的簡單介紹 nginx 結構上分為3大模塊: 1.核心模塊(HTTP模塊、EVENT模塊和MAIL模塊) 2.基礎模塊(HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊) 3.第三方模塊(GI模塊、HTTP Proxy模塊 ...
  • 在OS中調度的是實質是一種資源分配。 調度演算法是指:根據系統資源分配策略所規定的資源分配演算法。對於不同的系統或系統目標,通常採用不同的調度演算法。 1.先來先服務和短作業(進程)優先調度演算法 1)先來先服務調度演算法 先來先服務(FCFS)調度演算法是一種最 簡單的調度演算法,該演算法既可用於作業調度,也可用 ...
  • 學習Linux Shell知識,就來Linux大學網(Linuxdaxue.com)! 本系列適合Linux初學者,屬於Linux入門級教程,主要介紹了Shell的分類、語法格式以及腳本的使用和編寫格式等。 不斷更新中,是Shell學習的必讀經典教程。 現主要包含以下文章: Linux Shell系 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...