進程與進程描寫敘述符(task_struct)

1、 進程

進程(Process)
計算機中的程序關於某數據集合上的一次執行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描寫敘述,進程是程序的實體。linux

———————————————————————————————————————————————————————————————算法

  • 釋義:一段程序的執行過程
  • 特徵:動態、獨立、異步、併發
  • 結構特徵:程序、數據和進程控制塊
  • 相關概念:線程。管程

定義

狹義定義:進程是正在執行的程序的實例(an instance of a computer program that is being executed)。安全

廣義定義:
進程是一個具備必定獨立功能的程序關於某個數據集合的一次執行活動。
它是是操做系統動態執行的基本單元。在傳統的操做系統中,進程既是主要的分配單元,也是主要的執行單元。ruby

進程的概念主要有兩點:markdown

第一,進程是一個實體session

'每個進程都有它本身的地址空間,普通狀況下,包含文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。'

第二。進程是一個「執行中的程序」數據結構

併發

'程序是一個沒有生命的實體,僅僅有處理器賦予程序生命時(操做系統執行之)。它才幹成爲一個活動的實體。咱們稱其爲進程。

'

特徵

動態性:進程的實質是程序在多道程序系統中的一次執行過程。進程是動態產生,動態消亡的。app

併發性:不論什麼進程都可以同其它進程一塊兒併發執行dom

獨立性:進程是一個能獨立執行的基本單位,同一時候也是系統分配資源和調度的獨立單位;

異步性:由於進程間的相互制約。使進程具備執行的間斷性。即進程按各自獨立的、不可預知的速度向前推動

結構特徵:進程由程序、數據和進程控制塊三部分組成。


多個不一樣的進程可以包含一樣的程序:一個程序在不一樣的數據集裏就構成不一樣的進程,能獲得不一樣的結果。但是執行過程當中。程序不能發生改變。

內容

一個計算機系統進程包含(或者說「擁有」)下列數據:
那個程序的可執行機器碼的一個在存儲器的映像。

分配到的存儲器(一般包含虛擬內存的一個區域)。

存儲器的內容包含可執行代碼、特定於進程的數據(輸入、輸出)、調用堆棧、堆棧(用於保存執行時運數中途產生的數據)。 分配給該進程的資源的操做系統描寫敘述符,諸如文件描寫敘述符(Unix術語)或文件句柄(Windows)、數據源和數據終端。 安全特性,諸如進程擁有者和進程的權限集(可以允許的操做)。 處理器狀態(內文),諸如寄存器內容、物理存儲器尋址等。

當進程正在執行時。狀態一般儲存在寄存器,其它狀況在存儲器。

切換

進行進程切換就是從正在執行的進程中收回處理器。而後再使待執行進程來佔用處理器。
這裏所說的從某個進程收回處理器,實質上就是把進程存放在處理器的寄存器中的中間數據找個地方存起來。從而把處理器的寄存器騰出來讓其它進程使用。那麼被停止執行進程的中間數據存在何處好呢?固然這個地方應該是進程的私有堆棧。
讓進程來佔用處理器,實質上是把某個進程存放在私有堆棧中寄存器的數據(前一次本進程被停止時的中間數據)再恢復處處理器的寄存器中去,並把待執行進程的斷點送入處理器的程序指針PC,因而待執行進程就開始被處理器執行了,也就是這個進程已經佔有處理器的使用權了。
這就像多個同窗要分時使用同一張課桌同樣。所謂要收回正在使用課桌同窗的課桌使用權,實質上就是讓他把屬於他的東西拿走。而賦予某個同窗課桌使用權,僅僅只是就是讓他把他的東西放到課桌上罷了。
在切換時,一個進程存儲在處理器各寄存器中的中間數據叫作進程的上下文,因此進程的 切換實質上就是被停止執行進程與待執行進程上下文的切換。在進程未佔用處理器時,進程 的上下文是存儲在進程的私有堆棧中的。

狀態

進程執行時的間斷性。決定了進程可能具備多種狀態。其實,執行中的進程可能具備下面三種基本狀態。

1)就緒狀態(Ready):
進程已得到除處理器外的所需資源。等待分配處理器資源;僅僅要分配了處理器進程就可執行。就緒進程可以按多個優先級來劃分隊列。好比,當一個進程由於時間片用完而進入就緒狀態時。排入低優先級隊列;當進程由I/O操做完畢而進入就緒狀態時,排入高優先級隊列。

