




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上廣州大學學生實驗報告開課學院及實驗室:計算機科學與工程實驗室 2015 年 11月29 日實驗課程名稱操作系統(tǒng)實驗成績實驗項目名稱實驗1 進程管理實驗指導老師一、實驗目的1、掌握進程的概念,明確進程的含義2、認識并了解并發(fā)執(zhí)行的實質(zhì)3、加深對進程概念的理解,明確進程和程序的區(qū)別 4、分析進程爭用資源的現(xiàn)象,學習解決進程互斥的方法5、 了解Linux/windows系統(tǒng)中進程通信的基本原理6、 熟悉LINUX系統(tǒng)中進程之間軟中斷通信的基本原理7、 熟悉UNIX/LINUX支持的管道通信方式8、 熟悉消息傳送的機理9、 了解和熟悉共享存儲機制2、 實驗內(nèi)容 1、編寫一段程
2、序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個子進程。當此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示a,子進程分別顯示字符b和字符c。試觀察記錄屏幕上的顯示結果,并分析原因。 2、修改上述程序,每一個進程循環(huán)顯示一句話。子進程顯示daughter 及son ,父進程顯示 parent ,觀察結果,分析原因。 3、用fork( )創(chuàng)建一個進程,再調(diào)用exec( )用新的程序替換該子進程的內(nèi)容,利用wait( )來控制進程執(zhí)行順序。 4、修改實驗代碼2中的程序,用lockf( )來給每一個進程加鎖,以實現(xiàn)進程之間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。 5、寫一個
3、使用守護進程(daemon)的程序,來實現(xiàn):(1) 創(chuàng)建一個日志文件/var/log/Mydaemon.log (2)每5秒都向其中寫入一個時間戳(使用time_t的格式) 注意:要root權限才能在/var/log創(chuàng)建文件。 6、(1)編寫程序:用fork( )創(chuàng)建兩個子進程,再用系統(tǒng)調(diào)用signal( )讓父進程捕捉鍵盤上來的中斷信號(即按c鍵);捕捉到中斷信號后,父進程用系統(tǒng)調(diào)用kill( )向兩個子進程發(fā)出信號,子進程捕捉到信號后分別輸出下列信息后終止:Child process1 is killed by parent!Child process2 is killed by pare
4、nt!父進程等待兩個子進程終止后,輸出如下的信息后終止:Parent process is killed! (2)分析利用軟中斷通信實現(xiàn)進程同步的機理 7、編寫程序?qū)崿F(xiàn)進程的管道通信。用系統(tǒng)調(diào)用pipe( )建立一管道,二個子進程P1和P2分別向管道各寫一句話: Child 1 is sending a message! Child 2 is sending a message!父進程從管道中讀出二個來自子進程的信息并顯示(要求先接收P1,后P2)。 8、消息的創(chuàng)建、發(fā)送和接收。使用系統(tǒng)調(diào)用msgget( ),msgsnd( ),msgrev( ),及msgctl( )編制一長度為k的消息發(fā)送
5、和接收的程序。 9、編制一長度為1k的共享存儲區(qū)發(fā)送和接收的程序。3、 實驗原理 1、進程創(chuàng)建 2、進程控制 3、信號量機制 4、管道機制 5、消息通信機制及共享存儲區(qū)機制。四、實驗設備 Win7下虛擬機VMware-workstation-11.0.0及CentOS-5.8-i3865、 實驗要求 調(diào)試并運行一個允許n個進程并發(fā)運行的進程管理模擬系統(tǒng)。了解該系統(tǒng)的進程控制、同步及通訊機構,每個進程如何用一個PCB表示、其內(nèi)容的設置;各進程間的同步關系;系統(tǒng)在運行過程中顯示各進程的狀態(tài)和有關參數(shù)變化情況的意義。六、實驗程序1、進程創(chuàng)建#include main( )int p1,p2;whil
6、e(p1=fork( )= -1); /*創(chuàng)建子進程p1*/if (p1=0) putchar(b); else while(p2=fork( )= -1); /*創(chuàng)建子進程p2*/if(p2=0) putchar(c); else putchar(a); 2、進程管理#include main( )int p1,p2,i;while(p1=fork( )= -1); /*創(chuàng)建子進程p1*/if (p1=0) for(i=0;i10;i+)printf(daughter %dn,i);else while(p2=fork( )= -1); /*創(chuàng)建子進程p2*/if(p2=0) for(i=0
7、;i10;i+) printf(son %dn,i);else for(i=0;i10;i+) printf(parent %dn,i); 3、進程控制#include#includemain( ) int pid; pid=fork( ); /*創(chuàng)建子進程*/switch(pid) case -1: /*創(chuàng)建失敗*/ printf(fork fail!n); exit(1); case 0: /*子進程*/ execl(/bin/ls,ls,-1,-color,NULL); printf(exec fail!n); exit(1); default: /*父進程*/ wait(NULL);
8、/*同步*/ printf(ls completed !n); exit(0); 4、進程互斥#include #include main()int p1,p2,i; while(p1=fork( )= = -1); /*創(chuàng)建子進程p1*/if (p1= =0)lockf(1,1,0); /*加鎖,這里第一個參數(shù)為stdout(標準輸出設備的描述符)*/for(i=0;i10;i+) printf(daughter %dn,i); lockf(1,0,0); /*解鎖*/else while(p2=fork( )= =-1); /*創(chuàng)建子進程p2*/if (p2= =0)lockf(1,1,0
9、); /*加鎖*/for(i=0;i10;i+)printf(son %dn,i);lockf(1,0,0); /*解鎖*/else lockf(1,1,0); /*加鎖*/ for(i=0;i10;i+) printf( parent %dn,i); lockf(1,0,0); /*解鎖*/5、守護進程#include #include #include #include main()time_t t; /建立time_t格式變量 FILE *fp; /建立文件 fp=fopen(/var/log/Mydaemon.log,a);/打開文件 pid_t pid; /守護神 pid=fork(
10、); if(pid0) printf(Daemon on duty!n); exit(0); else if(pid=0) sleep(5); /等待5秒再往文件中寫入時間戳 printf(Daemon on duty!n); t=time(0); fprintf(fp,The current time is %sn,asctime(localtime(&t); fclose(fp);/關閉文件6、信號通信機制#include #include #include void waiting( ),stop( );int wait_mark;main( )int p1,p2,stdout;whil
11、e(p1=fork( )= =-1); /*創(chuàng)建子進程p1*/if (p10) while(p2=fork( )= =-1); /*創(chuàng)建子進程p2*/if(p20) wait_mark=1;signal(SIGINT,stop); /*接收到c信號,轉(zhuǎn)stop*/waiting( );kill(p1,16); /*向p1發(fā)軟中斷信號16*/kill(p2,17); /*向p2發(fā)軟中斷信號17*/wait(0); /*同步*/wait(0);printf(Parent process is killed!n);exit(0); else wait_mark=1;signal(17,stop);
12、/*接收到軟中斷信號17,轉(zhuǎn)stop*/waiting( );lockf(stdout,1,0);printf(Child process 2 is killed by parent!n);lockf(stdout,0,0);exit(0);elsewait_mark=1;signal(16,stop); /*接收到軟中斷信號16,轉(zhuǎn)stop*/waiting( );lockf(stdout,1,0);printf(Child process 1 is killed by parent!n);lockf(stdout,0,0);exit(0); void waiting( ) while(wa
13、it_mark!=0);void stop( )wait_mark=0;7、進程的管道通信#include #include #include int pid1,pid2; main( ) int fd2;char outpipe100,inpipe100;pipe(fd); /*創(chuàng)建一個管道*/while (pid1=fork( )= =-1);if(pid1= =0) lockf(fd1,1,0); sprintf(outpipe,child 1 process is sending message!); /*把串放入數(shù)組outpipe中*/ write(fd1,outpipe,50);
14、/*向管道寫長為50字節(jié)的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd1,0,0); exit(0); else while(pid2=fork( )= =-1); if(pid2= =0) lockf(fd1,1,0); /*互斥*/ sprintf(outpipe,child 2 process is sending message!); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else wait(0); /*同步*/ read(fd0,inpipe,50); /*從管道中讀長為50字節(jié)的串*
15、/ printf(%sn,inpipe); wait(0); read(fd0,inpipe,50); printf(%sn,inpipe); exit(0); 8、 客戶端服務端消息的發(fā)送與接收1)、client.c#include #include #include #define MSGKEY 75struct msgform long mtype; char mtext1000;msg;int msgqid;void client() int i;msgqid=msgget(MSGKEY,0777); /*打開75#消息隊列*/for(i=10;i=1;i-) msg.mtype=i;
16、printf(“(client)sentn”);msgsnd(msgqid,&msg,1024,0); /*發(fā)送消息*/exit(0);main( ) client( );2)、server.c#include #include #include #define MSGKEY 75struct msgform long mtype; char mtext1000;msg;int msgqid;void server( ) msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*創(chuàng)建75#消息隊列*/do msgrcv(msgqid,&msg,1030,0,0); /*接
17、收消息*/ printf(“(server)receivedn”);while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0); /*刪除消息隊列,歸還資源*/exit(0);main( ) server( );9、共享存儲區(qū)通信#include #include #include #define SHMKEY 75int shmid,i; int *addr;void client( ) int i; shmid=shmget(SHMKEY,1024,0777); /*打開共享存儲區(qū)*/addr=shmat(shmid,0,0); /*獲得共享存儲區(qū)首地址*/
18、for (i=9;i=0;i-) while (*addr!=-1); printf(client) sentn); *addr=i; exit(0);void server( )shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*創(chuàng)建共享存儲區(qū)*/addr=shmat(shmid,0,0); /*獲取首地址*/do *addr=-1; while (*addr=-1); printf(server) receivedn);while (*addr);shmctl(shmid,IPC_RMID,0); /*撤消共享存儲區(qū),歸還資源*/exit(0);main
19、( ) while (i=fork( )= =-1); if (!i) server( ); system(“ipcs -m”); while (i=fork( )= =-1); if (!i) client( ); wait(0); wait(0);7、 總結心得(1) 實驗分析:1、進程創(chuàng)建進程的創(chuàng)建運行結果bca(有時會出現(xiàn)bac)分析:從進程執(zhí)行并發(fā)來看,輸出bac,acb等情況都有可能。原因:fork()創(chuàng)建進程所需的時間多于輸出一個字符的時間,因此在主進程創(chuàng)建進程2的同時,進程1就輸出了“b”,而進程2和主程序的輸出次序是有隨機性的,所以會出現(xiàn)上述結果2、進程管理進程的管理運行結果
20、parentsondaughterdaughter或parentsonparentdaughter等第一種運行結果第二種運行結果分析:由于函數(shù)printf()輸出的字符串之間不會被中斷,因此,字符串內(nèi)部的字符順序輸出時不變。但是,由于進程并發(fā)執(zhí)行時的調(diào)度順序和父子進程的搶占處理機問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結果相同。思考題:(1)系統(tǒng)是怎樣創(chuàng)建進程的?答:一旦操作系統(tǒng)發(fā)現(xiàn)了要求創(chuàng)建新進程的事件后,便調(diào)用進程創(chuàng)建原語Creat()按下述步驟創(chuàng)建一個新進程。1)申請空白PCB。為新進程申請獲得唯一的數(shù)字標識符,并從PCB集合中索取一個空白PCB2)為新進程
21、分配資源。為新進程的程序和數(shù)據(jù)以及用戶棧分配必要的內(nèi)存空間。3)初始化進程控制塊。包括:初始化標識信息,處理機狀態(tài)信息,處理機狀態(tài)控制信息。4)將新進程插入就緒隊列,如果進程就緒隊列能夠接納新進程,便將新進程插入到就緒隊列中。(2)當首次調(diào)用新創(chuàng)建進程時,其入口在哪里?答:fork系統(tǒng)調(diào)用創(chuàng)建的子進程繼承了原進程的context,也就是說fork調(diào)用成功后,子進程與父進程并發(fā)執(zhí)行相同的代碼。但由于子進程也繼承了父進程的程序指針,所以子進程是從fork()后的語句開始執(zhí)行(也就是新進程調(diào)用的入口)。另外fork在子進程和父進程中的返回值是不同的。在父進程中返回子進程的PID,而在子進程中返回0。
22、所以可以在程序中檢查PID的值,使父進程和子進程執(zhí)行不同的分支。 3、進程控制運行結果:執(zhí)行命令ls -l -color ,(按倒序)列出當前目錄下所有文件和子目錄;ls completed!分析:程序在調(diào)用fork( )建立一個子進程后,馬上調(diào)用wait( ),使父進程在子進程結束之前,一直處于睡眠狀態(tài)。子進程用exec( )裝入命令ls ,exec( )后,子進程的代碼被ls的代碼取代,這時子進程的PC指向ls的第1條語句,開始執(zhí)行l(wèi)s的命令代碼。注意在這里wait( )給我們提供了一種實現(xiàn)進程同步的簡單方法。思考題:(1)可執(zhí)行文件加載時進行了哪些處理?答:初始化,開辟內(nèi)存,顯示窗口是后
23、期可選工作。每個程序,任何一個程序,任何一個可執(zhí)行文件,啟動運行時都要調(diào)用Ntdll.dll中的NtCreateProcess()。將源代碼轉(zhuǎn)換為機器可認識代碼的過程。編譯程序讀取源程序(字符流),對之進行詞法和語法的分析,將高級語言指令轉(zhuǎn)換為功能等效的匯編代碼,再由匯編程序轉(zhuǎn)換為機器語言,并且按照操作系統(tǒng)對可執(zhí)行文件格式的要求鏈接生成可執(zhí)行程序。具體經(jīng)過下幾個處理:例如:C源程序編譯預處理編譯優(yōu)化程序匯編程序鏈接程序可執(zhí)行文件(2)什么是進程同步?wait( )是如何實現(xiàn)進程同步的?1)我們把異步環(huán)境下的一組并發(fā)進程因直接制約而互相發(fā)送消息而進行互相合作、互相等待,使得各進程按一定的速度執(zhí)行
24、的過程稱為進程間的同步。進程同步是進程之間直接的相互作用,是合作進程間有意識的行為。2)如果我們對一個消息或事件賦以唯一的消息名,則我們可用過程wait(消息名)表示進程等待合作進程發(fā)來的消息。這樣,wait()就實現(xiàn)了進程間的同步。4、進程互斥運行結果:parentsondaughterdaughter或parentsonparentdaughter等第一種可能的運行結果第二種可能運行結果分析:上鎖后與未上鎖的輸出結果相同,也是隨著執(zhí)行時間不同,輸出結果的順序有所不同。因為上述程序執(zhí)行時,不同進程之間不存在共享臨界資源(其中打印機的互斥性已有由操作系統(tǒng)保證)問題,所以,加鎖與不加鎖效果相同。
25、5、守護進程運行結果: 創(chuàng)建一個日志文件/var/log/Mydaemon.log ,每5秒就向其中寫入一個時間戳(使用time_t的格式) 運行程序5秒之后可以看到6、信號通信機制運行結果:執(zhí)行程序屏幕無反應按下Ctrl+C后,屏幕顯示 Parent process is killed!分析:上述程序中,signal( )都放在一段程序的前面部位,而不是在其他接收信號處。這是因為signal( )的執(zhí)行只是為進程指定信號值16或17的作用,以及分配相應的與stop( )過程鏈接的指針。因而,signal( )函數(shù)必須在程序前面部分執(zhí)行。本方法通信效率低,當通信數(shù)據(jù)量較大時一般不用此法。思考題
26、:1、該程序段前面部分用了兩個wait(0),它們起什么作用?該程序段前面部分用了兩個wait(0),這是因為父進程必須等待兩個子進程終止后才終。wait()函數(shù)常用來控制父進程與子進程的同步。在父進程中調(diào)用wait()函數(shù),則父進程被阻塞。進入等待隊列,等待子進程結束。當子進程結束時,會產(chǎn)生一個終止狀態(tài)字,系統(tǒng)會向父進程發(fā)出SIGCHLD信號。當接到信號后,父進程提取子進程的終止狀態(tài)字,從wait()返回繼續(xù)執(zhí)行原程序。2、該程序段中每個進程退出時都用了語句exit(0),為什么?該程序中每個進程退出時都用了語句exit(0),這是進程的正常終止。在正常終止時,exit()函數(shù)返回進程結束狀
27、態(tài)。異常終止時,則由系統(tǒng)內(nèi)核產(chǎn)生一個代表異常終止原因的終止狀態(tài),該進程的父進程都能用wait()得到其終止狀態(tài)。在子進程調(diào)用exit()后,子進程的結束狀態(tài)會返回給系統(tǒng)內(nèi)核,由內(nèi)核根據(jù)狀態(tài)字生成終止狀態(tài),供父進程在wait()中讀取數(shù)據(jù)。若子進程結束后,父進程還沒有讀取子進程的終止狀態(tài),則系統(tǒng)就子進程的終止狀態(tài)置為“ZOMBIE”并保留子進程的進程控制塊等信息,等父進程讀取信息后,系統(tǒng)才徹底釋放子進程的進程控制塊。若父進程在子進程結束之前就結束的話,則子進程就變成了“孤兒進程”,系統(tǒng)進程init會自動“收養(yǎng)”該子進程,成為該子進程的父進程即父進程標識號變?yōu)?,當子進程結束時,init會自動調(diào)用
28、wait()讀取子進程的遺留數(shù)據(jù),從而避免系統(tǒng)中留下大量的垃圾。3、為何預期的結果并未顯示出?p1、p2都會捕捉該中斷信號。對于父進程,當它捕捉到中斷信號后就會轉(zhuǎn)向程序中指定的函數(shù)“stop()”,當“stop()”執(zhí)行 完畢后,父進程被喚醒,從中斷處繼續(xù)運行。對于子進程,由于沒有給它們指定收到中斷信號后的動作,它們會在捕捉到中斷信號后執(zhí)行默認操作,即結束自己。所以當我們發(fā)出中斷信號后,父進程按預計方式正常執(zhí)行,而p1、p2就被自己結束了,從而也就不會有預計的結果了。4、程序該如何修改才能得到正確結果? 為了使程序運行得到正確的結果,可以在每個子進程程序段開頭加上忽略“C”中斷信號的語句,即:
29、signal(SIGINT,SIG_IGN)。#include #include #include #include void waiting(),stop();int wait_mark;int main() int p1,p2,stdout; while(p1=fork()=-1); /*創(chuàng)建子進程p1*/ if (p10) while(p2=fork()=-1); /*創(chuàng)建子進程p2*/ if(p20) wait_mark=1; signal(SIGINT,stop); /*接收到c信號,轉(zhuǎn)stop*/ waiting(); kill(p1,16); /*向p1發(fā)軟中斷信號16*/ ki
30、ll(p2,17); /*向p2發(fā)軟中斷信號17*/ wait(0); /*同步*/ wait(0); printf(Parent process is killed!n); exit(0); else signal(SIGINT,SIG_IGN); wait_mark=1; signal(17,stop); /*接收到軟中斷信號17,轉(zhuǎn)stop*/ waiting(); lockf(stdout,1,0); printf(Child process 2 is killed by parent!n); lockf(stdout,0,0); exit(0); else signal(SIGINT,SIG_IGN); wait_mark=1; signal(16,stop); /*接收到軟中斷信號16,轉(zhuǎn)stop*/ waiting(); lockf(stdout,1,0); printf(Child process 1 is killed by parent!n); lockf(stdout,0,0); exit(0); void waiting() while(wait_mark!=0);void stop() wait_mark=0;7、進程的管道通信運行結果:執(zhí)行程序剛開始屏幕無反應延遲5秒后顯示child 1 proces
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 珍珠巖保溫板施工方案
- 挑腳手架施工方案
- 氟碳油漆施工方案
- 紫藤架修復施工方案
- 2025年度智能工廠用工承包協(xié)議書
- 二零二五年度醫(yī)院員工食堂運營管理協(xié)議
- 2025年度終止運輸合同書面通知樣本
- 2025年度物流運輸企業(yè)司機派遣合同模版
- 2025年餐飲行業(yè)臨時工福利待遇保障協(xié)議
- 2025年度智慧停車場委托管理及運營服務協(xié)議書
- 2025年湖南水利水電職業(yè)技術學院單招職業(yè)技能測試題庫參考答案
- (部編版2025新教材)道德與法治一年級下冊-第1課《有個新目標》課件
- 中央2025年中國科協(xié)所屬單位招聘社會在職人員14人筆試歷年參考題庫附帶答案詳解-1
- 2024年湖北省聯(lián)合發(fā)展投資集團有限公司人員招聘考試題庫及答案解析
- 造價咨詢服務方案進度計劃安排及保證措施
- 2024年全國統(tǒng)一高考英語試卷(新課標Ⅰ卷)含答案
- 2024年認證行業(yè)法律法規(guī)及認證基礎知識 CCAA年度確認 試題與答案
- 2024年濰坊工程職業(yè)學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 處方模板完整
- T∕ACSC 01-2022 輔助生殖醫(yī)學中心建設標準(高清最新版)
- 好段摘抄300字 描寫桃花的優(yōu)美句子.doc
評論
0/150
提交評論