1. 程式人生 > >程序控制塊PCB結構 task_struct 描述

程序控制塊PCB結構 task_struct 描述

1. 程序狀態(State)
程序執行時,它會根據具體情況改變狀態 。程序狀態是排程和對換的依據。Linux中的程序主要有如下狀態,如表。

·可執行狀態
處於這種狀態的程序,要麼正在執行、要麼正準備執行。正在執行的程序就是當前程序(由current所指向的程序),而準備執行的程序只要得到CPU就可以立即投入執行,CPU是這些程序唯一等待的系統資源。系統中有一個執行佇列(run_queue),用來容納所有處於可執行狀態的程序,排程程式執行時,從中選擇一個程序投入執行。在後面我們討論程序排程的時候,可以看到執行佇列的作用。當前執行程序一直處於該佇列中,也就是說,current總是指向執行佇列中的某個元素,只是具體指向誰由排程程式決定。
·等待狀態
處於該狀態的程序正在等待某個事件(event)或某個資源,它肯定位於系統中的某個等待佇列(wait_queue)中。Linux中處於等待狀態的程序分為兩種:可中斷的等待狀態和不可中斷的等待狀態。處於可中斷等待態的程序可以被訊號喚醒,如果收到訊號,該程序就從等待狀態進入可執行狀態,並且加入到執行佇列中,等待被排程;而處於不可中斷等待態的程序是因為硬體環境不能滿足而等待,例如等待特定的系統資源,它任何情況下都不能被打斷,只能用特定的方式來喚醒它,例如喚醒函式wake_up()等。
·暫停狀態
此時的程序暫時停止執行來接受某種特殊處理。通常當程序接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU訊號後就處於這種狀態。例如,正接受除錯的程序就處於這種狀態。
·僵死狀態
程序雖然已經終止,但由於某種原因,父程序還沒有執行wait()系統呼叫,終止程序的資訊也還沒有回收。顧名思義,處於該狀態的程序就是死程序,這種程序實際上是系統中的垃圾,必須進行相應處理以釋放其佔用的資源。
2. 程序排程資訊
排程程式利用這部分資訊決定系統中哪個程序最應該執行,並結合程序的狀態資訊保證系統運轉的公平和高效。這一部分資訊通常包括程序的類別(普通程序還是實時程序)、程序的優先順序等等。如表所示:
 

在下一章的程序排程中我們會看到,當need_resched被設定時,在“下一次的排程機會”就呼叫排程程式schedule()。 counter代表程序剩餘的時間片,是程序排程的主要依據,也可以說是程序的動態優先順序,因為這個值在不斷地減少;nice是程序的靜態優先順序,同時也代表程序的時間片,用於對counter賦值,可以用nice()系統呼叫改變這個值;policy是適用於該程序的排程策略,實時程序和普通程序的排程策略是不同的;rt_priority只對實時程序有意義,它是實時程序排程的依據。
程序的排程策略有三種,如表所示。

只有root使用者能通過sched_setscheduler()系統呼叫來改變排程策略。
 
3 .識別符號(Identifiers)
每個程序有程序識別符號、使用者識別符號、組識別符號,如表4.4所示。
不管對核心還是普通使用者來說,怎麼用一種簡單的方式識別不同的程序呢?這就引入了程序識別符號(PID:process identifier),每個程序都有一個唯一的識別符號,核心通過這個識別符號來識別不同的程序,同時,程序識別符號PID也是核心提供給使用者程式的介面,使用者程式通過PID對程序發號施令。PID是32位的無符號整數,它被順序編號:新建立程序的PID通常是前一個程序的PID加1。然而,為了與16位硬體平臺的傳統Linux系統保持相容,在Linux上允許的最大PID號是32767,當核心在系統中建立第32768個程序時,就必須重新開始使用已閒置的PID號。
 

另外,每個程序都屬於某個使用者組。task_struct結構中定義有使用者識別符號和組識別符號。它們同樣是簡單的數字,這兩種識別符號用於系統的安全控制。系統通過這兩種識別符號控制程序對系統中檔案和裝置的訪問,其它幾個識別符號將在檔案系統中討論。
4. 程序通訊有關資訊(IPC:Inter_Process Communication)
為了使程序能在同一項任務上協調工作,程序之間必須能進行通訊即交流資料。
Linux支援多種不同形式的通訊機制。它支援典型的Unix 通訊機制(IPC Mechanisms):訊號(Signals)、管道(Pipes),也支援System V 通訊機制:共享記憶體(Shared Memory)、訊號量和訊息佇列(Message Queues),如表。


