1. 程式人生 > >【Linux】PCB中的task_struct結構體

【Linux】PCB中的task_struct結構體

task_struct結構體

task_struct是程序控制塊PCB中的一個結構體,用來儲存程序的各種屬性資訊

這裡面有程序狀態,程序排程,程序識別符號,程序通訊,程序連結,時間和定時器,檔案系統,虛擬記憶體資訊以及頁面管理資訊,對稱多處理機資訊,上下文資訊等

結構體內部資訊介紹

1、程序狀態

linux中的程序有多種狀態,在程序的執行過程中,程序會隨著排程在多種狀態進行轉換

程序的狀態資訊是程序進行排程的對換的依據


2、程序排程資訊

程序排程則是用這部分資訊來決定程序排程的優先次序,結合著程序狀態資訊來保證程序合理有序的執行


程序有多種排程資訊,如先來先服務排程方式,時間片輪轉排程方式,最近訪問優先等排程方式


3、識別符號

每一個程序都有程序識別符號,使用者識別符號,組識別符號

程序識別符號PID就是用來標示不同的程序的,因為每一個程序都有唯一的識別符號,就和學生擁有唯一的學號,一個人擁有唯一的身份證號碼是一樣的。核心就是通過這個識別符號來識別不同的程序。


4、程序通訊有關資訊

如果多個程序在一個任務上執行協作,那麼就需要這些程序可以互相訪問對方的資源,互相通訊

linux中的主要程序通訊方式有:管道、訊號量,共享記憶體,訊號,和訊息佇列


5、程序連結資訊

程序的建立是具有繼承關係的。一個程序可以建立多個程序,這些子程序之間具有兄弟關係。

linux中,除了init程序,其他程序都有唯一一個父程序。

建立子程序可以通過fork()函式或者clone()函式。

除了PID外,子程序的task_struct結構體的大部分資訊都是從父程序中拷貝過來的。系統有必要記錄這些親屬關係,從而使程序之間的協作變得更加方便。

每個程序的task_struct結構有許多的指標,這些指標讓系統中所有程序的task_struct結構構成了一顆程序樹,這個程序樹的根就是初始化程序init的task_struct結構體。


6、時間和定時器資訊

一個程序從建立到終止叫做該程序的生存期(lifetime)。程序在其生存期內使用CPU的時間,核心都要進行記錄,以便進行統計、計費等有關操作。程序耗費CPU的時間由兩部分組成:一是在使用者模式(或稱為使用者態)下耗費的時間、一是在系統模式(或稱為系統態)下耗費的時間。每個時鐘滴答,也就是每個時鐘中斷,核心都要更新當前程序耗費CPU的時間資訊。




7、檔案系統資訊

程序可以開啟或關閉檔案,檔案屬於系統資源,Linux核心要對程序使用檔案的情況進行記錄。task_struct結構中有兩個資料結構用於描述程序與檔案相關的資訊。其中,fs_struct中描述了兩個VFS索引節點(VFS inode),這兩個索引節點叫做root和pwd,分別指向程序的可執行映象所對應的根目錄(home directory)和當前目錄或工作目錄。file_struct結構用來記錄了程序開啟的檔案的描述符


8、虛擬記憶體資訊

除了核心執行緒之外,每個程序都擁有自己的地址空間(也叫虛擬空間),用mm_struct來描述。另外Linux2.4還引入了另外一個域active_mm,這是為核心執行緒而引入。因為核心執行緒沒有自己的地址空間,為了讓核心執行緒與普通程序具有統一的上下文切換方式,當核心執行緒進行上下文切換時,讓切換進來的執行緒的active_mm 指向剛被排程出去的程序的active_mm


9、頁面管理資訊

當實體記憶體不足時,linux記憶體管理系統需要將記憶體的部分頁面轉到外存,其交換是以頁為單位的


10、對稱多處理機資訊


11、上下文資訊

