共享linux課件系統(tǒng)編程多進(jìn)程_第1頁(yè)
共享linux課件系統(tǒng)編程多進(jìn)程_第2頁(yè)
共享linux課件系統(tǒng)編程多進(jìn)程_第3頁(yè)
共享linux課件系統(tǒng)編程多進(jìn)程_第4頁(yè)
共享linux課件系統(tǒng)編程多進(jìn)程_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、進(jìn)程控制目標(biāo):本章向?qū)W員介紹進(jìn)程控制理論,通過(guò)本課的學(xué)習(xí),學(xué)員應(yīng)該掌握如下知識(shí):進(jìn)程的定義、特點(diǎn)、狀態(tài)進(jìn)程ID、 進(jìn)程互斥、死鎖臨界資源、臨界區(qū)進(jìn)程同步、 進(jìn)程調(diào)度進(jìn)程創(chuàng)建、exec函數(shù)族、進(jìn)程等待及退出1.1 定義執(zhí)行caxt|wcl從操作上看是實(shí)現(xiàn)統(tǒng)計(jì)a.txt文本的行數(shù)的功能,從程序的角度,就是兩個(gè)進(jìn)程間通過(guò)管道進(jìn)行通信的例子。進(jìn)程由程序代碼、數(shù)據(jù)、變量、打開(kāi)的文件和環(huán)境組成,linux系統(tǒng)會(huì)在進(jìn)程之間共享程序代碼和系統(tǒng)函數(shù)庫(kù)。進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序的一次運(yùn)行活動(dòng)。每個(gè)運(yùn)行著的程序就一個(gè)進(jìn)程,就好像linux系統(tǒng)下ls命令1.2 進(jìn)程狀態(tài)就緒IO完成時(shí)間片完進(jìn)程調(diào)度阻塞執(zhí)行IO

2、請(qǐng)求1.3 進(jìn)程ID進(jìn)程ID():標(biāo)識(shí)進(jìn)程的唯一數(shù)字。每個(gè)進(jìn)程都有唯一的進(jìn)程ID號(hào),通過(guò)進(jìn)程ID可以查找到相應(yīng)的進(jìn)程及了解進(jìn)程的當(dāng)前狀態(tài)。父進(jìn)程的ID(P)啟動(dòng)進(jìn)程的用戶(hù)ID(UID)1.4 進(jìn)程互斥了該資源為止。進(jìn)程互斥是指當(dāng)有若干進(jìn)程都要使用某一共享資源時(shí),任何時(shí) 刻最多允許一個(gè)進(jìn)程使用,其他要使用該資源的進(jìn)程必須等待,為實(shí)現(xiàn)進(jìn)程互斥,可以利用方法,也可以利用同步機(jī)制來(lái)協(xié)調(diào)多個(gè)進(jìn)程,但是應(yīng)該遵循四準(zhǔn)則:空閑讓進(jìn)、忙則等待、有限等待、讓權(quán)等待直到占用該資源者1.5 臨界資源進(jìn)程中臨界資源的那段代碼稱(chēng)為臨界區(qū)。為實(shí)現(xiàn)對(duì)臨界資源的互斥,應(yīng)保證諸進(jìn)程互斥地進(jìn)入各自的臨界區(qū)。緩沖隊(duì)列、變量、數(shù)組、緩

3、沖區(qū)等。 諸進(jìn)程間應(yīng)采取互斥方式,實(shí)現(xiàn)對(duì)這種資源的共享。屬于臨界資源的硬件有、傳真機(jī)等,有消息臨界資源是指每次僅允許一個(gè)進(jìn)程的資源。1.6 進(jìn)程同步發(fā)送事件請(qǐng)求事件任務(wù)1任務(wù)2事件一組并發(fā)進(jìn)程按一定的順序執(zhí)行的過(guò)程稱(chēng)為進(jìn)程間的同步。具有同步關(guān)系的一組并發(fā)進(jìn)程稱(chēng)為合作進(jìn)程,合作進(jìn)程間互相發(fā)送的信號(hào)稱(chēng)為消息或事件。1.7 死鎖資源時(shí),使用相反的順序;4)使用等待超時(shí)。防止死鎖的方法:先得到全部需要的資源,再做下一步的工作;用同樣的順序申請(qǐng)多個(gè)資源;3)指兩個(gè)任務(wù)無(wú)限期地互相等待對(duì)方控制著的資源。假設(shè)任務(wù)T1正獨(dú)享資源R1,任務(wù)T2正獨(dú)享資源R2,此時(shí)任務(wù)T1又要使用資源 R2,任務(wù)T2也要使用資源