5. 程序連結資訊(Links)
程式建立的程序具有父/子關係。因為一個程序能建立幾個子程序,而子程序之間有兄弟關係,在task_struct結構中有幾個域來表示這種關係。
在Linux系統中,除了初始化程序init,其他程序都有一個父程序(parent process)或稱為雙親程序。可以通過fork()或clone()系統呼叫來建立子程序,除了程序識別符號(PID)等必要的資訊外,子程序的task_struct結構中的絕大部分的資訊都是從父程序中拷貝,或說“克隆”過來的。系統有必要記錄這種“親屬”關係,使程序之間的協作更加方便,例如父程序給子程序傳送殺死(kill)訊號、父子程序通訊等,就可以用這種關係很方便地實現。
每個程序的task_struct結構有許多指標,通過這些指標,系統中所有程序的task_struct結構就構成了一棵程序樹,這棵程序樹的根就是初始化程序init的task_struct結構(init程序是Linux核心建立起來後人為建立的一個程序,是所有程序的祖先程序)。下表是程序所有的連結資訊。

6. 時間和定時器資訊(Times and Timers)
一個程序從建立到終止叫做該程序的生存期(lifetime)。程序在其生存期內使用CPU的時間,核心都要進行記錄,以便進行統計、計費等有關操作。程序耗費CPU的時間由兩部分組成:一是在使用者模式(或稱為使用者態)下耗費的時間、一是在系統模式(或稱為系統態)下耗費的時間。每個時鐘滴答,也就是每個時鐘中斷,核心都要更新當前程序耗費CPU的時間資訊。
“時間”對作業系統是極其重要的 。讀者可能瞭解計算機時間的有關知識,例如8353/8254這些物理器件,INT 08、INT 1C等時鐘中斷等,可能有過程式設計序時截獲時鐘中斷的成就感,不管怎樣,下一章我們將用較大的篇幅儘可能向讀者解釋清楚作業系統怎樣建立完整的時間機制、並在這種機制的激勵下進行排程等活動。
建立了“時間”的概念,“定時”就是輕而易舉的了,無非是判斷系統時間是否到達某個時刻,然後執行相關的操作而已。Linux提供了許多種定時方式,使用者可以靈活使用這些方式來為自己的程式定時。
表1是和時間有關的域,上面所說的counter是指程序剩餘的CPU時間片,也和時間有關,所以這裡我們再次提及它。表2是程序的所有定時器。
  
 
程序有三種類型的定時器:實時定時器、虛擬定時器和概況定時器。這三種定時器的特徵共有三個:到期時間、定時間隔、要觸發的事件。到期時間就是定時器到什麼時候完成定時操作,從而觸發相應的事件;定時間隔就是兩次定時操作的時間間隔,它決定了定時操作是否繼續進行,如果定時間隔大於0,則在定時器到期時,該定時器的到期時間被重新賦值,使定時操作繼續進行下去,直到程序結束或停止使用定時器,只不過對不同的定時器,到期時間的重新賦值操作是不同的。在表4.8中,每個定時器都有兩個域來表示到期時間和定時間隔:value和incr,二者的單位都是時鐘滴答,和jiffies的單位是一致的,Linux所有的時間應用都建立在jiffies之上。虛擬定時器和概況定時器到期時由核心傳送相應的訊號,而實時定時器比較特殊,它由核心機制提供支援,我們將在後面討論這個問題。
每個時鐘中斷,當前程序所有和時間有關的資訊都要更新: 當前程序耗費的CPU時間要更新,以便於最後的計費;時間片計數器counter要更新,如果counter<=0,則要執行排程程式;程序申請的延時要更新,如果延時時間到了,則喚醒該程序;所有的定時器都要更新,Linux核心檢測這些定時器是否到期,如果到期,則執行相應的操作。在這裡,“更新”的具體操作是不同的:對counter,核心要對它減值,而對於所有的定時器,就是檢測它的值,核心把系統當前時間和其到期時間作一比較,如果到期時間小於系統時間,則表示該定時器到期。但為了方便,我們把這些操作一概稱為“更新”,請讀者注意。
請特別注意上面三個定時器的更新時間。實時定時器不管其所屬的程序是否執行都要更新,所以,時鐘中斷來臨時,系統中所有程序的實時定時器都被更新,如果有多個程序的實時定時器到期,則核心要一一處理這些定時器所觸發的事件。而虛擬定時器和概況定時器只在程序執行時更新,所以,時鐘中斷來臨時,只有當前程序的概況定時器得到更新,如果當前程序運行於使用者態,則其虛擬定時器也得到更新。
       此外,Linux核心對這三種定時器的處理是不同的,虛擬定時器和概況定時器到期時,核心向當前程序傳送相應的訊號:SIGVTALRM  、SIGPROF ;而實時定時器要執行的操作由real_timer決定,real_time是timer_list型別的變數(定義:struct timer_list real_timer),其中容納了實時定時器的到期時間、定時間隔等資訊,我們將在下一章詳細討論這些內容。
