Linux進程描述符:task_struct結構體

進程是什麼?

如果有人問你,進程是什麼,你該如何回答呢?

正在執行的程序;程序的執行實例;能分配處理器並由處理器執行的實體。

進程是處於執行期的程序以及它所管理的資源(如打開的文件、掛起的信號、進程狀態、地址空間等等)的總稱。注意,程序並不是進程,實際上兩個或多個進程不僅有可能執行同一程序,而且還有可能共享地址空間等資源。

那麼進程和程序的區別是什麼呢?

1、進程在內存上,程序在硬盤上
2、進程比程序多了很多描述信息,其中最重要的是PCB
3、進程是動態的,進程狀態可以改變;程序是靜態的,處於存儲狀態

Linux內核通過一個被稱爲進程描述符的task_struct結構體來管理進程,這個結構體包含了一個進程所需的所有信息。它定義在include/linux/sched.h文件中。

那麼接下來我們就來認識一下task_struct結構體的成員吧:

1、進程狀態:

volatile long state;
    int exit_state;

state成員的可能取值如下:

#define TASK_RUNNING        0
#define TASK_INTERRUPTIBLE  1
#define TASK_UNINTERRUPTIBLE    2
#define __TASK_STOPPED      4
#define __TASK_TRACED       8
/* in tsk->exit_state */
#define EXIT_ZOMBIE     16
#define EXIT_DEAD       32
/* in tsk->state again */
#define TASK_DEAD       64
#define TASK_WAKEKILL       128
#define TASK_WAKING     256
    TASK_RUNNING  //表示進程要麼正在執行,要麼正要準備執行。

    TASK_INTERRUPTIBLE  //表示進程被阻塞(睡眠),直到某個條件變爲真。條件一旦達成,進程的狀態就被設置爲TASK_RUNNING。

    TASK_UNINTERRUPTIBLE  //與TASK_INTERRUPTIBLE類似,除了不能通過接受一個信號來喚醒以外。

    __TASK_STOPPED  //表示進程被停止執行。

    __TASK_TRACED  //表示進程被debugger等進程監視。

    EXIT_ZOMBIE  //表示進程的執行被終止,但是其父進程還沒有使用wait()等系統調用來獲知它的終止信息。

    EXIT_DEAD  //表示進程的最終狀態。

2、進程標識符(PID)

    pid_t pid;
    pid_t tgid;

Unix系統通過pid來標識進程,linux把不同的pid與系統中每個進程或輕量級線程關聯,而unix程序員希望同一組線程具有共同的pid,遵照這個標準linux引入線程組的概念。一個線程組所有線程與領頭線程具有相同的pid,存入tgid字段,getpid()返回當前進程的tgid值而不是pid的值。

3、進程內核棧

void *stack; 

進程通過alloc_thread_info函數分配它的內核棧,通過free_thread_info函數釋放所分配的內核棧。

4、進程標記

unsigned int flags; /* per process flags, defined below */  

反應進程狀態的信息,但不是運行狀態,用於內核識別進程當前的狀態,以備下一步操作

5、進程調度

int prio, static_prio, normal_prio;
unsigned int rt_priority;

static_prio :用於保存靜態優先級,可以通過nice系統調用來進行修改
rt_priority: 用於保存實時優先級
normal_prio :的值取決於靜態優先級和調度策略
prio: 用於保存動態優先級

6、信號處理

/* signal handlers */
struct signal_struct *signal;
struct sighand_struct *sighand;
1583 
sigset_t blocked, real_blocked;
sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */
struct sigpending pending;
1587 
unsigned long sas_ss_sp;
size_t sas_ss_size;
signal  //指向進程的信號描述符
sighand //指向進程的信號處理程序描述符
blocked //表示被阻塞信號的掩碼,real_blocked表示臨時掩碼
pending //存放私有掛起信號的數據結構
sas_ss_sp   //是信號處理程序備用堆棧的地址,sas_ss_size表示堆棧的大小

tast_struct結構體 翻譯:

  long state //任務的運行狀態(-1 不可運行,0 可運行(就緒),>0 已停止)。

  long counter// 任務運行時間計數(遞減)(滴答數),運行時間片。

  long priority //運行優先數。任務開始運行時counter = priority,越大運行越長。

  long signal //信號。是位圖,每個比特位代表一種信號,信號值=位偏移值+1。

  struct sigaction sigaction[32]// 信號執行屬性結構,對應信號將要執行的操作和標誌信息。

  long blocked //進程信號屏蔽碼(對應信號位圖)。

  int exit_code //任務執行停止的退出碼,其父進程會取。

  unsigned long start_code //代碼段地址。

  unsigned long end_code //代碼長度(字節數)。

  unsigned long end_data //代碼長度 + 數據長度(字節數)。

  unsigned long brk //總長度(字節數)。

  unsigned long start_stack //堆棧段地址。

  long pid //進程標識號(進程號)。

  long father //父進程號。

  long pgrp// 父進程組號。

  long session //會話號。

  long leader //會話首領。

  unsigned short uid //用戶標識號(用戶id)。

  unsigned short euid //有效用戶id。

  unsigned short suid// 保存的用戶id。

  unsigned short gid //組標識號(組id)。

  unsigned short egid //有效組id。

  unsigned short sgid //保存的組id。

  long alarm //報警定時值(滴答數)。

  long utime //用戶態運行時間(滴答數)。

  long stime //系統態運行時間(滴答數)。

  long cutime //子進程用戶態運行時間。

  long cstime// 子進程系統態運行時間。

  long start_time //進程開始運行時刻。

  unsigned short used_math //標誌:是否使用了協處理器。

  int tty //進程使用tty 的子設備號。-1 表示沒有使用。

  unsigned short umask //文件創建屬性屏蔽位。

  struct m_inode * pwd //當前工作目錄i 節點結構。

  struct m_inode * root //根目錄i 節點結構。

  struct m_inode * executable //執行文件i 節點結構。

  unsigned long close_on_exec //執行時關閉文件句柄位圖標誌。(參見include/fcntl.h)

  struct file * filp[NR_OPEN] //進程使用的文件表結構。

  struct desc_struct ldt[3] //本任務的局部表描述符。0-空,1-代碼段cs,2-數據和堆棧段ds&ss。

  struct tss_struct tss //本進程的任務狀態段信息結構

本文參考文章:
http://blog.csdn.net/gatieme/article/details/51383272
http://www.educity.cn/linux/518072.html

發佈了121 篇原創文章 · 獲贊 90 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章