2)執行狀態(Running):
進程佔用處理器資源;處於此狀態的進程的數目小於等於處理器的數目。

在沒有其它進程可以執行時(如所有進程都在堵塞狀態),通常會本身主動執行系統的空暇進程。

3)堵塞狀態(Blocked):
由於進程等待某種條件(如I/O操做或進程同步)。在條件知足以前沒法繼續執行。該事件發生前即便把處理器資源分配給該進程。也沒法執行。
差異

程序

程序是指令和數據的有序集合。其自己沒有不論什麼執行的含義。是一個靜態的概念。而進程是程序在處理機上的一次執行過程。它是一個動態的概念。
程序可以做爲一種軟件資料長期存在,而進程是有必定生命期的。程序是永久的,進程是臨時的。
進程更能真實地描寫敘述併發,而程序不能;
進程是由進程控制塊、程序段、數據段三部分組成;
進程具備建立其它進程的功能。而程序沒有。
同一程序同一時候執行於若干個數據集合上。它將屬於若干個不一樣的進程。也就是說同一程序可以相應多個進程。
在傳統的操做系統中。程序並不能獨立執行,做爲資源分配和獨立執行的基本單元都是進程。

線程

進程和線程關係

一般在一個進程中可以包含若干個線程。它們可以利用進程所擁有的資源,在引入線程的操做系統中。一般都是把進程做爲分配資源的基本單位,而把線程做爲獨立執行和獨立調度的基本單位。由於線程比進程更小。基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提升系統內多個程序間併發執行的程度。


當下推出的通用操做系統都引入了線程。以便進一步提升系統的併發性,並把它視爲現代操做系統的一個重要指標。

控制

進程控制是進程管理中最主要的功能。它用於建立一個新進程,終止一個已完畢的進程,或者去終止一個因出現某事件而使其沒法執行下去的進程,還可負責進程執行中的狀態轉換。

建立進程

1.引發建立進程的事件
在多道程序環境中,僅僅有(做爲)進程(時)才幹在系統中執行。

所以,爲使程序能執行。就必須爲它建立進程。致使一個進程去建立還有一個進程的典型事件,可以有下面四類:

1) 用戶登陸
在分時系統中,用戶在終端鍵入登陸命令後,假設是合法用戶。系統將爲該終端創建一個進程,並把它插入到就緒隊列中。

2)做業調度
在批處理系統中。看成業調度程序依照必定的算法調度到某做業時,便將該做業裝入到內存,爲它分配必要的資源,並立刻爲它建立進程,再插入到就緒隊列中。

3) 提供服務
當執行中的用戶程序提出某種請求後,系統將專門建立一個進程來提供用戶所需要的服務。好比,用戶程序要求進行文件打印。操做系統將爲它建立一個打印進程,這樣,不只可以使打印進程與該用戶進程併發執行,而且還便於計算出爲完畢打印任務所花費的時間。

4) 應用請求
在上述三種狀況中,都是由系統內核爲它建立一個新進程。而這一類事件則是基於應用進程的需求,由它建立一個新的進程。以便使新進程以併發的執行方式完畢特定任務。


2.進程的建立過程
這裏寫圖片描寫敘述
一旦操做系統發現了要求建立新進程的事件後,便調用進程建立原語create()按下述步驟建立一個新進程。

1) 申請空白PCB。爲新進程申請得到惟一的數字標識符。並從PCB集合中索取一個空白PCB。

2) 爲新進程分配資源。爲新進程的程序和數據以及用戶棧分配必要的內存空間。顯然,此時操做系統必須知道新進程所需要的內存大小。

3) 初始化進程控制塊。PCB的初始化包含:
①初始化標識信息。將系統分配的標識符和父進程標識符,填入新的PCB中。
②初始化處理機狀態信息。使程序計數器指向程序的入口地址。使棧指針指向棧頂。


③初始化處理機控制信息,將進程的狀態設置爲就緒狀態或精巧就緒狀態,對於優先級,通常是將它設置爲最低優先級,除非用戶以顯式的方式提出高優先級要求。