4、R1,于是兩個(gè)任務(wù)都無(wú)法繼續(xù)執(zhí)行了。1.8 進(jìn)程調(diào)度調(diào)度方式:搶占式非搶占式調(diào)度算法:先來(lái)先服務(wù)調(diào)度算法短進(jìn)程優(yōu)先調(diào)度算法高優(yōu)先級(jí)優(yōu)先調(diào)度算法時(shí)間片輪轉(zhuǎn)法按一定算法,從一組待運(yùn)行的進(jìn)程中選出一個(gè)來(lái)占有CPU運(yùn)行。1.9 進(jìn)程編程:獲取_tget(void)獲取P:_tgetp(void)功能:獲取父進(jìn)程ID。功能:獲取本進(jìn)程ID。1.9.1 獲取、P#include #include #include main(void)pr() );pr() );return 0;f( P= %dn, getpf( = %dn, get1.9.2 獲取PGID、EUID功能:獲取指定進(jìn)程的進(jìn)程組號(hào),參數(shù)為指

5、定的進(jìn)程號(hào)。功能:獲取當(dāng)前進(jìn)程的進(jìn)程有效用戶(hù)號(hào)。EUID用于權(quán)限檢查。獲取EUID:uid_t geteuid(void)獲取PGID:_t getpgid(_t)1.9.3 進(jìn)程的創(chuàng)建fork_tfork(void)功能:創(chuàng)建程。fork的奇妙之處在于它被調(diào)用一次,卻返回兩次。它有三種不同的返回值:在父進(jìn)程中,fork返回新創(chuàng)建的程的;程中,fork返回0;在如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值。1.9.3 進(jìn)程的創(chuàng)建fork#include #include main()_t;/*此時(shí)僅有一個(gè)進(jìn)程*/=fork();/*此時(shí)已經(jīng)有兩個(gè)進(jìn)程在同時(shí)運(yùn)行*/ if(0)prf(error in f

