1. 程式人生 > >Linux程序控制塊(Processing Control Block)

Linux程序控制塊(Processing Control Block)

程序
在廣義上,所有的程序資訊被放在一個叫做程序控制塊的資料結構中,可以理解為程序屬性
的集合。
程序控制塊
每個程序在核心中都有一個程序控制塊(PCB)來維護程序相關的資訊,Linux核心的
程序控制塊是task_struct結構體。現在我們全面瞭解⼀一下其中都有哪些資訊。
在Linux中,這個結構叫做task_struct。
task_struct
task_struct是Linux核心的⼀一種資料結構,它會被裝載到RAM⾥裡並且包含著程序的資訊。
每個程序都把它的資訊放在 task_struct 這個資料結構⾥裡,task_struct 包含了這些內容:
標示示符 : 描述本程序的唯⼀一標⽰示符,⽤用來區別其他程序。
狀態

:任務狀態,退出程式碼,退出訊號等。
優先順序 :相對於其他程序的優先順序。
程式計數器:程式中即將被執⾏行的下一條指令的地址。
記憶體指標:包括程式程式碼和程序相關資料的指標,還有和其他程序共享的記憶體塊的指標
上下文資料:程序執行時處理器的暫存器中的資料。
I/O狀態資訊:包括顯⽰示的I/O請求,分配給程序的I/O裝置和被程序使⽤用的⽂檔案列表。
記賬資訊:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。
儲存程序資訊的資料結構叫做 task_struct,並且可以在 include/linux/sched.h ⾥裡找到它。
所有運⾏行在系統⾥裡的程序都以 task_struct 連結串列的形式存在核心⾥裡。
程序的資訊可以通過 /proc 系統⽂資料夾檢視。要獲取PID為400的程序資訊,你需要檢視 /
proc/400 這個⽂資料夾。大i多數程序資訊同樣可以使⽤用top和ps這些⽤使用者級⼯工具來獲取。