4) 將新進程插入就緒隊列,假設進程就緒隊列可以接納新進程。便將新進程插入到就緒隊列中。

進程終止
1.引發進程終止的事件

1)正常結束
在不論什麼計算機系統中,都應該有一個表示進程已經執行完畢的指示。

好比,在批處理系統中,一般在程序的最後安排一條Hold指令或終止的系統調用。當程序執行到Hold指令時。將產生一箇中斷,去通知OS本進程已經完畢。

2)異常結束
在進程執行期間,由於出現某些錯誤和故障而迫使進程終止。這類異常事件很是多,常見的有:越界錯誤,保護錯。非法指令。特權指令錯,執行超時,等待超時。算術運算錯,I/O故障。

3)外界干預
外界干預並非指在本進程執行中出現了異常事件。而是指進程應外界的請求而終止執行。這些干預有:操做員或操做系統干預。父進程請求,父進程終止。

  1. 進程的終止過程
    假設系統發生了上述要求終止進程的某事件後,OS便調用進程終止原語,按下述過程去終止指定的進程。

1)依據被終止進程的標識符。從PCB集合中檢索出該進程的PCB。從中讀出該進程狀態。
2)若被終止進程正處於執行狀態,應立刻終止該進程的執行,並置調度標誌爲真。用於指示該進程被終止後應又一次進行調度。
3)若該進程還有子孫進程,還應將其所有子孫進程予以終止,以防他們成爲不可控的進程。


4)將被終止的進程所擁有的所有資源。或者歸還給其父進程。或者歸還給系統。
5)將被終止進程(它的PCB)從所在隊列(或鏈表)中移出,等待其它程序來蒐集信息。

堵塞喚醒

1.引發進程堵塞和喚醒的事件

1)請求系統服務
當正在執行的進程請求操做系統提供服務時。由於某種緣由。操做系統並不立刻知足該進程的要求時。該進程僅僅能轉變爲堵塞狀態來等待。一旦要求獲得知足後,進程被喚醒。

2)啓動某種操做
當進程啓動某種操做後,假設該進程必須在該操做完畢以後才幹繼續執行。則必須先使該進程堵塞,以等待該操做完畢,該操做完畢後,將該進程喚醒。

3)新數據還沒有到達
對於相互合做的進程,假設當中一個進程需要先得到還有一(合做)進程提供的數據才幹執行以對數據進行處理,則是要其所需數據還沒有到達,該進程僅僅有(等待)堵塞。等到數據到達後。該進程被喚醒。

4)無新工做可作
系統每每設置一些具備某特定功能的系統進程,每當這樣的進程完畢任務後。便把本身堵塞起來以等待新任務到來,新任務到達後。該進程被喚醒。

2.進程堵塞過程

正在執行的進程,當發現上述某事件後,由於沒法繼續執行,因而進程便經過調用堵塞原語block()把本身堵塞。可見。進程的堵塞是進程自身的一種主動行爲。

進入block過程後,由於此時該進程還處於執行狀態,因此應先立刻中止執行,把進程控制塊中的現行狀態由執行改成堵塞,並將PCB插入堵塞隊列。假設系統中設置了因不一樣事件而堵塞的多個堵塞隊列,則應將本進程插入到具備一樣事件的堵塞(等待)隊列。最後。轉調度程序進行又一次調度,將處理機分配給還有一就緒進程,並進行切換,亦即,保留被堵塞進程的處理機狀態(在PCB中)。再按新進程的PCB中的處理機狀態設置CPU環境。

  1. 進程喚醒過程
    當被堵塞的進程所期待的事件出現時,如I/O完畢或者其所期待的數據已經到達,則由有關進程(比方,用完並釋放了該I/O設備的進程)調用喚醒原語wakeup(),將等待該事件的進程喚醒。

    喚醒原語執行的過程是:首先把被堵塞的進程從等待該事件的堵塞隊列中移出,將其PCB中的現行狀態由堵塞改成就緒。而後再將該PCB插入到就緒隊列中。

調度算法

進程的調度算法包含:
實時系統中:FIFO(First Input First Output。先進先出算法)。SJF(Shortest Job First。最短做業優先算法),SRTF(Shortest Remaining Time First。最短剩餘時間優先算法)。

