1. 程式人生 > >linux程序task_struct結構體中的state域

linux程序task_struct結構體中的state域

談到task_struct結構體,可以說她是linux核心原始碼中最複雜的一個結構體了,成員之多,佔用記憶體之大。 鑑於她的複雜,我們不能簡單的褻瀆,而是要深入“窺探”. 下面先介紹這些複雜成員中的一員,state域
  1. struct task_struct {
  2.     volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
  3.     ......
  4. };
根據《Understanding the linux kernel .third edit》中的介紹:state域能夠取5個互為排斥的值(通俗一點就是這五個值任意兩個不能一起使用,只能單獨使用)。
  1. #define TASK_RUNNING        0
  2. #define TASK_INTERRUPTIBLE    1
  3. #define TASK_UNINTERRUPTIBLE    2
  4. #define TASK_STOPPED        4
  5. #define TASK_TRACED        8

現在一個一個介紹                                                                 TASK_RUNNING : 這個狀態是正在佔有cpu或者處於就緒狀態的程序才能擁有。一旦某一個程序她的state域的值等於TASK_RUNNING,那麼這個程序要麼是正在執行,要麼就是已經就緒,正在等待cpu時間片的排程。

TASK_INTERRUPIBLE :程序因為等待一些條件而被掛起進(阻塞)而所處的狀態。這些條件主要包括:硬中斷、資源、一些訊號……,一旦等待的條件成立,程序就會從該狀態(阻塞)迅速轉化成為就緒狀態,也就是state域的值變為TASK_RUNNING。

TASK_UNINTERRUPIBLE :其實他和TASK_UNINTERRUPIBLE 大致相同,除了傳遞一個訊號和中斷所引起的效果不同。對於處於TASK_UNINTERRUPIBLE狀態的程序,哪怕我們傳遞一個訊號或者有一個外部中斷都不能喚醒他們。只有它所等待的資源可用的時候,他才會被喚醒。這個標誌很少用,但是並不代表沒有任何用處,其實他的作用非常大,特別是對於驅動刺探相關的硬體過程很重要,這個刺探過程不能被一些其他的東西給中斷,否則就會讓進城進入不可預測的狀態。

TASK_STOP :程序的執行被停止,當程序接收到SIGSTOP、SIGTTIN、SIGTSTP或者SIGTTOU訊號之後就會進入該狀態。

TASK_TRACED :程序執行被除錯程式所停止,當一個程序被另外的程序所監視,每一個訊號都會讓進城進入該狀態。

其實還有兩個附加的程序狀態既可以被新增到state域中,又可以被新增到exit_state域中。只有當程序終止的時候,才會達到這兩種狀態。 

  1. #define EXIT_ZOMBIE        16
  2. #define EXIT_DEAD        32

EXIT_ZOMBIE :程序已經終止,但是它的父程序還沒有呼叫wait4或者waitpid函式來獲得有關程序終止的有關資訊,在呼叫這兩個函式之前,核心不會丟棄包含死去程序的程序描述符的資料結構的,防止父程序某一個時候需要著一些資訊。

EXIT_DEAD :程序被系統釋放,因為父程序已經呼叫了以上所提到的函式。現在核心也就可以安全的刪除該程序的一切相關無用的資訊了。

相關推薦

linux程序task_struct結構state

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

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

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

Linux】PCBtask_struct結構

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

linux程序管理與排程:task_struct結構

程序是處於執行期的程式以及它所管理的資源(如開啟的檔案、掛起的訊號、程序狀態、地址空間等等)的總稱。注意,程式並不是程序,實際上兩個或多個程序不僅有可能執行同一程式,而且還有可能共享地址空間等資源。 Linux核心通過一個被稱為程序描述符的task_struct結構體來管理程序,這個結構體包含了一個程

task_struct結構欄位介紹--Linux的PCB

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

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

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

C語言結構冒號(位)用法

位域出現的原因是由於某些資訊的儲存表示只需要幾個bit位就可以表示而不需要一個完整的位元組,同時也是為了節省儲存空間和方便處理。   typedef struct  bit_struct {     int &n

結構定義變數時,出現冒號+數字的形式(位定義)

該種形式出現於結構體或共用體的定義中,是位域定義的標準形式。其使用方式為struct name{type var_name : n;};含義為,在結構體name彙總,成員變數var_name佔用空間為n位。n為正整數,其值必須小於type型別佔用的位數。比如type如果是int,佔4位元組32位,那麼n必須是

結構的位

位域  有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為“位域”或“位段”。所謂“位域”是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域

C語言利用共用結構、位實現位操作

編寫過51(MCU)程式的同學都知道51架構的MCU支援位操作,這是一個很方便的特性,在讀取/修改暫存器某位的值時非常方便快捷。但其他架構的MCU大多都不支援該特性,即不支援位操作,所在在對暫存器中某一位進行操作的時候都是and/or兩個操作共同使用,在編寫程式時非常麻煩。

Linux】淺談Linux下的PCB—task_struct結構

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

iOS使用結構與位,大小端資料轉換

如何在iOS中使用結構體資料型別 在定義結構體時,如果不涉及到OC中的物件時,可以直接將結構體當作成員變數屬性使用,一旦在結構中定義了OC中的物件,編譯會報錯,提示“ARC時禁止在結構體中定義OC的物件”,主要原因在於ARC無法管理結構體中的OC物件的生命週期以

Linux下C結構初始化

直觀 tro 擴展性 方式 建議 struct 初始化方式 www 寫到 原文地址在這裏: http://www.cnblogs.com/Anker/p/3545146.html 我 只把裏面的主要介紹和代碼寫到這裏了. 順序初始化   教科書上講C語言結構體初始化

在C語言結構添加成員函數

我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

c語言的特殊符號(結構

結合 特殊 value -s height 間接尋址 出現 span size  在“結構”中出現的->運算符成為“右箭頭選擇”,可以用new_node->value = 10;來代替(*new_code).value = 10;即運算符->是運算符*和運

golang 結構的匿名接口

imp -i pil win CA git Go mean others golang 結構體中的匿名接口 代碼示例 golang 中,可以給結構體增加匿名field,可參考 unknwon 大神的書。 匿名字段和內嵌結構體 但,golang同時也可以給結構體定義一個匿名i

C語言中free()函數釋放struct結構的規律

void poi inf clu main 圖片 刪除 動態分配 不同 並不是什麽新鮮的事情,不過值得註意。首先我們知道,在使用struct來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)這一塊連續空間

OpencvMat結構元素的獲取與賦值

【OpenCV3影象處理】Mat中元素的獲取與賦值 ( 對比.at<>()函式 和 .ptr<>()函式) 2017年04月12日 10:08:55 閱讀數:7542 標籤: opencvopencv3 更多 個人分類:&nbs

結構運算子的過載

C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。 比如二分查詢,binary_crearch只能對陣列進行查詢,如果是結構

C++組合(聚合)與C結構包含函式

C++組合(聚合)與C結構體中包含函式 今天突然想到C++的聚合,以前一直沒有注意,今天想到就寫下來,做個筆記; C++的類與我們的C語言中的結構體特別像,但是有有些不太一樣,這裡不多累贅了不能,大家學過的都知道。 C++組合(聚合) 我們知道的都是C++的類的物件,