




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第2 2章章 進程管理進程管理 2.7 UNIX進程模型進程模型 2.7.1進程模型的基本結構和工作過程進程模型的基本結構和工作過程 UNIX的進程由三部分組成:的進程由三部分組成:proc結構結構(常駐內存常駐內存的的PCB),數據段,數據段(執行時用到的數據執行時用到的數據)和正文段和正文段(程序代程序代碼碼)。這些數據和代碼按一定的方式存儲在一個文件中,。這些數據和代碼按一定的方式存儲在一個文件中,當進程加載程序時,要加入進程的一些控制信息,且當進程加載程序時,要加入進程的一些控制信息,且系統創建相應的數據和堆棧段。進程映像的基本結構系統創建相應的數據和堆棧段。進程映像的基本結構如圖如
2、圖2.23所示。所示。第第2 2章章 進程管理進程管理 進程系統數據區user核心棧數據段用戶棧共享正文段用戶地址空間p-addrp-textpx-daddrx-caddrproc表進程數據段首地址共享正文段的起始塊號常駐內存部分非常駐內存部分text表text表指針圖圖2.23進程映像的基本結構進程映像的基本結構第第2 2章章 進程管理進程管理 1進程基本控制塊結構進程基本控制塊結構struct proccharp_stat;/*進程狀態進程狀態*/charp_flag;/*進程標志進程標志*/charp_pri;/*進程優先級進程優先級*/charp_sig;/*軟中斷號軟中斷號*/cha
3、rp_uid;/*用戶號用戶號*/charp_time; /*駐留時間駐留時間*/charp_cpu;/*進程占據進程占據CPU的時間量的時間量*/charp_nice;/*用于計算優先級用于計算優先級*/第第2 2章章 進程管理進程管理 intp_ttyp;/*控制終端控制終端tty結構的地址結構的地址*/intp_pid;/*進程號進程號*/intp_ppid;/*父進程號父進程號*/intp_addr;/*數據段地址數據段地址*/intp_size;/*數據段大小數據段大小*/intp_wchan; /*等待的原因等待的原因*/int*p_textp; /*對應正文段的對應正文段的tex
4、t項地址項地址*/ procNPROC;其中:其中:第第2 2章章 進程管理進程管理 第第2 2章章 進程管理進程管理 (1) p_flag的助記符包括:的助記符包括:SLOAD01在內存在內存SSYS 02進程進程0#SLOCK03鎖住,不能換出內存鎖住,不能換出內存SSWAP04正在換出正在換出STRC 05被跟蹤被跟蹤第第2 2章章 進程管理進程管理 (2) p_stat的助記符:在實際的操作系統中,為了管的助記符:在實際的操作系統中,為了管理和調度的方便,將進程的狀態進一步細分,理和調度的方便,將進程的狀態進一步細分,UNIX系系統統定義了定義了10種進程狀態,它們由種進程狀態,它們由
5、p_stat標記。具體如標記。具體如下:下:第第2 2章章 進程管理進程管理 NULL0proc為空為空SSLEEP1睡眠睡眠SWAIT 2等待等待SRUN3運行或就緒運行或就緒SIDL 4創建時的臨時狀態創建時的臨時狀態SZOMB5僵死狀態僵死狀態SSTOP 6被跟蹤被跟蹤SXBRK7因數據段擴展未滿足的換出狀態因數據段擴展未滿足的換出狀態SXSTK 8因棧段擴展未滿足的換出狀態因棧段擴展未滿足的換出狀態SXFRK 9 創建子進程時內存不夠,父進程鎖定在內存的狀態創建子進程時內存不夠,父進程鎖定在內存的狀態SXTXT 10因正文段擴展未滿足的換出狀態因正文段擴展未滿足的換出狀態第第2 2章章
6、 進程管理進程管理 2進程擴展控制塊結構進程擴展控制塊結構struct user intu_rsav2;/*保留現場保護區指針保留現場保護區指針*/ charu_segflg; /*用戶用戶/核心空間標志核心空間標志*/ charu_error;/*返回出錯代碼返回出錯代碼*/charu_uid;/*有效用戶號有效用戶號*/charu_gid;/*有效組號有效組號*/intu_procp;/*proc結構地址結構地址*/charu_base;/*內存地址內存地址*/char*u_count; /*傳送字節數傳送字節數*/char*u_offset2;/*文件讀寫位移文件讀寫位移*/第第2 2章
7、章 進程管理進程管理 int*u_cdir;/*當前目錄當前目錄I節點地址節點地址*/char*u_dirp;/*I節點當前指針節點當前指針*/structintu_ino;charu_name DIRSIZ;u_dent;/*當前目錄項當前目錄項*/intu_ofile NOFILE;/*用戶打開文件表用戶打開文件表*/intu_arg5;/*存系統調用的自變量存系統調用的自變量*/intu_tsize;/*正文段大小正文段大小*/第第2 2章章 進程管理進程管理 intu_dsize;/*用戶資料區大小用戶資料區大小*/intu_ssize;/*用戶棧大小用戶棧大小*/intu_utime
8、;/*用戶態執行時間用戶態執行時間*/intu_stime;/*核心態執行時間核心態執行時間*/intu_cutime;/*子進程用戶態執行時間子進程用戶態執行時間*/intu_cstime;/*子進程核心態執行時間子進程核心態執行時間*/intu_ar0;/*當前中斷保護區內當前中斷保護區內r0地址地址*/;第第2 2章章 進程管理進程管理 系統為了對正文段進行單獨管理,設置了一個正文表系統為了對正文段進行單獨管理,設置了一個正文表text,由幾十個表項組成,每項描述一個正文段。,由幾十個表項組成,每項描述一個正文段。text表表的的C語言描述如下:語言描述如下: struct text i
9、ntx_daddr;/*磁盤地址磁盤地址*/ intx_caddr;/*內存地址內存地址*/ intx_size;/*內存塊數,每塊內存塊數,每塊64字節字節*/ intx_iptr; /*文件內存文件內存I節點地址節點地址*/ charx_count;/*共享進程數共享進程數*/ charx_ccount;/*內存副本的共享進程數內存副本的共享進程數*/ textNTEXT;第第2 2章章 進程管理進程管理 2.7.2進程狀態及轉換進程狀態及轉換 UNIX的進程有多種狀態,具體狀態轉換圖如圖的進程有多種狀態,具體狀態轉換圖如圖2.24所示,圖所示,圖中列出了引起這些狀態轉換的有關程序。中列出
10、了引起這些狀態轉換的有關程序。fork運行核心態用戶態中斷自陷exit被搶占switchsleepsleepwakeup內存充足內存盤交換區換出換出wakeupwakeup就緒且換出高優先睡眠且換出換入創建在內存就緒換出高優先睡眠在內存wakeup僵死低優先睡眠在內存低優先睡眠且換出返回圖2.24 UNIX的進程狀態及轉換圖 第第2 2章章 進程管理進程管理 高優先睡眠:進程因等待事件而進入睡眠狀態,此高優先睡眠:進程因等待事件而進入睡眠狀態,此時進程映像可在內存,也可不在內存中時進程映像可在內存,也可不在內存中(在盤交換區或在盤交換區或輔存上輔存上)。下面幾種情況下,進程進入高優先睡眠狀態:
11、。下面幾種情況下,進程進入高優先睡眠狀態: (1)0#進程進程(交換進程交換進程)在入睡時總是處于最高優先睡在入睡時總是處于最高優先睡眠狀態,因為它的優先數最低。眠狀態,因為它的優先數最低。 (2)因資源請求不能得到滿足的進程進入高優先睡眠因資源請求不能得到滿足的進程進入高優先睡眠狀態。狀態。 (3)當某進程要求讀或寫快速設備上某一字符塊時,當某進程要求讀或寫快速設備上某一字符塊時,該進程進入高優先睡眠狀態以等待操作結束。該進程進入高優先睡眠狀態以等待操作結束。第第2 2章章 進程管理進程管理 低優先睡眠:進程因等待的事件不那么緊迫,則低優先睡眠:進程因等待的事件不那么緊迫,則進入低優先睡眠進
12、入低優先睡眠(或稱等待或稱等待)狀態,進程的映像可能在內狀態,進程的映像可能在內存中,也可能不在內存中。下述情況下,進程進入低存中,也可能不在內存中。下述情況下,進程進入低優先睡眠狀態:優先睡眠狀態: (1)進程在用戶態下運行,在進行同步操作時需要進程在用戶態下運行,在進行同步操作時需要睡眠,睡眠, 這時進入低優先睡眠狀態。這時進入低優先睡眠狀態。 (2)進程因等待低速字符設備輸入進程因等待低速字符設備輸入/輸出操作結束而輸出操作結束而睡眠,這時進入低優先睡眠狀態。睡眠,這時進入低優先睡眠狀態。第第2 2章章 進程管理進程管理 2.7.3 進程調度算法 UNIX采用動態優先數調度算法,利用調度
13、程序采用動態優先數調度算法,利用調度程序switch實現進實現進程調度。優先數計算主要遵循以下原則:進程優先級可為程調度。優先數計算主要遵循以下原則:進程優先級可為0127之間的任一整數;優先數越大,優先級越低,優先數越小,優先之間的任一整數;優先數越大,優先級越低,優先數越小,優先級越高。級越高。 在在UNIX系統系統中,進程優先數計算公式為中,進程優先數計算公式為 p_pri=p_cpu/2+PUSER+p_nice+NZERO (1) 系統設置部分:系統設置部分:PUSER和和NZERO是基本用戶優先數的域值,例是基本用戶優先數的域值,例如可取如可取25和和20。 (2) CPU使用時間
14、部分:使用時間部分:p_cpu表示該進程最近一次表示該進程最近一次CPU的使用時間,的使用時間,是進程占用是進程占用CPU的度量。的度量。 (3) 用戶設置部分:用戶設置部分:p_nice是用戶可以通過系統調用設置的一個優先級是用戶可以通過系統調用設置的一個優先級偏移值,默認值為偏移值,默認值為20。 第第2 2章章 進程管理進程管理 2.7.4UNIX的進程控制與管理的進程控制與管理1. 創建進程創建進程2. 父子進程同步父子進程同步3. 進程映像的改換進程映像的改換4. 進程家族樹進程家族樹5. 進程通信進程通信第第2 2章章 進程管理進程管理 在在UNIX系統中,進程分為兩大類:系統進程
15、和用戶進系統中,進程分為兩大類:系統進程和用戶進程。系統進程執行操作系統程序,提供系統功能,例如程。系統進程執行操作系統程序,提供系統功能,例如資源分配、進程調度。資源分配、進程調度。 用戶進程執行用戶程序,提供用戶功能。在用戶進程執行用戶程序,提供用戶功能。在UNIX系統系統中除了中除了0#系統進程以外,其他的進程都是由系統調用產系統進程以外,其他的進程都是由系統調用產生的。生的。0#進程的主要作用是在內存和盤交換區之間進行進程的主要作用是在內存和盤交換區之間進行圖像傳輸。圖像傳輸。UNIX的用戶可以利用的用戶可以利用fork系統調用生成一系統調用生成一個新進程,個新進程,新生成的進程稱為新
16、生成的進程稱為子進程,生成新進程的進,生成新進程的進程為程為父進程。 1.創建進程創建進程第第2 2章章 進程管理進程管理 fork是一個系統調用,它的工作流程見圖是一個系統調用,它的工作流程見圖2.25。說明說明:無論是操作系統或用戶無論是操作系統或用戶,創建進程都必須調用進程原語來實現,創建進程都必須調用進程原語來實現,其功能是創建一個具有指定標識符的進程。不同的操作系統所其功能是創建一個具有指定標識符的進程。不同的操作系統所提供的進程創建原語的名稱和格式不盡相同,但執行創建進程提供的進程創建原語的名稱和格式不盡相同,但執行創建進程原語后,原語后,OS所做的工作卻大致相同。包括以下:所做的
17、工作卻大致相同。包括以下:1.給新進程分配一個內部標識,并分配一個空白的給新進程分配一個內部標識,并分配一個空白的PCB,同,同時在系統進程表中增加一個表目;時在系統進程表中增加一個表目;2.為該進程分配內存空間,包括進程映像所需要的所有元素為該進程分配內存空間,包括進程映像所需要的所有元素(程序、數據、用戶棧等),復制父進程內存空間到該進(程序、數據、用戶棧等),復制父進程內存空間到該進程內存空間。程內存空間。3.初始化初始化PCB。如果該進程是用戶進程創建的子進程,。如果該進程是用戶進程創建的子進程,則它則它將繼承和共享父進程的資源。將繼承和共享父進程的資源。4.置該進程的狀態為就緒,插入
18、就緒隊列。置該進程的狀態為就緒,插入就緒隊列。5.生成其他相關的數據結構。生成其他相關的數據結構。第第2 2章章 進程管理進程管理 NNfork( )是特權用戶嗎?生成子進程進程返回到父進程?Y送子進程返回值0清除進程統計信息清除進程運行時間數據返回內存夠用嗎?送父進程返回值為子進程標識送錯誤信息YNY圖圖2.25 fork系統調用的工作流程系統調用的工作流程第第2 2章章 進程管理進程管理 fork的工作流程為:的工作流程為: (1)系統為新進程分配一個惟一的進程標識。系統為新進程分配一個惟一的進程標識。 (2)利用父進程表項的內容填寫子進程的表項,并利用父進程表項的內容填寫子進程的表項,并
19、置子進程為置子進程為“就緒就緒”態。態。 (3)繼承父進程的文件和共享正文段。繼承父進程的文件和共享正文段。 (4)繼承共享內存段。繼承共享內存段。 第第2 2章章 進程管理進程管理 fork函數的格式:函數的格式:返回值:返回值:0 創建成功,從子進程返回;創建成功,從子進程返回; 0 創建成功,從父進程返回,其值為子進程的創建成功,從父進程返回,其值為子進程的 PID號;號; -1 創建失敗。創建失敗。 當當OS調度到子進程時,會執行與父進程一樣的程序,父子進調度到子進程時,會執行與父進程一樣的程序,父子進程僅在各自的分支中才會執行有別于對方的程序。程僅在各自的分支中才會執行有別于對方的程
20、序。共享的正文段text表表p_pidp_addrp_textpp_pidp_addrp_textp數據段數據段copyp_daddr第第2 2章章 進程管理進程管理 例例2.6 fork()函數的應用方法。函數的應用方法。/*/*The system call fork*/*/main()int proc_id; /*進程標識進程標識*/ while(proc_id=fork()=-1); /*產生進程,直到成功為止產生進程,直到成功為止*/if(proc_id) /*如果返回的進程標識不等于如果返回的進程標識不等于0,*/ /*表示處理機分給了父進程表示處理機分給了父進程,執行父進程的程序
21、執行父進程的程序*/ printf(Parentprocesssprogram.n); else /*如果返回的進程標識為如果返回的進程標識為0,*/printf(Childprocesssprogram.n); /*表示處理機分配給了子進程表示處理機分配給了子進程*/ /*執行子進程的程序執行子進程的程序*/printf(Processesarefinished!n);第第2 2章章 進程管理進程管理 程序執行時,父進程先生成子進程,然后進程調度程程序執行時,父進程先生成子進程,然后進程調度程序序switch對父、子進程進行調度,決定處理機在父、子對父、子進程進行調度,決定處理機在父、子進程
22、之間的分配。進程之間的分配。 Parentprocesssprogram. /當調度到父進程時當調度到父進程時 Processesarefinished! Childprocesssprogram. /當調度到子進程時當調度到子進程時 Processesarefinished! 第第2 2章章 進程管理進程管理 例例 2.7 父進程創建子進程父進程創建子進程P1、P2,父子進程分別輸出字,父子進程分別輸出字符符a、b和和c。程序如下:。程序如下:#includeMain() int p1,p2; while(p1=fork()= =-1); /創建創建P1If(p1= =0) putchar(
23、b); /p1返回輸出返回輸出bElse /父進程返回父進程返回第第2 2章章 進程管理進程管理 while (p2=fork()= =-1); /創建子進程創建子進程p2 if(p2=0) putchar(c); /子進程子進程P2返回輸出返回輸出c else putchar(a); /父進程返回輸出父進程返回輸出a 上述程序編譯連接運行多次,每次輸出的結果是:abcacb,bca,cba,bac或cab等隨即結果中的任意一種。 每次運行后都會產生父子3個進程,所以每次有3個字符輸出。第第2 2章章 進程管理進程管理 UNIX中父子進程對程序的共享部分與私有部分中父子進程對程序的共享部分與私
24、有部分 父進程創建子進程后,父子進程各自分支中的程序各自私有,父進程創建子進程后,父子進程各自分支中的程序各自私有,其余部分,包括創建前和分支結束的程序段,均為父子進程共享。其余部分,包括創建前和分支結束的程序段,均為父子進程共享。父進程PCB程序;If(p20)輸出a;子進程P1 PCB程序;If(p1= =0)輸出b;子進程P2 PCB程序;If(p2= =0)輸出c;copycopy圖圖2.7.6 父子進程映像的組成父子進程映像的組成第第2 2章章 進程管理進程管理 例例 2.8 試給出下列程序清單的執行結果。試給出下列程序清單的執行結果。#includeMain() int p1; p
25、utchar(x); while(p1=fork()= =-1); if(p1= =0) putchar(b); else putchar(a);putchar(y); 運行后輸出結果可能是xayxby或者xbyxay中的任意一個。第第2 2章章 進程管理進程管理 例例2.9 fork()函數的應用。函數的應用。#include #include main()intpid;/*進程標識進程標識id是一個整數是一個整數*/printf(Beforeforkn);while(pid=fork()=-1);if(pid)printf(Itisparentprocess:PID=%dn,getpid(
26、);第第2 2章章 進程管理進程管理 /*輸出父進程的進程號輸出父進程的進程號*/printf(ProducechildsPID=%dn,pid);/*輸出創建子進程的進程號輸出創建子進程的進程號*/elseprintf(Itischildprocess:PID=%d/n,getpid();printf(Itisparentprocess:PID=%d/n,getppid();pid_t getpid(void); pid_t getppid(void);說明:該兩個系統調用,若它們成功地返回,分別返回調用進程的進程標識符和其父進程標識符;若不成功,返回-1.第第2 2章章 進程管理進程管理
27、如果子進程在其分支結束處使用了如果子進程在其分支結束處使用了exit()系統調用來終止自身的執行,系統調用來終止自身的執行,則不會再共享分支結束后的程序段。則不會再共享分支結束后的程序段。#includeMain() int p1; putchar(x); while(p1=fork()= =-1); if(p1= =0) putchar(b); exit(0); else putchar(a);Putchar(y); 運行結果為:xbxay或xayxb 可以看出,父子進程對于創建前的部分是共享的,而分支結束后是否共享取決子進程是否已經終止。第第2 2章章 進程管理進程管理 1)進程的撤銷)進
28、程的撤銷當一個進程結束時可以調用進程撤銷原語自我撤銷。進程撤銷原語執行時,當一個進程結束時可以調用進程撤銷原語自我撤銷。進程撤銷原語執行時,操作系統完成以下任務:操作系統完成以下任務:找到該進程,將其所占有資源歸還給系統,將其生命周期中所占用的找到該進程,將其所占有資源歸還給系統,將其生命周期中所占用的CPU時間累計到其父進程時間累計到其父進程PCB中。中。將該進程從系統進程鏈表中刪除,釋放該進程的將該進程從系統進程鏈表中刪除,釋放該進程的PCB;轉進程調度。由于該進程被終止執行,轉進程調度。由于該進程被終止執行,CPU被釋放,所以要轉由進程調被釋放,所以要轉由進程調度程序來實施度程序來實施C
29、PU的再分配。的再分配。進程一旦撤銷就不可能再轉為其他任何進程狀態了,該進程的生命周期進程一旦撤銷就不可能再轉為其他任何進程狀態了,該進程的生命周期就此消亡。所以進程撤銷的系統調用不返回函數。就此消亡。所以進程撤銷的系統調用不返回函數。2) 進程的自我終止進程的自我終止 當一個進程執行結束后,進程可以調用當一個進程執行結束后,進程可以調用exit自我終止。終止時它放棄自我終止。終止時它放棄占用的所有資源,處于等待父進程善后處理狀態。占用的所有資源,處于等待父進程善后處理狀態。exit的工作流程見圖的工作流程見圖2.26。 2. 父、子進程的同步父、子進程的同步第第2 2章章 進程管理進程管理
30、NYExit( )清除打開的文件表,對打開的文件、現工作目錄進行處理找到了嗎?將父進程改為0#進程喚醒父進程或0#進程將其所有子進程的父進程改為1#進程,處理機重新調度放棄本進程的數據段、棧段占用的內存區進程狀態設置為等待善后處理狀態(SZOMB)尋找父進程圖2.26 exit的工作流程 第第2 2章章 進程管理進程管理 調用格式:調用格式: void exit(int status) 在用戶態的進程程序中,調用在用戶態的進程程序中,調用exit(status)將使進程將使進程終止,參數終止,參數status是終止進程向父進程傳遞的參數。在是終止進程向父進程傳遞的參數。在父進程中,利用系統調用
31、父進程中,利用系統調用wait(status)獲取該參數。獲取該參數。第第2 2章章 進程管理進程管理 3)父進程等待子進程終止父進程等待子進程終止 系統調用系統調用wait,對處于等待善后處理狀態的子進,對處于等待善后處理狀態的子進程進行善后處理。在用戶態進程中,父進程調用程進行善后處理。在用戶態進程中,父進程調用wait(status)等待它的一個子進程終止。等待它的一個子進程終止。 如果調用如果調用wait()之前,已有一個子進程結束了,則之前,已有一個子進程結束了,則父進程對其作善后處理后返回。父進程對其作善后處理后返回。 如果調用如果調用wait()的進程沒有子進程,則返回的進程沒有
32、子進程,則返回1。 如果調用如果調用wait()時它的子進程還沒有終止,則它進時它的子進程還沒有終止,則它進入阻塞態。入阻塞態。第第2 2章章 進程管理進程管理 例例2.9父、子進程的同步關系。父、子進程的同步關系。/*/*The example of parent and child processes*/*and the application of function exit() wait()*/*/ #include#includemain()int proc_id; /*theidentityofprocess*/ while(proc_id=fork()=-1);if(proc_i
33、d)第第2 2章章 進程管理進程管理 /*執行父進程的程序段執行父進程的程序段*/proc_id=wait(); /*等待子進程的終止,返回值是子進程的標識等待子進程的終止,返回值是子進程的標識*/printf(the child process has finished.n);printf(The child process PID=%dn,proc_id);elseprintf(In child process.n);第第2 2章章 進程管理進程管理 exit();/*子進程的程序執行完畢,想要結束,等待父進程子進程的程序執行完畢,想要結束,等待父進程的處理的處理*/該程序的運行結果:該程
34、序的運行結果:In child process.the child process has finished.The child process PID=177第第2 2章章 進程管理進程管理 一個一個wait()只能用來等待一個子進程終止,如果等待只能用來等待一個子進程終止,如果等待多個子進程終止則需要使用多個多個子進程終止則需要使用多個wait。一個若父進程僅。一個若父進程僅僅只是等待任意一個子進程結束,而不需要取子進程發僅只是等待任意一個子進程結束,而不需要取子進程發來的信號,則可以簡單地使用來的信號,則可以簡單地使用wait(0).格式格式2:pid_t waitpid(pid_t p
35、id, int * stat_addr, int options);當當pid=0,等待與父進程同組的子進程;,等待與父進程同組的子進程;當當pid=-1,option=0時,等同于時,等同于wait(),等待任意子進程;等待任意子進程;當當pid0時,等待給定時,等待給定pid號的子進程。號的子進程。第第2 2章章 進程管理進程管理 4) 進程睡眠進程睡眠 當一個進程因為某種執行條件占不滿足或者等待某個當一個進程因為某種執行條件占不滿足或者等待某個事件的發生時,它必須放棄事件的發生時,它必須放棄CPU,等待條件滿足后才,等待條件滿足后才能繼續執行。此時,進程將自動放棄能繼續執行。此時,進程將
36、自動放棄CPU,進入睡眠,進入睡眠狀態。以下事件皆能引起進程睡眠:狀態。以下事件皆能引起進程睡眠:進程請求進程請求I/O;進程請求系統資源時需要排隊或暫時得不到滿進程請求系統資源時需要排隊或暫時得不到滿足;足;進程請求的同步或互斥信號沒有滿足或等待的進程請求的同步或互斥信號沒有滿足或等待的同步信號沒有到來;同步信號沒有到來;進程請求延時;進程請求延時; 第第2 2章章 進程管理進程管理 UNIX提供多種可能導致進程睡眠或等待的系統調提供多種可能導致進程睡眠或等待的系統調用,如等待子進程終止的調用用,如等待子進程終止的調用wait()和進程延時系統調和進程延時系統調用用sleep()。格式:格式
37、: sleep(n) 其中,其中,n表示延時的秒數。表示延時的秒數。功能:進程睡眠功能:進程睡眠n秒。秒。 進程等待的時間完成后,可執行進程喚醒原語將其進程等待的時間完成后,可執行進程喚醒原語將其喚醒。喚醒。第第2 2章章 進程管理進程管理 一個進程可以調用一個進程可以調用fork()產生自己的子進程,使它們執行不產生自己的子進程,使它們執行不同的程序段同的程序段以實現不同的功能。但我們也發現子進程和父進程的映像有很大的相似,父進程但我們也發現子進程和父進程的映像有很大的相似,父進程創建一個子進程的目的通常是要讓它去獨立完成一個指定的任務創建一個子進程的目的通常是要讓它去獨立完成一個指定的任務
38、,這使得復制而來的程序對子進程而言沒有實際應用價值,子進程這使得復制而來的程序對子進程而言沒有實際應用價值,子進程不應再執行父進程中相同的部分,父進程也是一樣,這部分相同不應再執行父進程中相同的部分,父進程也是一樣,這部分相同的映像造成了很大的浪費。的映像造成了很大的浪費。因此,父進程需要子進程映像具有與其父進程的程序完全不因此,父進程需要子進程映像具有與其父進程的程序完全不同的代碼,以便其獨立功能的實現、調式和修改與父進程的程序同的代碼,以便其獨立功能的實現、調式和修改與父進程的程序無關。無關。3.進程映像的改換進程映像的改換第第2 2章章 進程管理進程管理 解決方法 UNIX系統提供了一組
39、系統調用系統提供了一組系統調用exec函數,該組函數的主要功函數,該組函數的主要功能是將指定的可執行文件加載到指定的進程映像中,覆蓋該進程能是將指定的可執行文件加載到指定的進程映像中,覆蓋該進程映像中原有程序。映像中原有程序。 此類系統調用函數的格式有此類系統調用函數的格式有execl()、 execle()、 execlp() 、 execv()、 execve()、execvp() ,其功能都是將一個指定的程序裝入調用它的進程映像中,用這個可執行文件的副本去覆蓋該進程的用這個可執行文件的副本去覆蓋該進程的程序空間,從而改變調用進程的執行代碼使調用進程執行新引入程序空間,從而改變調用進程的執
40、行代碼使調用進程執行新引入的可執行程序(二進程代碼文件)。所以我們可以用它們來實現的可執行程序(二進程代碼文件)。所以我們可以用它們來實現子進程映像的重新裝入,從而使子進程具有與父進程完全不同的子進程映像的重新裝入,從而使子進程具有與父進程完全不同的程序。程序。 第第2 2章章 進程管理進程管理 內核響應這組系統調用后做以下工作:內核響應這組系統調用后做以下工作:根據給出的路徑名找到指定的可執行文件,檢查該文件是否可執根據給出的路徑名找到指定的可執行文件,檢查該文件是否可執行,用戶是否具有執行權限行,用戶是否具有執行權限(因此該文件必須是編譯連接后的二進因此該文件必須是編譯連接后的二進制代碼制
41、代碼);將該文件載入到調用它的進程映像中覆蓋其原有程序;將該文件載入到調用它的進程映像中覆蓋其原有程序;為該程序的執行設置參數數組和環境變量;為該程序的執行設置參數數組和環境變量;啟動該進程進入新的程序入口點去執行。啟動該進程進入新的程序入口點去執行。 此組函數執行時,如果加載成功則直接執行,而且是不返回的;此組函數執行時,如果加載成功則直接執行,而且是不返回的;若加載不成功則返回若加載不成功則返回-1。該組函數無論采用哪種格式都必須給出。該組函數無論采用哪種格式都必須給出將轉去執行文件的路徑名,需要的參數數組以及環境變量則依調將轉去執行文件的路徑名,需要的參數數組以及環境變量則依調用的格式不
42、同而有所不同。該組函數之間的區別主要在于參數給用的格式不同而有所不同。該組函數之間的區別主要在于參數給出的方式不同。只介紹其中的出的方式不同。只介紹其中的execl()和和execv(),其余的格式可舉,其余的格式可舉一反三。一反三。第第2 2章章 進程管理進程管理 exec系列函數的6種格式為:#includeint execve(const char *path,char*const*argv,char*const*envp);int execl(const char *path,char*arg,.);int execp(const char *file,char*arg,.);int
43、execle(const char *path,constchar*argv,.,char*const*envp);int execv(const char *path,char*const*arg);int execvp(const char *file,char*const*arg); exec前綴,后跟一至兩個字母 llist,vvector,eenv,ppath l與v:指定命令行參數的兩種方式,l以表的形式在函數參數中列舉出命令行參數,v要事先組織成一個指針數組。 e:需要指定envp來初始化進程。 p:函數的第一個參數是程序文件名。使用環境變量PATH查找可執行文件。 六種格式的區
44、別:不同的參數方式初始化堆棧底部。第第2 2章章 進程管理進程管理 (1) 給出指向參數表的指針給出指向參數表的指針 int execv(path,arg);參數定義:參數定義:const char *path 指定文件全名(路徑名指定文件全名(路徑名/文件名)的指針;文件名)的指針;Char *argn 指向命令及參數的指針;指向命令及參數的指針;功能:功能:執行參數指定的命令或文件;執行參數指定的命令或文件;用該命令或可執行文件的副本覆蓋調用它的子進程的映像。用該命令或可執行文件的副本覆蓋調用它的子進程的映像。返回值:返回值:-1表示錯誤返回。表示錯誤返回。所用頭文件:所用頭文件:#inc
45、lude(2) 直接給出文件參數直接給出文件參數 int execl(constchar*path,char*arg,.);功能:同上功能:同上返回值:同上返回值:同上應用頭文件:同上應用頭文件:同上第第2 2章章 進程管理進程管理 使用方法:使用方法: 事先準備好進程要執行的程序,并將它編譯連接成可執行文件,事先準備好進程要執行的程序,并將它編譯連接成可執行文件,記下該文件的路徑名和文件名。如果不帶參數則可以直接使用記下該文件的路徑名和文件名。如果不帶參數則可以直接使用execl(),帶參數則使用,帶參數則使用execv(); 在父進程創建子進程之前,在程序中事先定義子進程要執行的程在父進程
46、創建子進程之前,在程序中事先定義子進程要執行的程序文件的文件標識序文件的文件標識path和參數數組和參數數組arg,其中的環境值可以用,其中的環境值可以用NULL取代。如果不帶參數使用取代。如果不帶參數使用execl(),則這一步可以不用做;,則這一步可以不用做; 創建子進程后,在子進程的分支中,如果不帶參數則使用創建子進程后,在子進程的分支中,如果不帶參數則使用execl(filepath,0),如果帶參數則使用,如果帶參數則使用execv(filepath,arg)來實現用來實現用指定的程序指定的程序filepath覆蓋子進程映像中原有程序。覆蓋子進程映像中原有程序。注:注: exec不創
47、建新進程,只是將當前進程重新初始化了不創建新進程,只是將當前進程重新初始化了指令段和用戶數據段,堆棧段以及指令段和用戶數據段,堆棧段以及CPU的的PC指針指針.第第2 2章章 進程管理進程管理 例例2.10創建一個子進程,并給它加載程序,其功能輸出創建一個子進程,并給它加載程序,其功能輸出“I am a child.”分析:由于子進程需要加載的程序比較簡單,不帶參數,所以可以使用分析:由于子進程需要加載的程序比較簡單,不帶參數,所以可以使用execl()函數實現加載。函數實現加載。編輯子進程要加載的程序:編輯子進程要加載的程序:#chld.c 編譯編譯chld.c,當前目錄下生成,當前目錄下生
48、成chld文件文件#include 記下該文件的路徑名和文件名是:記下該文件的路徑名和文件名是:#include ./chldMain() printf(“I am a child.n”); exit(0); 該程序的執行結果是:該程序的執行結果是:第第2 2章章 進程管理進程管理 #create a child process #include #include main()int p; while(p=fork()= =-1); /創建子進程創建子進程 if(p= =0) /子進程返回子進程返回 execl(“./chld”,0) ; /加載子進程的程序加載子進程的程序 else / 父進
49、程返回父進程返回 wait(0); /等待子進程終止等待子進程終止 exit(0);程序執行結果: I am a child.第第2 2章章 進程管理進程管理 例例2.11 創建一個子進程,并給它加載程序,其功能是調用鍵盤命令創建一個子進程,并給它加載程序,其功能是調用鍵盤命令ls -l。已。已知該鍵盤命令的路徑與文件名為:知該鍵盤命令的路徑與文件名為:/bin/ls。分析:該例中的可執行文件名是分析:該例中的可執行文件名是ls l,待參數,所以文件名是一個數組,在子,待參數,所以文件名是一個數組,在子進程中要使用進程中要使用execv()來執行該鍵盤命令,命令參數數組要提前定義。來執行該鍵盤
50、命令,命令參數數組要提前定義。編輯子進程要加載的程序:編輯子進程要加載的程序:#chld1.c 編譯、連接編譯、連接chld1.c,當前目錄下生成,當前目錄下生成chld文文件件#include 記下該文件的路徑名和文件名是:記下該文件的路徑名和文件名是: ./chld1#includemain() char* path=“/bin/ls”; /定義文件路徑參數定義文件路徑參數 char* argv4=“ls”,”-l”,NULL; /定義命令參數定義命令參數 execv(path,argv); /執行命令執行命令 exit(0); 該程序的執行結果是該程序的執行結果是ls命令命令第第2 2章
51、章 進程管理進程管理 #create a child process #include #include main()int p; while(p=fork()= =-1); /創建子進程創建子進程 if(p= =0) /子進程返回子進程返回 execl(“./chld1”,0) ; /加載子進程的程序加載子進程的程序 else / 父進程返回父進程返回 wait(0); /等待子進程終止等待子進程終止 exit(0);程序執行結果與之前的chld1.c文件結果一致。由結果可以看出:同樣的程序代碼,由于子進程所加載的程序不一樣,執行結果也不一樣。第第2 2章章 進程管理進程管理 exec函數如
52、果調用成功則不返回,如果出錯則返回函數如果調用成功則不返回,如果出錯則返回-1,所以當子進程,所以當子進程加載自己的程序后,從原有的父進程處復制而來的程序就全部被加載自己的程序后,從原有的父進程處復制而來的程序就全部被覆蓋,因此,在子進程分支中,若覆蓋,因此,在子進程分支中,若exec函數調用后之后還有其他函數調用后之后還有其他語句,則這些語句是不會被執行的。語句,則這些語句是不會被執行的。#chld.c#include #includeMain() printf(“I am a child.n”); /exit(0); 刪除刪除chld.c中的中的exit語句語句#create a chil
53、d process #include #include main()int p; while(p=fork()= =-1); if(p= =0) execl(“./chld”,0) ; printf(“aaan”);else wait(0); exit(0);該例的目的是考察execl函數后是否返回執行輸出aaa,程序運行結果與例2.10一致,說明execl函數沒有返回。第第2 2章章 進程管理進程管理 4.進程家族樹進程家族樹 如果一個使用了多個如果一個使用了多個fork()調用,而且每次都不對返調用,而且每次都不對返回值加以判斷,不區分父子進程各自的程序空間,則后面回值加以判斷,不區分父子
54、進程各自的程序空間,則后面的的fork()調用為父子進程共享,即父子進程返回時都會執調用為父子進程共享,即父子進程返回時都會執行,從而使得進程的家族關系變得很復雜。行,從而使得進程的家族關系變得很復雜。#includeMain()fork(); fork(); putchar(a);1243運行結果:aaaa 查看程序被執行了幾次,則共有多少個a輸出,同時證明了有多少個進程產生。第第2 2章章 進程管理進程管理 以此類推,若有三個以此類推,若有三個fork()連續調用,則父子四個進程返回時都會再連續調用,則父子四個進程返回時都會再次調用第三個次調用第三個fork(),因而變成因而變成8個。個。
55、#includeMain()fork(); /父進程父進程1創建子進程創建子進程2 fork(); /父子進程父子進程12返回后分別再創建各自的子進程返回后分別再創建各自的子進程3、4 fork(); /父子進程父子進程1234返回后分別再創建各自的子進程返回后分別再創建各自的子進程5、6、7、8 putchar(a); /每個進程都輸出每個進程都輸出a 12438567運行結果:aaaaaaaa如果連續使用n個fork()函數,且均不放在父子進程的分支,則n個fork()執行后創建的進程樹種的進程總數為2n個。試畫出4個fork()連續調用的進程樹。第第2 2章章 進程管理進程管理 練習:1
56、.如果父進程創建3個進程,其父子關系如圖所示,試寫出其程序代碼。ParentP1P2P3ParentP1P2P3(a)(b)第第2 2章章 進程管理進程管理 2.使用fork創建子進程,程序如下: $cat fork1.c int a; int main(int argc,char *argv) int b; printf(“1%s:BEGINn”,argv0); a=10; b=20; printf(“2a+b=%dn”,a+b);fork();a+=100;b+=100;printf(“3a+b=%dn”,a+b);printf(“4%s:ENDn”,argv0);$gcc o fork1
57、 fork1.c ; fork1 試分析程序的執行結果。1./fork1:BEGIN2a+b=303a+b=2304./fork1:END3a+b=2304./fork1:END第第2 2章章 進程管理進程管理 (a) #includemain()int p1,p2,p3; while(p1= fork()= = -1); if(p10) while(p2=fork()= = -1); if (p20) while(p2=fork()= = -1); if(p30) fork(); (b) #includemain()int p1,p2,p3; while(p1= fork()= = -1);
58、 if(p10) while(p2=fork()= = -1); if (p2= =0) while(p3 =fork()= = -1); 第第2 2章章 進程管理進程管理 (a)#includemain()int p1,flag; while(p1= fork()= = -1); for(flag=0;flag0) fork(); putchar(a); #includemain()int p1; while(p1= fork()= = -1); if(p10) fork(); if(p10) fork(); putchar(a); 運行結果輸出a的個數為5編寫代碼需謹慎!第第2 2章章 進
59、程管理進程管理 例例2.12 引入進程通信的例題引入進程通信的例題.在子進程中對變量重新賦值在子進程中對變量重新賦值,觀察在父進程中是否感知到該值的變化觀察在父進程中是否感知到該值的變化.#includemain()int p1; else int x=1; putchar(a);while(p1=fork()=-1); printf(“%d”,x);if(p1= =0) putchar(b);x=9;printf(“%d”,x);程序運行結果是:b9a1或a1b9,說明了什么問題?第第2 2章章 進程管理進程管理 5.進程間的通信進程間的通信進程間通信進程間通信(Inter-Process
60、Communication,IPC) 進程之間的通信不能通過變量或其他數據結構直接進行,根據進程之間的通信不能通過變量或其他數據結構直接進行,根據進程間通信信息量的不同,我們將進程通信劃分為兩大類型:控制進程間通信信息量的不同,我們將進程通信劃分為兩大類型:控制信息的通信和大批數據信息的通信,前者稱低級通信,后者稱為高信息的通信和大批數據信息的通信,前者稱低級通信,后者稱為高級通信。低級通信主要用于進程之間的同步、互斥、終止、掛起等級通信。低級通信主要用于進程之間的同步、互斥、終止、掛起等控制信息的傳遞,所傳遞的信息往往只是一個信號、一個鍵或組合控制信息的傳遞,所傳遞的信息往往只是一個信號、一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軍訓教學考試題及答案
- 應試技巧與策略稅務師試題及答案
- 2025-2030中國電子商務網站行業發展趨勢與投資戰略研究報告
- 9《烏鴉喝水》教學設計-2024-2025學年語文一年級上冊(統編版)
- 2025-2030中國電動按摩椅行業市場深度調研及發展趨勢和投資前景預測研究報告
- 2025-2030中國生鮮豬肉行業市場深度調研及發展趨勢與投資戰略研究報告
- 2025-2030中國生物菌肥行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030中國生物有機肥料行業市場發展趨勢與前景展望戰略研究報告
- 2025-2030中國甜菊和和甜葉菊行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030中國瓶裝水市場經營策略與未來消費需求趨勢研究報告
- 人工智能技術與知識產權保護
- 2025-2030便利店行業市場發展現狀及發展前景與投資研究報告
- 2025屆高三湖北省十一校第二次聯考英語試卷(含答案詳解)
- 信息技術與小學教育教學融合
- 產品設計研發費用統計表
- 提高教學管理質量校長講話:“2574”工作實施思路!即兩大抓手五項重點任務七個落實環節四個質量目標
- 2025屆廣東省深圳市高三年級第一次調研考試歷史試題
- 清理報廢漁船合同范本
- 2023數據中心節能改造實踐案例
- 《基于西門子S7-1200PLC的四層電梯控制系統設計》8900字
- 生產安全事故應急演練評估報告模版
評論
0/150
提交評論