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 0linux系統為每個使用者程序分配了兩個棧:使用者棧和核心棧。當乙個程序在使用者空間執行時,系統使用使用者棧;當在核心空間執行時,系統使用核心棧。由於核心棧位址空間的限制,核心棧不會分配很大的空間。此外,核心程序只有核心棧,沒有使用者棧。#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程序管理(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與標準出錯關聯。之後程序每開啟乙個檔案或者建立乙個新檔案的時候,核心都...