進程是什麼?
如果有人問你,進程是什麼,你該如何回答呢?
正在執行的程序;程序的執行實例;能分配處理器並由處理器執行的實體。
進程是處於執行期的程序以及它所管理的資源(如打開的文件、掛起的信號、進程狀態、地址空間等等)的總稱。注意,程序並不是進程,實際上兩個或多個進程不僅有可能執行同一程序,而且還有可能共享地址空間等資源。
那麼進程和程序的區別是什麼呢?
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