Linux 程序描述符

2021-09-26 05:57:42 字數 2983 閱讀 2695

linux程序管理(1)---程序描述符

程序描述符

linux使用程序描述符資料結構記錄現場資訊,然後給予程序描述符管理程序,包括程序的建立、排程、消亡等操作。

程序除了包括執行著的程式,還包括系統資源(當前cpu現場、排程資訊、程序間關係等)。記錄這些執行緒資訊的資料結構就是程序描述符task_struct(include/linux/sched.h中)

每個程序都有乙個程序描述符,記錄以下重要資訊:程序識別符號、程序當前狀態、棧位址空間、記憶體位址空間、檔案系統、開啟的檔案、訊號量等。

在x86體系中,通過sp暫存器可以快速獲取當前程序棧的位置;linux在棧的末端存放了乙個特殊的資料結構thread_info,thread_info中存放了指向task_struct的指標。根據這個原理,首先當前程序通過sp暫存器獲取棧的位置,然後根據棧大小(一般為1-2頁)獲取thread_info的位址,最後通過thread_info獲取當前程序的位址。

linux不僅有程序id,而且給每個執行緒也分配了執行緒id。對於task_struct資料結構的成員來說,pid是執行緒id,tgid是執行緒的程序id(該程序也叫執行緒組長)。

排程程式根據程序狀態決定是否排程程序,linux是用概念bitmap(位圖)表示程序狀態,一共有11種狀態;這些狀態可以分為三類:執行態、睡眠態、退出態。只有執行態的程序才能被排程程式排程;程序等待某個資源時處於睡眠態(可中斷態、不可中斷態);程序退出時處於退出態(殭屍態、死亡態)。其他的程序狀態還包括停止態、跟蹤態等,這些狀態處於特定的使用場景中,就不介紹了。

系統給每個狀態分配了乙個字母縮寫「rsdttzxxkwp」,對應關係如下圖所示。

#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

#define task_parked        512

#define task_state_max        1024

#define task_state_to_char_str "rsdttzxxkwp"

linux系統為每個使用者程序分配了兩個棧:使用者棧和核心棧。當乙個程序在使用者空間執行時,系統使用使用者棧;當在核心空間執行時,系統使用核心棧。由於核心棧位址空間的限制,核心棧不會分配很大的空間。此外,核心程序只有核心棧,沒有使用者棧。

當程序從使用者空間陷入到核心空間時,首先,作業系統在核心棧中記錄使用者棧的當前位置,然後將棧暫存器指向核心棧;核心空間的程式執行完畢後,作業系統根據核心棧中記錄的使用者棧位置,重新將棧暫存器指向使用者棧。由於每次從核心空間中返回時,核心棧肯定已經使用完畢,所以從使用者棧切換到核心棧時,只需要簡單的將棧暫存器指向核心棧頂即可。

linux程序管理(1)---程序描述符

為了程序管理,核心必須對每個程序所做的事情進行清楚的描述。比如核心需要知道程序的優先順序,程序當前的狀態,在掛起和恢復程序的時候,需要對程序進行相應的操作。程序描述符還描述了程序使用的位址空間,訪問的檔案等等,這些都是程序描述符的作用。包括了很多程序屬性的字段,還有一些字段包括了指向其他資料結構的指標,如下圖:

task_struct 結構體:

struct task_struct ;
資源限制包括:

欄位名說明

rlimit_as

rlimit_core

記憶體資訊轉儲檔案的大小,當乙個程序異常終止時,核心在程序的當前目錄下建立記憶體資訊轉儲檔案之前檢查這個值

rlimit_cpu

程序使用cpu的最長時間,以秒為單位

rlimit_data

堆大小的最大值

rlimit_fsize

檔案大小的最大值,如果程序把乙個檔案的大小擴充到這個值,核心就給這個程序傳送sigxfsz訊號

rlimit_locks

檔案鎖數量的最大值

rlimit_memlock

非交換記憶體的最大值,當程序試圖通過mlock或者mlockall鎖住頁框時,會檢查這個值

rlimit_msgoueue

posix訊息佇列中的最大位元組數

rlimit_nofile

開啟檔案描述符的最大數,開啟乙個檔案或複製乙個檔案時會檢查這個值

rlimit_nproc

使用者能擁有的程序最大數

rlimit_rss

程序鎖擁有的頁框最大數

rlimit_sigpending

程序掛起訊號的最大數

rlimit_stack

棧大小的最大值,核心在擴充程序的使用者態堆疊之前檢查這個值

程序描述符  

這個講得比較清楚:

【linux】窺探linux核心task_struct結構體

task_struct的定義及注釋

linux核心2.6.32版的task_struct原始碼

struct task_struct ;

Linux下程序間傳遞描述符

linux下程序間傳遞描述符 每個程序都有自己的程序空間,這使得描述符在程序間傳遞變得不容易。就比如說linux下提供程序間傳遞描述符的機制,但是卻要求兩個程序是父子程序。linux程序間傳遞描述符的機制是通過sendmsg和recvmsg兩個函式實現的 該機制可以傳遞任意形式的描述符,如pipe ...

Linux 程序間傳遞檔案描述符

程序間傳遞開啟的檔案描述符,並不是傳遞檔案描述符的值。先說一下檔案描述符。對核心來說,所有開啟的檔案都會通過檔案描述符引用,檔案描述符在程序中是乙個非負整數,檔案描述符在程序中是從0開始,預設0與標準輸入關聯 1與標準輸出關聯 2與標準出錯關聯。之後程序每開啟乙個檔案或者建立乙個新檔案的時候,核心都...

Linux 程序間傳遞檔案描述符

程序間傳遞開啟的檔案描述符,並不是傳遞檔案描述符的值。先說一下檔案描述符。對核心來說,所有開啟的檔案都會通過檔案描述符引用,檔案描述符在程序中是乙個非負整數,檔案描述符在程序中是從0開始,預設0與標準輸入關聯 1與標準輸出關聯 2與標準出錯關聯。之後程序每開啟乙個檔案或者建立乙個新檔案的時候,核心都...