:程式的乙個執行例項,正在執行的程式等,同時是分配系統資源的基本單位
描述程序(pcb):在linux環境下用task_struct的結構體來描述程序,該結構體包含了程序所需要的所有資訊。
task_struct:是核心中linux下的一種資料結構,它會被裝載在ram下包含程序的資訊。
內容分類:
識別符號:程序的唯一識別符號,區別於其他程序
狀態:任務狀態,退出**,退出訊號
優先順序:此程序相比較其他程序的優先順序
上下文資料:程序執行時cpu中暫存器中的資料
i/o資訊:包括顯示的i/o請求,分配給程序的i/o裝置和被程序使用的檔案列表
記賬資訊:輔助程序排程
程序狀態
volatile
long state//說明該程序是否可以執行,還是可中斷等資訊
#define task_running 0 //正在執行或者在就緒佇列中準備執行的程序
#define task_interruptible 1 //處於等待佇列中的程序,直到某個條件有效時進入就緒佇列
#define task_uninterruptible 2 //處於等待佇列中的程序,待資源有效時喚醒,不可由其他程序通過訊號或定時中斷喚醒
#define __task_stopped 4 //程序被暫停,通過其他程序的訊號才能喚醒
#define __task_traced 8 //表示程序被debug追蹤
/* 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//喚醒程序
2.程序的識別符號
pid_t pid;//程序的唯一識別符號
pid_t tgid;//執行緒組的領頭執行緒的pid
在linux環境下,乙個執行緒組所有的執行緒使用和該執行緒組的領頭執行緒相同的pid,並存放在tgid中。
程序的標記符
unsigned
int flags;
flags反映程序的狀態資訊,用於核心識別該程序的當前狀態
常用的狀態
#define pf_forknoexec 0x00000040 //表示程序剛被建立,還沒執行
#define pf_superpriv 0x00000100 //表示該程序有超級使用者特權
#define pf_signaled 0x00000400 //表示程序被訊號殺出
#define pf_exiting 0x00000004 //表示程序開始退出
程序之間的親屬關係
struct task_struct *real_parent;
struct task_struct *parent;
struct list_head children;
struct list_head sibling;
struct task_struct *group_leader;
real_parent指向其父程序,如果建立它的父程序不存在,則指向pid為1的init程序。
parent指向其父程序,當它終止時,必須向它父程序發出訊號,值通常與real_parent相同。
children表示鍊錶的頭部,鍊錶的所有元素都是其子程序。
sibling用於把當前程序插入到兄弟鍊錶中。
group_leader指向其所在程序組的領頭程序。
程序的排程資訊
int prio,static_prio, normal_prio;
unsigned
int rt_priority;
const
struct sched_class *sched_class;
struct sched_entity se;
struct sched_rt_entity rt;
unsigned
int policy;
stati_prio用於儲存靜態優先順序,可以通過nice系統呼叫來進行修改
rt_priority用於儲存實時優先順序。
normal_prio的值取決於靜態優先順序和排程決策。
prio用於儲存動態優先順序。
policy表示程序的排程策略。
程序的排程演算法
#define sched_normal 0//按照優先順序進行排程
#define sched_fifo 1//先進先服務的排程演算法
#define sched_rr 2//時間片輪轉的排程演算法
#define sched_batch 3//用於非互動的cpu消耗型的程序
#define sched_idle 5//系統負載很低時的排程
#define sched_reset_on_fork 0x40000000
建立程序
我們分別可以用fork()和vfork()來建立程序,新建立的程序為子程序,原程序為父程序,**實現如下
#include
#include
#include
int main()
else
sleep(1);
return
0;}
殭屍程序:當程序退出,父程序沒有接收到子程序退出訊號
#include
#include
int main()
else
return
0;}
孤兒程序:父程序先退出,子程序稱之為「孤兒程序」。
#include
#include
#include
int main()
else
if(id==0)
else
return
0;}
Linux下程序與環境變數
1.在shell下可以通過命令env或set檢視當前系統的環境變數資訊。2.獲取環境變數的值 extern char getenv const char name 如果執行成功,此函式返回指定環境變數的值,否則返回null。3.新增環境變數 extern int putenv char string...
Linux程序環境
linux下c程式都是main開始的,main函式的原型是 int main int argc,char argv 其中argc是命令列引數的數目,argc是指向引數的各個指標所構成的陣列。c程式中有3個函式用於正常終止乙個程序,exit和 exit立即進入核心,exit則做一些清理工作後後進入核心...
linux 程序與程序環境
程序與程序環境 程序是執行中的程式,每個程序都執行在各自的虛擬位址空間中,某個程序的崩潰不會影響其它程序的執行。程序間的通訊 ipc 要通過系統核心 系統呼叫 來實現。程序分類 在linux系統中,根據程序的特點,程序可分為3大類 互動程序 批處理程序和守護程序。l 互動程序 由shell啟動的程序...