6、ork!); else if(=0)prf(I am the child pros, ID is %dn,get();elseprf(I am the parent pros,ID is %dn,get();執(zhí)行后的結(jié)果?1.9.3 進(jìn)程的創(chuàng)建fork在=fork()之前,只有1個(gè)進(jìn)程在執(zhí)行,但在這條語(yǔ)句執(zhí)行 之后,就變成2個(gè)進(jìn)程在執(zhí)行。這兩個(gè)進(jìn)程的代碼部分完全相同,將要執(zhí)行的下一條語(yǔ)句都是if(=0)。兩個(gè)進(jìn)程中,原先就存在的那個(gè)進(jìn)程被稱(chēng)作“父進(jìn)程”,新出現(xiàn)的那個(gè)進(jìn)程被稱(chēng)作“程的區(qū)別在于進(jìn)程標(biāo)識(shí)符()不同。程”,父$./fork_testI am the parent pros, my pr

7、os ID is 1991 I am the child pros, my pros ID is 19921.9.3 進(jìn)程的創(chuàng)建fork#include #include main(void)思考執(zhí)行結(jié)果 ?_t;count=0;= fork(); f( This isf( This isprprtime,second time,= %dn,= %dn,););count+;prif (f(count =0 )%dn, count);pr else ifpr elseprf( !f(This)Thisis parent pros,the childhasthd:%dn,);is the chi

8、ld pros.n);f(forkfailed.n);prprf(f(This is third time,This is fouth time,=%dn,%dn,););return 0;1.9.3 進(jìn)程的創(chuàng)建fork問(wèn)題:為何count+執(zhí)行了兩次,第2次打印count卻為1?This istime,= 0This is second time,= 0count = 1This is the child pros.This is third time,= 0= 0= 3512This is fouth time,This istime,This is second time,= 3512c

9、ount = 1This is the parent pros,the child has:3512This is third time,This is fouth time,= 3512= 35121.9.3 進(jìn)程的創(chuàng)建fork分析:父進(jìn)程的數(shù)據(jù)空間、堆棧空間都會(huì)給程一個(gè)拷貝,而不是共享這些內(nèi)存。在程中對(duì)count進(jìn)行自加1的操作,但是并沒(méi)有影響到父進(jìn)程中的count值,父進(jìn)程中的count值仍然為0。1.9.4 進(jìn)程創(chuàng)建fork練習(xí)程 6714程 6713主進(jìn)程 6712fork()fork()程 6715fork()i=1 Ok:3i=0i=1 Ok:4i=0i=1 Ok:2i=1 Ok

10、:1 分析程序getpgid.c1.9.5 進(jìn)程對(duì)打開(kāi)文件的處理程對(duì)文件描述符的文件表項(xiàng)信息(文件讀寫(xiě)位置)是共享使父用的。創(chuàng)建程后,父程對(duì)打開(kāi)文件的處理方式如下所示:父進(jìn)程信息task _struct打開(kāi)文件列表file_struct打開(kāi)的文件struct file管道的讀端程信息task_struct打開(kāi)文件列表file_structfd1=0fd2=1fd3=2fd4=3文件讀寫(xiě)位置文件 v節(jié)點(diǎn)位置filesV節(jié)點(diǎn)信息I 節(jié)點(diǎn)信息打開(kāi)的mode操作指針fd1=0fd2=1 fd3=2fd4=3files1.9.6 進(jìn)程對(duì)打開(kāi)文件處理練習(xí) 分析程序fork_descriptor.c1.9.

11、7 進(jìn)程的創(chuàng)建vfork_tvfork(void)功能:創(chuàng)建程。fork與vfork區(qū)別:fork要拷貝父進(jìn)程的數(shù)據(jù)段;而vfork則不需要完全拷貝父進(jìn)程的數(shù)據(jù)段,程與父進(jìn)程共享數(shù)據(jù)段。fork不對(duì)父程的執(zhí)行次序進(jìn)行任何限制;而在vfork調(diào)用中,程先運(yùn)行,父進(jìn)程掛起。1.9.7 進(jìn)程的創(chuàng)建vfork#include#include #includemain()count = 1; child;f(“Before createprson, the fathers count is:%dn”, count);if(!(child = vfork()prf(This is son, hisis:

12、%d andthe count is:%dn,get(), +count);exit(1);else pr the count is: %d,f(After son, This isfather, hisis: %d and count, child);nd the childis: %dn, get(1.9.8 在子函數(shù)中調(diào)用vfork時(shí)間調(diào)用test函數(shù)調(diào)用fun函數(shù)調(diào)用main函數(shù)調(diào)用main函數(shù)棧 增 長(zhǎng) 方 向局部變量空間主程序調(diào)用后返回地址主程序參數(shù)局部變量空間主程序調(diào)用后返回地址主程序參數(shù)局部變量空間fun函數(shù)調(diào)用后返回地址fun函數(shù)參數(shù)局部變量空間test函數(shù)調(diào)用后返回地址te

13、st函數(shù)參數(shù) 編譯vfork_return.c后執(zhí)行程序,并分析結(jié)果。1.9.8 exec函數(shù)族e(cuò)xeclp(constchar*file,constchar*arg,)#include main()execlp(”ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);功能:從PATH環(huán)境變量所指的目錄中查找符合參數(shù)file的文件名,找到后便執(zhí)行該文件,然后將第二個(gè)以后的參數(shù)當(dāng)做該文件的argv0、 argv1,最后一個(gè)參數(shù)必須用空指針(NULL)作結(jié)束。1.9.8 exec函數(shù)族fork與exec函數(shù)族的區(qū)別:fork創(chuàng)建一個(gè)新的進(jìn)程,產(chǎn)生一個(gè)新的。exec啟動(dòng)一個(gè)

14、新程序,替換原有的進(jìn)程,因此進(jìn)程的不會(huì)改變,和調(diào)用exec函數(shù)的進(jìn)程試分析:execlp.c一樣。exec函數(shù)族的作用是根據(jù)指定的文件名找到可執(zhí)行文件,并用它來(lái)取代調(diào)用進(jìn)程的內(nèi)容。1.9.8 exec函數(shù)族e(cuò)xecl(constchar*path,constchar*arg,.)#include main()if(=fork()=0)execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);elseprf(“father ok!n”);功能:運(yùn)行參數(shù)path所指定的可執(zhí)行文件,接下來(lái)的參數(shù)代表執(zhí)行該文件時(shí)傳遞過(guò)去的argv0、argv1,最后一個(gè)

15、參數(shù)必須用空指針 (NULL)作結(jié)束。1.9.8 exec函數(shù)族e(cuò)xecv(constchar*path,char*constargv)#include main()char * argv =“l(fā)s”,”-al”,”/etc/passwd”,(char*)0; execv(“/bin/ls”,argv);功能:執(zhí)行參數(shù)path所指定的文件,與execl()不同的地方在于它只需兩個(gè)參數(shù),第二個(gè)參數(shù)利用指針數(shù)組來(lái)傳遞給執(zhí)行文件。1.9.9 system函數(shù)system(constchar*string )功能:system函數(shù)調(diào)用fork()產(chǎn)生程來(lái)調(diào)用/bin/sh - 程,由cstring來(lái)執(zhí)

16、行參數(shù)string字符串所代表令,直到程結(jié)束后才繼續(xù)運(yùn)行父進(jìn)程。include main()system(“l(fā)s -al /etc/passwd/shadow”);1.9.10 exec對(duì)打開(kāi)文件的處理 編譯及 ewcode.c后執(zhí)行程序exec,并觀(guān)察結(jié)果。執(zhí)行exec函數(shù)時(shí),并不關(guān)閉原來(lái)的文件描述符。1.9.11 進(jìn)程等待功能:進(jìn)程一旦調(diào)用了wait,就立即阻塞自己,直到自己的某個(gè)程退 出,如果沒(méi)有找到這樣一個(gè)程,wait就會(huì)一直阻塞在這里,直到有一個(gè)出現(xiàn)為止。參數(shù):sus用來(lái)保存被收集進(jìn)程退出時(shí)的狀態(tài),一般設(shè)為NULL。返回:如果成功,wait會(huì)返回被收集的程的進(jìn)程ID。_t wait

17、(* sus)1.9.11 進(jìn)程等待#include #include #include #include main()_t pc,pr; pc=fork();if(pc0時(shí),只等待進(jìn)程ID等于的程,不管其它已經(jīng)有多少子程還沒(méi)有結(jié)束,wait進(jìn)程運(yùn)行結(jié)束退出了,只要指定的就會(huì)一直等下去。=-1時(shí),等待任何一個(gè)的作用一模一樣。程退出,沒(méi)有任何限制,此時(shí)和wait2.=0時(shí),等待同一個(gè)進(jìn)程組中的任何-1時(shí),等待一個(gè)指定進(jìn)程組中的任何的絕對(duì)值。程。程,這個(gè)進(jìn)程組的ID等3.4.于參數(shù)option可以為0或下面的OR組合:WNOHANG:若指定的程沒(méi)有結(jié)束,則wait()函數(shù)返回0,不程的ID。予以等待。若結(jié)束,則返回該WUNTRACED:如果程進(jìn)入暫停執(zhí)行情況則馬上返回。1.9.12 進(jìn)程退出exit/_exit與return的區(qū)別?_exit的作用:直接使進(jìn)程停止運(yùn)行,清除其使用的內(nèi)存空間,并清除其在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)。exit與_exit函數(shù)不同,使進(jìn)程停止運(yùn)行之前要檢查文件打開(kāi)情況,并把文件緩沖區(qū)的內(nèi)容寫(xiě)回文件中去之后才停止進(jìn)程。void exit()、void _exit()1.9.13 孤兒進(jìn)程程被init收養(yǎng)的進(jìn)程為孤兒進(jìn)程。#include #include #include main();if(=fork()=-1)perro

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論