這裡要特別注意標題:和“處理器”相關的環境資訊。程序作為一個執行環境的綜合,當系統排程某個程序執行,即為該程序建立完整的環境時,處理器(processor)的暫存器、堆疊等是必不可少的。因為不同的處理器對內部暫存器和堆疊的定義不盡相同,所以叫做“和處理器相關的環境”,也叫做“處理機狀態”。當程序暫時停止執行時,處理機狀態必須儲存在程序的task_struct結構中,當程序被排程重新執行時再從中恢復這些環境,也就是恢復這些暫存器和堆疊的值。


12、其他

(1)  struct wait_queue *wait_chldexit

在程序結束時,或發出系統呼叫wait4時,為了等待子程序的結束,而將自己(父程序)睡眠在該等待佇列上,設定狀態標誌為TASK_INTERRUPTIBLE,並且把控制權轉給排程程式。

(2)Struct rlimit rlim[RLIM_NLIMITS];

每一個程序可以通過系統呼叫setlimit和getlimit來限制它資源的使用。

(3)Int exit_code exit_signal;

程式的返回程式碼以及程式異常終止產生的訊號,這些資料由父程序(子程序完成後)輪流查詢。

(4)Char comm[16]

這個域儲存程序執行的程式的名字,這個名字用在除錯中。

(5)Unsigned long personality;

 Linux可以執行X86平臺上其它Unix作業系統生成的符合iBCS2標準的程式, personality進一步描述程序執行的程式屬於何種Unix平臺的“個性”資訊。通常有PER_Linux,PER_Linux_32BIT,PER_Linux_EM86,PER_SVR4,PER_SVR3,PER_SCOSVR3,PER_WYSEV386,PER_ISCR4,PER_BSD,PER_XENIX和PER_MASK等,參見include/Linux/personality.h>。

(6) int did_exec:1;

按POSIX要求設計的布林量,區分程序正在執行老程式程式碼,還是用系統呼叫execve()裝入一個新的程式。

(7)struct linux_binfmt *binfmt

指向程序所屬的全域性執行檔案格式結構,共有a.out、script、elf、java等四種。

相關推薦

LinuxPCBtask_struct結構

task_struct結構體 task_struct是程序控制塊PCB中的一個結構體,用來儲存程序的各種屬性資訊 這裡面有程序狀態,程序排程,程序識別符號,程序通訊,程序連結,時間和定時器,檔案系統,

Linux環境task_struct結構的各個欄位的含義

task_struct結構體 欄位介紹 Linux核心通過一個被稱為程序描述符的task_struct結構體來管理程序, task_struct是Linux中的【程序控制塊PCB結構】的具體資料結構 這個結構體包含了一個程序所需的所有資訊。它定義在linu

C++子函式返回結構的程式碼 及 字串常量傳入子函式的指標實現

說明: 1. 下面的子函式 getStu 裡,傳入了三個引數: 字串指標 char * name 整型變數 int k_year; char * k_sex; 2. 當把字串作為引數傳遞給子函式時,主程式中可以使用字串常量,但子函式的形參只能使用字元型指標 char

linux核心根據inode得到檔名