7. 檔案系統資訊(File System)
程序可以開啟或關閉檔案,檔案屬於系統資源,Linux核心要對程序使用檔案的情況進行記錄。task_struct結構中有兩個資料結構用於描述程序與檔案相關的資訊。其中,fs_struct中描述了兩個VFS索引節點(VFS inode),這兩個索引節點叫做root和pwd,分別指向程序的可執行映象所對應的根目錄(home directory)和當前目錄或工作目錄。file_struct結構用來記錄了程序開啟的檔案的描述符(descriptor)。如表4.9所示。


在檔案系統中,每個VFS索引節點唯一描述一個檔案或目錄,同時該節點也是向更低層的檔案系統提供的統一的介面。
8. 虛擬記憶體資訊(Virtual Memory)
除了核心執行緒(kernel thread),每個程序都擁有自己的地址空間(也叫虛擬空間),用mm_struct來描述。另外Linux2.4還引入了另外一個域active_mm,這是為核心執行緒而引入。因為核心執行緒沒有自己的地址空間,為了讓核心執行緒與普通程序具有統一的上下文切換方式,當核心執行緒進行上下文切換時,讓切換進來的執行緒的active_mm 指向剛被排程出去的程序的active_mm(如果程序的mm域不為空,則其active_mm域與mm域相同)。記憶體

9.頁面管理資訊
   當實體記憶體不足時,Linux記憶體管理子系統需要把記憶體中的部分頁面交換到外存,其交換是以頁為單位的。有關頁面的描述資訊如表。
 

10.對稱多處理機(SMP)資訊
Linux2.4對SMP進行了全面的支援,下表是與多處理機相關的幾個域。

11. 和處理器相關的環境(上下文)資訊(Processor Specific Context)
這裡要特別注意標題:和“處理器”相關的環境資訊。程序作為一個執行環境的綜合,當系統排程某個程序執行,即為該程序建立完整的環境時,處理器(processor)的暫存器、堆疊等是必不可少的。因為不同的處理器對內部暫存器和堆疊的定義不盡相同,所以叫做“和處理器相關的環境”,也叫做“處理機狀態”。當程序暫時停止執行時,處理機狀態必須儲存在程序的task_struct結構中,當程序被排程重新執行時再從中恢復這些環境,也就是恢復這些暫存器和堆疊的值。處理機資訊如下表所示。

12.其它
(1)  struct wait_queue *wait_chldexit
 
  在程序結束時,或發出系統呼叫wait4時,為了等待子程序的結束,而將自己(父程序)睡眠在該等待佇列上,設定狀態標誌為TASK_INTERRUPTIBLE,並且把控制權轉給排程程式。
(2)Struct rlimit rlim[RLIM_NLIMITS];
 
     每一個程序可以通過系統呼叫setlimit和getlimit來限制它資源的使用。
 
     (3)Int exit_code exit_signal;
 
     程式的返回程式碼以及程式異常終止產生的訊號,這些資料由父程序(子程序完成後)     輪流查詢。
 
     (4)Char comm[16]
     這個域儲存程序執行的程式的名字,這個名字用在除錯中。
 
     (5)Unsigned long personality;
    Linux可以執行X86平臺上其它Unix作業系統生成的符合iBCS2標準的程式, personality進一步描述程序執行的程式屬於何種Unix平臺的“個性”資訊。通常有PER_Linux,PER_Linux_32BIT,PER_Linux_EM86,PER_SVR4,PER_SVR3,PER_SCOSVR3,PER_WYSEV386,PER_ISCR4,PER_BSD,PER_XENIX和PER_MASK等,參見include/Linux/personality.h>。
 
(6) int did_exec:1;
 
按POSIX要求設計的布林量,區分程序正在執行老程式程式碼,還是用系統呼叫execve()裝入一個新的程式。
 
(7)struct linux_binfmt *binfmt
 
     指向程序所屬的全域性執行檔案格式結構,共有a.out、script、elf、java等四種。
 
綜上所述,我們對程序的task_struct結構進行了歸類討論,還有一些域沒有涉及到,在第六章程序的建立與執行一節幾乎涉及到所有的域,在那裡可以對很多域有更深入一步的理解。task_struct結構是程序實體的核心,Linux核心通過該結構來控制程序:首先通過其中的排程資訊決定該程序是否執行;當該程序執行時,根據其中儲存的處理機狀態資訊來恢復程序執行現場,然後根據虛擬記憶體資訊,找到程式的正文和資料;通過其中的通訊資訊和其他程序實現同步、通訊等合作。幾乎所有的操作都要依賴該結構,所以,task_struct結構是一個程序存在的唯一標誌。

相關推薦

程序控制PCB結構 task_struct 描述