交互式系統中:RR(Round Robin。時間片輪轉算法)。HPF(Highest Priority First,最高優先級算法)。多級隊列。最短進程優先。保證調度。彩票調度,公平分享調度。

階段
進程是由進程控制塊、程序段、數據段三部分組成。一個進程可以包含若干線程(Thread),線程可以幫助應用程序同一時候作幾件事(比方一個線程向磁盤寫入文件,還有一個則接收用戶的按鍵操做並及時作出反應。互相不干擾),在程序被執行後,系統首先要作的就是爲該程序進程創建一個默認線程,而後程序可以依據需要自行加入或刪除相關的線程。是可併發執行的程序。在一個數據集合上的執行過程。是系統進行資源分配和調度的一個獨立單位,也是稱活動、路徑或任務,它有雙方面性質:活動性、併發性。進程可以劃分爲執行、堵塞、就緒三種狀態。並隨必定條件而相互轉化:就緒–執行,執行–堵塞,堵塞–就緒。

進程爲應用程序的執行實例,是應用程序的一次動態執行。

看似高深,咱們可以簡單地理解爲:它是操做系統當前執行的執行程序。

在系統當前執行的執行程序裏包含:系統管理計算機個體和完畢各類操做所必需的程序;用戶開啓、執行的額外程序,固然也包含用戶不知道。而本身主動執行的非法程序(它們就有多是病毒程序)。


2、進程描寫敘述符

1.概念

在linux中,每個進程都有一個進程描寫敘述符。這個」進程描寫敘述符」是一個結構體名字叫作task_struct,在task_struct裏面保存了不少關於進程控制的信息。


task_struct是Linux內核的一種數據結構,它會被裝載到RAM裏幷包含進程的信息。每個進程都把它的信息放在task_struct這個數據結構裏面。而

2.task_struct內容

標示符:描寫敘述本進程的惟一標示符。用來差異其它進程。

狀態:任務狀態,退出代碼,退出信號等。

優先級:相對於其它進程的優先級。

程序計數器:程序中即將被執行的下一條指令的地址。

內存指針:包含程序代碼和進程相關數據的指針。還有和其它進程共享的內存塊的指針。

上下文數據:進程執行時處理器的寄存器中的數據。

I/O狀態信息:包含顯示的I/O請求,分配給進程的I/O設備和正在被進程使用的文件列表。

記帳信息:可能包含處理器時間總和,使用的時鐘總數,時間限制,記帳號等。

3.task_struct的分類

調度數據成員

(1) volatile long states; //進程狀態
(2) unsigned long flags; //進程標記符
(3) long priority; //用來保存動態優先級
(4) unsigned long rt_priority; //用來保存實時優先級,取值範圍爲0~99
(5) long counter;
(6) unsigned long policy;

信號處理

(1) unsigned long signal;
(2) unsigned long blocked;
(3) struct signal_struct *sig;

進程隊列指針

(1) struct task_struct *next_task。*prev_task;
(2) struct task_struct *next_run,*prev_run;
(3) struct task_struct *p_opptr,*p_pptr;和struct task_struct *p_cptr。*p_ysptr,*p_osptr;

進程標識

(1) unsigned short uid。gid;
(2) int groups[NGROUPS];
(3) unsigned short euid。egid;
(4) unsigned short fsuid,fsgid;
(5) unsigned short suid,sgid;
(6) int pid。pgrp,session;
(7) int leader;

時間數據成員

(1) unsigned long timeout;
(2) unsigned long it_real_value,it_real_iner;
(3) struct timer_list real_timer;
(4) unsigned long it_virt_value。it_virt_incr;
(5) unsigned long it_prof_value,it_prof_incr;
(6) long utime,stime,cutime,cstime。start_time;

信號量數據成員

(1) struct sem_undo *semundo;
(2) struct sem_queue *semsleeping;

進程上下文環境

(1) struct desc_struct *ldt;
(2) struct thread_struct tss;
(3) unsigned long saved_kernel_stack;
(4) unsigned long kernel_stack_page;

文件系統數據成員

(1) struct fs_struct *fs;
(2) struct files_struct *files;
(3) int link_count;

內存數據成員

(1) struct mm_struct *mm;

頁面管理