核心程式設計中,操作的物件往往是inode,但是如何根據inode得到檔名呢,或者找到對應於檔案系統的位置呢? 527 struct inode { 528 umode_t i_mode; 529 unsign

LinuxCentOS7修改中文字符集

CentOS 7中字符集檢視的方式是 locale -a   或者locale  如果想顯示中文的話,應該修改為LANG="zh_CN.UTF-8"在命令列介面臨時修改字符集的話,直接執行 LANG

Csizeof(空結構/空類)的大小

sizeof(空類/空結構體) = 1; #include <iostream> using namespace std; // 空類 class ClassA { }; // 繼承空類的空類 class ClassB

Linux淺談Linux下的PCBtask_struct結構

1.1 程序的概念 我之前在作業系統這門課中學過的有關程序的概念如下:        從作業系統層面上講:程序是程式的一次執行過程,是系統進行資源分配和處理機排程的一個獨立單位。程序的結構特性:程序=程式段+資料段+程序控制塊。程序的三種基本狀態:        · 就緒

Linux進程描述符task_struct結構詳解--Linux進程的管理與調度(一)

mage ase 設備 兩種 等價 而且 當前 結構體 技術 Linux內核通過一個被稱為進程描述符的task_struct結構體來管理進程,這個結構體包含了一個進程所需的所有信息。它定義在include/linux/sched.h文件中。 談到task_struct結構體

task_struct結構欄位介紹--LinuxPCB

(1) volatile long states; 表示程序的當前狀態: ? TASK_RUNNING:正在執行或在就緒佇列run-queue中準備執行的程序,實際參與程序排程。 ? TASK_INTERRUPTIBLE:處於等待佇列中的程序,待資源有效時喚醒,也可由其它程序通過訊號(signal)或定時中

淺談 C 語言結構struct與聯合體union

## C語言中結構 struct 與聯合 union 語法基本一致,如下以 struct 為例 一、struct 的基本用法 struct student {     int num;     char* sex; &nbs

linux程序task_struct結構的state域

談到task_struct結構體,可以說她是linux核心原始碼中最複雜的一個結構體了,成員之多,佔用記憶體之大。 鑑於她的複雜,我們不能簡單的褻瀆,而是要深入“窺探”. 下面先介紹這些複雜成員中的一員,state域 struct task_struct {    volatile long state

LinuxLinux常用操作命令

詳細信息 hadoop 用戶組 軟件 name vim使用 title redhat tail Linux簡介及Ubuntu安裝 常見指令 系統管理命令 打包壓縮相關命令 關機/重啟機器 Linux管道 Linux軟件包管理 vim使用 用戶及用戶組管理 文件權限管理

linuxlinuxtree的安裝

遞歸 進入 href com user sta 分享圖片 1.7 環境 # 2018/7/29 10:17:46測試成功! 一 Tree命令簡介   tree是一種遞歸目錄列表命令,產生一個深度縮進列表文件。 二 Tree命令安裝 1.下載安裝包,地址:http://mam

Linux關於mpiexec的config檔案可以在提交程式後修改

演算法評測需要跑很多次取均值,因此離不開linux叢集。 叢集上並行執行多次的命令是mpiexec,執行10次的命令是:mpiexec -n 10 -f config nohup python hel

LinuxLinux檢視所有正在執行的程序

可以使用ps命令。它能顯示當前執行中程序的相關資訊,包括程序的PID。Linux和UNIX都支援ps命令,顯示所有執行中程序的相關資訊。 ps命令能提供一份當前程序的快照。如果想狀態可以自動重新整理,可以使用top命令。 ps命令 輸入下面的ps命令,顯示所有執行中

Linuxlinux的strip命令

DATE: 2018.11.13 1、參考 2、strip命令 strip作用:從目標檔案或可執行檔案中剝掉一些符號資訊和除錯資訊,使檔案變小。 man strip: STRIP(1) GNU Deve

Linux命令寫在檔案並呼叫awk -f

我們在使用awk命令的時候,有時候命令特別長,在終端寫出來格式太亂,難以閱讀,以下是一個將命令寫在檔案中,並使用awk呼叫的具體案例 1.現在有檔案file3.txt,內容如下: 2.ak2.awk指令碼 #列印標題並格式化打印出數量合計 BEGIN { FS="\t" #設定欄位分割符

菜鳥進階連結串列_C 結構 共用 列舉_遞推遞迴

座右銘 這些年我一直提醒自己一件事情,千萬不要自己感動自己。大部分人看似的努力,不過是愚蠢導致的。什麼熬夜看書到天亮,連續幾天只睡幾小時,多久沒放假了,如果這些東西也值得誇耀,那麼富士康流水線上任何一個人都比你努力多了。人難免天生有自憐的情緒,唯有時刻保持清醒,才能看清

LinuxLinux開發過程的一些常用配置

一、本地機登入伺服器設定ssh免密 1、設定host vim .ssh/config # 設定host登入名 Host 110 HostName 10.103.xx.110 User ******* ProxyCommand ssh -W %h:%p swa

奇淫技巧C++理解繼承+結構封裝 好題 Gym

題目連結 比賽連結 題意:給定n個表示式,m個判斷,每次有A is B,A has B 會有 A is B,B is C = A is C A has B,b has c ,A