1. 程序狀態(State) 程序執行時,它會根據具體情況改變狀態 。程序狀態是排程和對換的依據。Linux中的程序主要有如下狀態,如表。 ·可執行狀態 處於這種狀態的程序,要麼正在執行、要麼正準備執行。正在執行的程序就是當前程序(由current所指向的程序),而準備執行的程序只要得到CPU就可以立即投入執

進程控制(PCB)結構

adding pid cpu ren ppa 多參數 tro swap vcs 一、進程控制塊(PCB)結構 進程控制塊(PCB)是系統為了管理進程設置的一個專門的數據結構。系統用它來記錄進程的外部特征,描述進程的運動變化過程。同時,系統可以利用PCB來控制和管理進程,所以

【Linux】程序控制PCD結構(tack_struct)

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

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

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

程序控制PCBtask_struct

程序就是程式動態執行的例項,是承擔分配系統資源的實體。 程序資訊被存放在一個叫程序控制塊的資料結構中,將其稱之為PCB。而Linux作業系統下的task_struct是PCB的一種,task_struct是Linux核心的一種資料結構,他會被裝載到記憶體裡並儲

程序控制PCB)的結構

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

轉發:PCB程序控制

想要有順序地學習Linux,入口在這裡哦:Linux:目錄索引 PCB:程序控制塊 0.PCB是幹什麼的? 學了作業系統後,我們都知道作業系統要想管理一個物件,它不是直接進行管理的,而是通過得到被管理者的一些有效資訊加以管理的,因此在這裡我們也可以這樣理解

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

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

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

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

程序控制和狀態——隨堂筆記

1.PCB——描述程序的資料結構 (當一個程序建立以後交給作業系統管理,管理的時候要對程序的屬性進行描述) (1)程序的描述資訊:程序的基本資訊pid給每個程序的編號,名字 (2)處理器狀態資訊:在程序執行過程中使用的處理器的各種暫存器的資訊。 原因:程序在執行

作業系統知識整理 - 程序控制

前提 系統中需要有描述程序存在和能夠反映其變化的物理實體,即程序的靜態描述。 程序的靜態描述由3部分組成:程序控制塊(Process Control Block,PCB),有關程式段和該程式段操作的資料結構集。 PCB是系統感知程序的唯一實體,用於描述程序的當前情況以及管理程序執行的

作業系統-程序概念與程序控制

程序 在學習作業系統時,對於程序我們經常能看到如下幾個定義: 一個正在執行的程式。 一個正在計算機上執行的程式例項。 能分配給處理器並由處理器執行的實體 由一組執行的指令,一個當前狀態和一組相關的系統資源表徵的活動單元。 以上定義都是很抽象的,將程序的

Linux程序控制(Processing Control Block)

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

程序的概念、狀態轉換和程序控制

1. 為什麼要引入程序 通常的程式是不能併發執行的,因為併發執行會使它們具有間斷性、失去封閉性,並且其結果不可再現。      為了使程式能夠併發執行,並且對程式加以描述及控制,引入了程序的概念。

在windows裡通過程序控制獲取所有當前所有程序-其實非常簡單

#include "stdafx.h"#include <windows.h>#include <tlhelp32.h>int main(int argc, char* argv[]){ HANDLE hSnapshot = CreateToolhel

程序控制程序上下文

一. 程序控制塊     為了描述和控制程序的執行,系統為每個程序定義了一個資料結構——程序控制塊(PCB)。  它是程序重要的組成部分,它記錄了作業系統所需的、用於描述程序的當前狀態和控制程序的全部資訊。  作業系統就是根據程序的PCB來感知程序的存在,並依此對程序進行

程序控制及其作用、組織方式

程序控制塊中的資訊1) 程序識別符號(1) 內部識別符號 作業系統為每一個程序賦予的唯一數字識別符號,系統使用 (2) 外部識別符號 有建立者提供,通常有字母與數字組成,往往是由使用者(程序)在訪問該程序時使用。描述程序的家族關係,設定父程序標識及子程序標識,

程序程序控制

程序是程式的一個執行例項,是一個正在執行的程式。能分配處理器並由處理器執行的實體。          在一個系統上可以同時執行多個程式。併發執行,一個程序的指令和另一個程序的指令是交錯執行的。          程序的兩個基本元素是程式程式碼(可能被執行相同程式的其他程序共

進程控制task_struct

cut stopped fill task table cnblogs dea nbsp vcs http://blog.csdn.net/qq_26768741/article/details/54348586 struct task_struct {

(7)javascript的程序控制結構及語句------(2)循環控制語句、跳轉語句、對話框

對話 ima bsp .cn while語句 prompt 彈出 asc div 一、循環控制語句 循環語句主要就是在滿足條件的情況下反復執行某一個操作,循環控制語句主要包括while語句、do...while語句 和for語句。 1、While