(1) int swappable:1;
(2) unsigned long swap_address;
(3) unsigned long min_flt。maj_flt;
(4) unsigned long nswap;
(5) unsigned long cmin_flt,cmaj_flt,cnswap;
(6) unsigned long old_maj_flt,dec_flt;
(7) unsigned long swap_cnt;

支持對稱多處理器方式(SMP)時的數據成員

(1) int processor;
(2) int last_processor;
(3) int lock_depth;

其它數據成員

(1) unsigned short used_math;
(2) char comm[16];
(3) struct rlimit rlim[RLIM_NLIMITS];
(4) int errno;
(5) long debugreg[8];
(6) struct exec_domain *exec_domain;
(7) unsigned long personality;
(8) struct linux_binfmt *binfmt;
(9) int exit_code,exit_signal;
(10) int dumpable:1;
(11) int did_exec:1;
(12) int tty_old_pgrp;
(13) struct tty_struct *tty;
(14) struct wait_queue *wait_chldexit;

進程隊列的全局變量

(1) current;
(2) struct task_struct init_task;
(3) struct task_struct *task[NR_TASKS];
(4) unsigned long volatile jiffies;
(5) int need_resched;
(6) unsigned long intr_count;

task_struct的定義

truct task_struct { volatile long state; //說明了該進程可否夠執行,仍是可中斷等信息 unsigned long flags; //Flage 是進程號,在調用fork()時給出 int sigpending; //進程上是否有待處理的信號 mm_segment_t addr_limit; //進程地址空間,區份內核進程與普通進程在內存存放的位置不一樣 //0-0xBFFFFFFF for user-thead //0-0xFFFFFFFF for kernel-thread //調度標誌,表示該進程是否需要又一次調度,若非0,則當從內核態返回到用戶態,會發生調度 volatile long need_resched; int lock_depth; //鎖深度 long nice; //進程的基本時間片 //進程的調度策略,有三種,實時進程: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 long sleep_time; //進程的睡眠時間 //用於將系統中所有的進程連成一個雙向循環鏈表, 其根是init_task struct task_struct *next_task, *prev_task; struct mm_struct *active_mm; struct list_head local_pages; //指向本地頁面 unsigned int allocation_order, nr_local_pages; struct linux_binfmt *binfmt; //進程所執行的可執行文件的格式 int exit_code, exit_signal; int pdeath_signal; //父進程終止時向子進程發送的信號 unsigned long personality; //Linux可以執行由其它UNIX操做系統生成的符合iBCS2標準的程序 int did_exec:1; pid_t pid; //進程標識符,用來表明一個進程 pid_t pgrp; //進程組標識,表示進程所屬的進程組 pid_t tty_old_pgrp; //進程控制終端所在的組標識 pid_t session; //進程的會話標識 pid_t tgid; int leader; //表示進程是否爲會話主管 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_list real_timer; //指向實時定時器的指針 struct tms times; //記錄進程消耗的時間 unsigned long start_time; //進程建立的時間 //記錄進程在每個CPU上所消耗的用戶態時間和核心態時間 long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS]; //內存缺頁和交換信息: //min_flt, maj_flt累計進程的次缺頁數(Copy on Write頁和匿名頁)和主缺頁數(從映射文件或交換 //設備讀入的頁面數); nswap記錄進程累計換出的頁面數,即寫到交換設備上的頁面數。 //cmin_flt, cmaj_flt, cnswap記錄本進程爲祖先的所有子孫進程的累計次缺頁數,主缺頁數和換出頁面數。 //在父進程回收終止的子進程時。父進程會將子進程的這些信息累計到本身結構的這些域中 unsigned long 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_t cap_effective, cap_inheritable, cap_permitted; int keep_capabilities:1; struct user_struct *user; struct rlimit rlim[RLIM_NLIMITS]; //與進程相關的資源限制信息 unsigned short used_math; //是否使用FPU char comm[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中 struct thread_struct thread; //文件系統信息 struct fs_struct *fs; //打開文件信息 struct files_struct *files; //信號處理函數 spinlock_t sigmask_lock; struct signal_struct *sig; //信號處理函數 sigset_t blocked; //進程當前要堵塞的信號,每個信號相應一位 struct sigpending pending; //進程上是否有待處理的信號 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; };

博客參照於:http://blog.csdn.net/lf_2016/article/details/54347820
進程百度百科:http://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B#2_1

相關文章
相關標籤/搜索