struct task_struct {
volatile long state;  //說明了該程序是否可以執行,還是可中斷等資訊
unsigned long flags;  //Flage 是程序號,在呼叫fork()時給出
intsigpending;   //程序上是否有待處理的訊號
mm_segment_taddr_limit; //程序地址空間,區分核心程序與普通程序在記憶體存放的位置不同
                       //0-0xBFFFFFFF foruser-thead
                       //0-0xFFFFFFFF forkernel-thread
//排程標誌,表示該程序是否需要重新排程,若非0,則當從核心態返回到使用者態,會發生排程
volatilelong need_resched; int lock_depth; //鎖深度 longnice; //程序的基本時間片 //程序的排程策略,有三種,實時程序:SCHED_FIFO,SCHED_RR,分時程序:SCHED_OTHER unsigned long policy; struct mm_struct *mm; //程序記憶體管理資訊 int processor; //若程序不在任何CPU上執行, cpus_runnable 的值是0,否則是1這個值在執行佇列被鎖時更新 unsigned long cpus_runnable, cpus_allowed; struct list_head run_list; //指向執行佇列的指標 unsigned longsleep_time; //程序的睡眠時間 //用於將系統中所有的程序連成一個雙向迴圈連結串列,其根是init_task struct task_struct *next_task, *prev_task; struct mm_struct *active_mm; struct list_headlocal_pages; //指向本地頁面 unsigned int allocation_order, nr_local_pages; struct linux_binfmt *binfmt; //程序所執行的可執行檔案的格式 int exit_code, exit_signal; intpdeath_signal; //父程序終止是向子程序傳送的訊號 unsigned longpersonality; //Linux可以執行由其他UNIX作業系統生成的符合iBCS2標準的程式 intdid_exec:1; pid_tpid; //程序識別符號,用來代表一個程序 pid_tpgrp; //程序組標識,表示程序所屬的程序組 pid_t tty_old_pgrp; //程序控制終端所在的組標識 pid_tsession; //程序的會話標識 pid_t tgid; intleader; //表示程序是否為會話主管 struct task_struct*p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_osptr; struct list_head thread_group; //執行緒連結串列 struct task_struct*pidhash_next; //用於將程序鏈入HASH表 struct task_struct**pidhash_pprev; wait_queue_head_t wait_chldexit; //供wait4()使用 struct completion*vfork_done; //供vfork()使用 unsigned long rt_priority; //實時優先順序,用它計算實時程序排程時的weight值 //it_real_value,it_real_incr用於REAL定時器,單位為jiffies,系統根據it_real_value //設定定時器的第一個終止時間.在定時器到期時,向程序傳送SIGALRM訊號,同時根據 //it_real_incr重置終止時間,it_prof_value,it_prof_incr用於Profile定時器,單位為jiffies。 //當程序執行時,不管在何種狀態下,每個tick都使it_prof_value值減一,當減到0時,向程序傳送 //訊號SIGPROF,並根據it_prof_incr重置時間. //it_virt_value,it_virt_value用於Virtual定時器,單位為jiffies。當程序執行時,不管在何種 //狀態下,每個tick都使it_virt_value值減一當減到0時,向程序傳送訊號SIGVTALRM,根據 //it_virt_incr重置初值。 unsigned long it_real_value, it_prof_value, it_virt_value; unsigned long it_real_incr, it_prof_incr, it_virt_value; struct timer_listreal_timer; //指向實時定時器的指標 struct tmstimes; //記錄程序消耗的時間 unsigned longstart_time; //程序建立的時間 //記錄程序在每個CPU上所消耗的使用者態時間和核心態時間 longper_cpu_utime[NR_CPUS],per_cpu_stime[NR_CPUS]; //記憶體缺頁和交換資訊: //min_flt, maj_flt累計程序的次缺頁數(Copyon Write頁和匿名頁)和主缺頁數(從對映檔案或交換 //裝置讀入的頁面數);nswap記錄程序累計換出的頁面數,即寫到交換裝置上的頁面數。 //cmin_flt, cmaj_flt,cnswap記錄本程序為祖先的所有子孫程序的累計次缺頁數,主缺頁數和換出頁面數。 //在父程序回收終止的子程序時,父程序會將子程序的這些資訊累計到自己結構的這些域中 unsignedlong min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap; int swappable:1; //表示程序的虛擬地址空間是否允許換出 //程序認證資訊 //uid,gid為執行該程序的使用者的使用者識別符號和組識別符號,通常是程序建立者的uid,gid //euid,egid為有效uid,gid //fsuid,fsgid為檔案系統uid,gid,這兩個ID號通常與有效uid,gid相等,在檢查對於檔案 //系統的訪問許可權時使用他們。 //suid,sgid為備份uid,gid uid_t uid,euid,suid,fsuid; gid_t gid,egid,sgid,fsgid; int ngroups; //記錄程序在多少個使用者組中 gid_t groups[NGROUPS]; //記錄程序所在的組 //程序的權能,分別是有效位集合,繼承位集合,允許位集合 kernel_cap_tcap_effective, cap_inheritable, cap_permitted; int keep_capabilities:1; struct user_struct *user; struct rlimit rlim[RLIM_NLIMITS]; //與程序相關的資源限制資訊 unsigned shortused_math; //是否使用FPU charcomm[16]; //程序正在執行的可執行檔名 //檔案系統資訊 int link_count, total_link_count; //NULL if no tty程序所在的控制終端,如果不需要控制終端,則該指標為空 struct tty_struct*tty; unsigned int locks; //程序間通訊資訊 struct sem_undo*semundo; //程序在訊號燈上的所有undo操作 struct sem_queue *semsleeping; //當程序因為訊號燈操作而掛起時,他在該佇列中記錄等待的操作 //程序的CPU狀態,切換時,要儲存到停止程序的task_struct中 structthread_struct thread; //檔案系統資訊 struct fs_struct *fs; //開啟檔案資訊 struct files_struct *files; //訊號處理函式 spinlock_t sigmask_lock; struct signal_struct *sig; //訊號處理函式 sigset_t blocked; //程序當前要阻塞的訊號,每個訊號對應一位 struct sigpendingpending; //程序上是否有待處理的訊號 unsigned long sas_ss_sp; size_t sas_ss_size; int (*notifier)(void *priv); void *notifier_data; sigset_t *notifier_mask; u32 parent_exec_id; u32 self_exec_id; spinlock_t alloc_lock; void *journal_info; };

相關推薦

Linux程序控制Processing Control Block

程序 在廣義上,所有的程序資訊被放在一個叫做程序控制塊的資料結構中,可以理解為程序屬性 的集合。 程序控制塊 每個程序在核心中都有一個程序控制塊(PCB)來維護程序相關的資訊,Linux核心的 程序控制塊是task_struct結構體。現在我們全面瞭解

程序控制PCB的結構

程序控制塊 PCB (Process Control Block):存放程序的管理和控制資訊的資料結構稱為程序控制塊。它是程序管理和控制的最重要的資料結構,每一個程序均有一個PCB,在建立程序時,建立P

傳輸控制協議transmission control protocol——TCP 整理

概述 TCP 使用 GBN 和 SR 協議的組合來提供可靠性。為了實現這個目的,TCP 使用校驗和(為差錯發現)、丟失或被破壞分組重傳、 累積和選擇確認以及計時器。     TCP服務 1、TCP使用埠號來實現程序間通訊 2、TCP 是一個面向流的協議。T

訪問控制過濾器Access Control Filter

訪問控制過濾器是檢查當前使用者是否能執行訪問的controller action的初步授權模式。 這種授權模式基於使用者名稱,客戶IP地址和訪問型別。 訪問控制過濾器,適用於簡單的驗證。 需要複雜的訪問控制,需要使用將要講解到的基於角色訪問控制(role-bas

Linux程序控制PCD結構tack_struct

程式建立的程序具有父/子關係。因為一個程序能建立幾個子程序,而子程序之間有兄弟關係,在task_struct 結構中有幾個域來表示這種關系。在Linux 系統中,除了初始化程序init,其他程序都有一個父程序(Parent Process)。可以通過fork()或clone()系統呼叫來建立子程序,除了程序

linux系統程式設計之程序程序生命週期與PCB程序控制

本節目標: 程序狀態變遷程序控制塊程序建立程序撤消終止程序的五種方法 一,程序狀態變遷 程序的三種基本狀態 就緒(Ready)狀態 當程序已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的程序狀態稱為就緒狀態。 執行(Running)狀態 當程序已獲得

MFC中滑控制元件Slide Control的使用

滑動控制元件是Windows中最常用的控制元件之一。一般而言它是由一個滑動條,一個滑塊和可選的刻度組成,使用者可以通過移動滑塊在相應的控制元件中顯示對應的值。通常,在滑動控制元件附近一定有標籤控制元件或編輯框控制元件,用於顯示相應的值。滑動控制元件在應用程式中用途級為廣泛,如在桌面的屬性中就可以看到

程序控制程式設計----------Linux---C

1、為什麼程序間需要通訊?資料傳輸:一個程序需要將它的資料傳送給另一個程序。資源共享:多個程序之間共享同樣的資源通知事件:一個程序需要向另一個或一組程序傳送訊息,通知它們發生了某種事件。程序控制:有些程序希望完全控制另一個程序的執行(如Debug程序),此時控制程序希望能夠攔截另一個程序的所有操作,並能夠及時

PCB(程序控制)以及Linux下的程序控制task_struct

程序控制塊中的資訊: 1.程序識別符號:程序識別符號是惟一地標識一個程序。一個程序通常有兩種識別符號   (1).內部表示符:在所有的作業系統中,都為每一個程序賦予了一個惟一的數字識別符號,它通常是一個程序的序號。設定內部識別符號主要是為了方便系統使用。   (2).外部識

試說明PCB程序控制 的作用,為什麼說PCB 是程序存在的惟一標誌?

PCB 是程序實體的一部分,是作業系統中最重要的記錄型資料結構。作用是使一個在 多道程式環境下不能獨立執行的程式,成為一個能獨立執行的基本單位,成為能與其它程序 併發執行的程序。OS是根據PCB對併發執

Linux C 程序控制筆記

一、程序 程序是一個動態實體,是程式的一次執行過程,是作業系統資源分配的基本單位。程序是執行中的程式,程式是一些儲存在硬碟上的可執行程式碼。 二、程序結構 Linux中程序由三部分組成:程式碼段,資料段,堆疊段 程式碼段(存放可執行程式碼) 資料段(存放程式全域性

gcc和MinGW的異同在cygwin/gcc做的東西可以無縫的用在linux下,沒有任何問題,是在windows下開發linux程序的一個很好的選擇

實現 o-c tool 交叉 lin 分析 模擬 gcc編譯器 還要 cygwin/gcc和MinGW都是gcc在windows下的編譯環境,但是它們有什麽區別,在實際工作中如何選擇這兩種編譯器。 cygwin/gcc完全可以和在linux下的gcc化做等號,這個可以從bo

Linux程序間通訊IPC方式總結

程序間通訊概述 程序通訊的目的 資料傳輸  一個程序需要將它的資料傳送給另一個程序,傳送的資料量在一個位元組到幾M位元組之間 共享資料  多個程序想要操作共享資料,一個程序對共享資料 通知事件 一個程序需要向另一個或一組程序傳送訊息,通知它(它們)

實驗4 Linux程序控制實驗指導書

實驗4 Linux程序控制實驗指導書 一、Ubuntu18下安裝fcitx及中文輸入法 1、解除安裝IBUS sudo apt-get  remove  ibus sudo apt-get  purge  ibus   2、開

Linux程序控制——exec函式族

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

3、DCLData Control Language資料庫控制語言 授權,角色控制

建立使用者: 命令:   1  CREATE USER 'username'@'host'IDENTI

4、TCLTransaction Control Language事務控制語言

cbe 文件 關於 成功 手動 讀取 tab 新增 完成 一、事務定義 Transaction 事務:一個最小的不可再分的工作單元;通常一個事務對應一個完整的業務(例如銀行賬戶轉賬業務,該業務就是一個最小的工作單元) 一個完整的業務需要批量的DML(insert、upda

Linux 程序間通訊訊號量

1 訊號量概述 訊號量和其他IPC不同,並沒有在程序之間傳送資料,訊號量用於多程序在存取共享資源時的同步控制就像交通路口的紅路燈一樣,當訊號量大於0,表示綠燈允許通過,當訊號量等於0,表示紅燈,必須停下來等待綠燈才能通過。 程序間的互斥關係與同步關係存在的根源在於臨界資

Linux 程序間通訊IPC的特性

1.識別符號和鍵 每個核心中的IPC結構(訊息佇列、訊號量或共享儲存段)都用一個非負整數的識別符號 (identifier)加以引用。 例如,要向一個訊息佇列傳送訊息或者從一個訊息佇列取訊息,只需要知道其佇列識別符號。 當一個IPC結構被建立,然後又被刪除時,與這種結構

Linux 程序間通訊共享記憶體

可以說, 共享記憶體是一種最為高效的程序間通訊方式, 因為程序可以直接讀寫記憶體, 不需要任何資料的複製。 為了在多個程序間交換資訊, 核心專門留出了一塊記憶體區, 這段記憶體區可以由需要訪問的程序將其對映到自己的私有地址空間。 因此, 程序就可以直接讀寫這一記憶體區而不需要