操作系統(tǒng)實(shí)驗(yàn)-實(shí)驗(yàn)1分析_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)-實(shí)驗(yàn)1分析_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)-實(shí)驗(yàn)1分析_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)-實(shí)驗(yàn)1分析_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)-實(shí)驗(yàn)1分析_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

廣州大學(xué)學(xué)生實(shí)驗(yàn)報(bào)告開(kāi)課學(xué)院及實(shí)驗(yàn)室:計(jì)算機(jī)科學(xué)與工程實(shí)驗(yàn)室2015年11月10日實(shí)驗(yàn)課程名稱操作系統(tǒng)實(shí)驗(yàn)成績(jī)實(shí)驗(yàn)項(xiàng)目名稱進(jìn)程管理與進(jìn)程通信指導(dǎo)老師(***報(bào)告只能為文字和圖片,老師評(píng)語(yǔ)將添加到此處,學(xué)生請(qǐng)勿作答***)1、實(shí)驗(yàn)?zāi)康?.1、掌握進(jìn)程的概念,明確進(jìn)程的含義1.2、認(rèn)識(shí)并了解并發(fā)執(zhí)行的實(shí)質(zhì)2.1、掌握進(jìn)程另外的創(chuàng)建方法2.2、熟悉進(jìn)程的睡眠、同步、撤消等進(jìn)程控制方法3.1、進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)3.2、分析進(jìn)程競(jìng)爭(zhēng)資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法4.1、了解守護(hù)進(jìn)程5.1、了解什么是信號(hào)5.2、INUX系統(tǒng)中進(jìn)程之間軟中斷通信的基本原理6.1、了解什么是管道6.2、熟悉UNIX/LINUX支持的管道通信方式7.1、了解什么是消息7.2、熟悉消息傳送的機(jī)理8.1、了解和熟悉共享存儲(chǔ)機(jī)制二、實(shí)驗(yàn)內(nèi)容1.1、編寫(xiě)一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示'a',子進(jìn)程分別顯示字符'b'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。1.2、修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示daughter...'及'son',父進(jìn)程顯示'parent',觀察結(jié)果,分析原因。2.1、用fork()創(chuàng)建一個(gè)進(jìn)程,再調(diào)用exec()用新的程序替換該子進(jìn)程的內(nèi)容2.2、利用wait()來(lái)控制進(jìn)程執(zhí)行順序3.1、修改實(shí)驗(yàn)(一)中的程序2,用lockf()來(lái)給每一個(gè)進(jìn)程加鎖,以實(shí)現(xiàn)進(jìn)程之間的互斥3.2、觀察并分析出現(xiàn)的現(xiàn)象4.1、寫(xiě)一個(gè)使用守護(hù)進(jìn)程(daemon)的程序,來(lái)實(shí)現(xiàn):創(chuàng)建一個(gè)日志文件/var/log/Mydaemon.log;每分鐘都向其中寫(xiě)入一個(gè)時(shí)間戳(使用time_t的格式);5.1、用fork()創(chuàng)建兩個(gè)子進(jìn)程,再用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤(pán)上來(lái)的中斷信號(hào)(即按七鍵);捕捉到中斷信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號(hào),子進(jìn)程捕捉到信號(hào)后分別輸出下列信息后終止:Childprocess1iskilledbyparent!Childprocess2iskilledbyparent!父進(jìn)程等待兩個(gè)子進(jìn)程終止后,輸出如下的信息后終止:Parentprocessiskilled!5.2、用軟中斷通信實(shí)現(xiàn)進(jìn)程同步的機(jī)理6.1、編寫(xiě)程序?qū)崿F(xiàn)進(jìn)程的管道通信。用系統(tǒng)調(diào)用pipe()建立一管道,二個(gè)子進(jìn)程P1和P2分別向管道各寫(xiě)一句話:Child1issendingamessage!Child2issendingamessage!父進(jìn)程從管道中讀出二個(gè)來(lái)自子進(jìn)程的信息并顯示(要求先接收P1,后P2)。7.1、消息的創(chuàng)建、發(fā)送和接收。使用系統(tǒng)調(diào)用msgget(),msgsnd(),msgrev(),及msgctl()編制一長(zhǎng)度為1k的消息發(fā)送和接收的程序。8.1、編制一長(zhǎng)度為1k的共享存儲(chǔ)區(qū)發(fā)送和接收的程序。三、實(shí)驗(yàn)原理1、程既是一個(gè)獨(dú)立擁有資源的基本單位,又是一個(gè)獨(dú)立調(diào)度的基本單位。一個(gè)進(jìn)程實(shí)體由若干個(gè)區(qū)(段)組成,包括程序區(qū)、數(shù)據(jù)區(qū)、棧區(qū)、共享存儲(chǔ)區(qū)等。每個(gè)區(qū)又分為若干頁(yè),每個(gè)進(jìn)程配置有唯一的進(jìn)程控制塊PCB,用于控制和管理進(jìn)程。2、進(jìn)程是進(jìn)程映像的執(zhí)行過(guò)程,也就是正在執(zhí)行的進(jìn)程實(shí)體。3、fork()返回值意義如下:0:在子進(jìn)程中,pid變量保存的fork()返回值為0,表示當(dāng)前進(jìn)程是子進(jìn)程。>0:在父進(jìn)程中,pid變量保存的fork()返回值為子進(jìn)程的id值(進(jìn)程唯一標(biāo)識(shí)符)。4、NIX/LINUX中fork()是一個(gè)非常有用的系統(tǒng)調(diào)用,但在UNIX/LINUX中建立進(jìn)程除了fork()之外,也可用與fork()配合使用的exec()。5、lockf(files,function,size)用作鎖定文件的某些段或者整個(gè)文件。6、每個(gè)信號(hào)都對(duì)應(yīng)一個(gè)正整數(shù)常量(稱為signalnumber,即信號(hào)編號(hào)。定義在系統(tǒng)頭文件<signal.h>中),代表同一用戶的諸進(jìn)程之間傳送事先約定的信息的類型,用于通知某進(jìn)程發(fā)生了某異常事件。每個(gè)進(jìn)程在運(yùn)行時(shí),都要通過(guò)信號(hào)機(jī)制來(lái)檢查是否有信號(hào)到達(dá)。若有,便中斷正在執(zhí)行的程序,轉(zhuǎn)向與該信號(hào)相對(duì)應(yīng)的處理程序,以完成對(duì)該事件的處理;處理結(jié)束后再返回到原來(lái)的斷點(diǎn)繼續(xù)執(zhí)行。實(shí)質(zhì)上,信號(hào)機(jī)制是對(duì)中斷機(jī)制的一種模擬,故在早期的UNIX版本中又把它稱為軟中斷。7、信號(hào)的發(fā)送,是指由發(fā)送進(jìn)程把信號(hào)送到指定進(jìn)程的信號(hào)域的某一位上。如果目標(biāo)進(jìn)程正在一個(gè)可被中斷的優(yōu)先級(jí)上睡眠,核心便將它喚醒,發(fā)送進(jìn)程就此結(jié)束。一個(gè)進(jìn)程可能在其信號(hào)域中有多個(gè)位被置位,代表有多種類型的信號(hào)到達(dá),但對(duì)于一類信號(hào),進(jìn)程卻只能記住其中的某一個(gè)。8、當(dāng)一個(gè)進(jìn)程要進(jìn)入或退出一個(gè)低優(yōu)先級(jí)睡眠狀態(tài)時(shí),或一個(gè)進(jìn)程即將從核心態(tài)返回用戶態(tài)時(shí),核心都要檢查該進(jìn)程是否已收到軟中斷。當(dāng)進(jìn)程處于核心態(tài)時(shí),即使收到軟中斷也不予理睬;只有當(dāng)它返回到用戶態(tài)后,才處理軟中斷信號(hào)。9、管道,是指能夠連接一個(gè)寫(xiě)進(jìn)程和一個(gè)讀進(jìn)程的、并允許它們以生產(chǎn)者一消費(fèi)者方式進(jìn)行通信的一個(gè)共享文件,又稱為pipe文件。10、消息機(jī)制允許由一個(gè)進(jìn)程給其它任意的進(jìn)程發(fā)送一個(gè)消息。11、該機(jī)制可使若干進(jìn)程共享主存中的某一個(gè)區(qū)域,且使該區(qū)域出現(xiàn)(映射)在多個(gè)進(jìn)程的虛地址空間中。四、實(shí)驗(yàn)設(shè)備Linux系統(tǒng)五、實(shí)驗(yàn)程序1、創(chuàng)建子進(jìn)程相關(guān)代碼#include<stdio.h>#include<unistd.h>intmain(){intp1,p2;while((p1=fork())==-1);/*創(chuàng)建子進(jìn)程p1*/if(p1==0)putchar('b');else{while((p2=fork())==-1);/*創(chuàng)建子進(jìn)程p2*/if(p2==0)putchar('c');elseputchar('a');}}修改后:#include<stdio.h>#include<unistd.h>intmain(){intp1,p2,i;while((p1=fork())==-1);/*創(chuàng)建子進(jìn)程p1*/if(p1==0)for(i=0;i<10;i++)printf("daughter%d\n",i);else{while((p2=fork())==-1);/*創(chuàng)建子進(jìn)程p2*/if(p2==0)for(i=0;i<10;i++)printf("son%d\n",i);elsefor(i=0;i<10;i++)printf("parent%d\n",i);}}2、exec,wait相關(guān)代碼#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/wait.h>voidmain(){intpid;pid=fork();/*創(chuàng)建子進(jìn)程*/switch(pid){case-1:/*創(chuàng)建失敗*/printf("forkfail!\n");exit(1);case0:/*子進(jìn)程*/execl(”/bin/ls”,”ls”,”-1”,”-color”,NULL);printf("execfail!\n");exit(1);default:/*父進(jìn)程*//*同步*/wait(NULL);printf("lscompleted!\n");default:/*同步*/}3、lockf相關(guān)代碼#include<stdio.h>#include<unistd.h>#include<sys/wait.h>intmain(){intp1,p2,i;while((p1=fork())==-1);/*創(chuàng)建子進(jìn)程p1*/if(p1==0){lockf(1,1,0);/*加鎖,這里第一個(gè)參數(shù)為stdout(標(biāo)準(zhǔn)輸出設(shè)備的描述符)*/for(i=0;i<10;i++)printf("daughter%d\n",i);lockf(1,0,0);/*解鎖*/}else{while((p2=fork())==-1);/*創(chuàng)建子進(jìn)程p2*/if(p2==0){lockf(1,1,0);/*加鎖*/for(i=0;i<10;i++)printf("son%d\n",i);lockf(1,0,0);/*解鎖*/}else{lockf(1,1,0);/*加鎖*/for(i=0;i<10;i++)printf("parent%d\n",i);lockf(1,0,0);/*解鎖*/}}}4、守護(hù)神程序:#include<stdio.h>#include<time.h>#include<stdlib.h>#include<unistd.h>#include<sys/time.h>intmain(){time_tt;FILE*fp;fp=fopen("/var/log/Mydaemon.log","a");pid_tpid;pid=fork();if(pid>0)(printf("Daemononduty!\n");exit(0);}elseif(pid<0)(printf("Can'tfork!\n");exit(-1);}while(1)(if(fp>=0)(sleep(60);printf("Daemononduty!\n");t=time(0);fprintf(fp,"Thecurrenttimeis%s\n”,asctime(localtime(&t)));}}fclose(fp);}5、通信中斷關(guān)代碼#include<stdio.h>#include<stdlib.h>#include<sys/wait.h>#include<signal.h>#include<unistd.h>voidwaiting(),stop();intwait_mark;intmain(){intp1,p2,stdout;while((p1=fork())==-1);/*創(chuàng)建子進(jìn)程p1*/if(p1>0){while((p2=fork())==-1);/*創(chuàng)建子進(jìn)程p2*/if(p2>0){wait_mark=1;signal(SIGINT,stop);/*接收到七信號(hào),轉(zhuǎn)stop*/waiting();kill(p1,16);/*向p1發(fā)軟中斷信號(hào)16*/kill(p2,17);/*向p2發(fā)軟中斷信號(hào)17*/wait(0);/*同步*/wait(0);printf("Parentprocessiskilled!\n");exit(0);}else{wait_mark=1;signal(17,stop);/*接收到軟中斷信號(hào)17,轉(zhuǎn)stop*/waiting();lockf(stdout,1,0);printf("Childprocess2iskilledbyparent!\n");lockf(stdout,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);/*接收到軟中斷信號(hào)16,轉(zhuǎn)stop*/waiting();lockf(stdout,1,0);printf("Childprocess1iskilledbyparent!\n");lockf(stdout,0,0);exit(0);}}voidwaiting(){while(wait_mark!=0);}voidstop(){wait_mark=0;}6、管道相關(guān)代碼:#include<unistd.h>#include<signal.h>#include<stdio.h>#include<stdlib.h>#include<sys/wait.h>intpid1,pid2;intmain(){intfd[2];charoutpipe[100],inpipe[100];pipe(fd);/*創(chuàng)建一個(gè)管道*/while((pid1=fork())==-1);if(pid1==0){lockf(fd[1],1,0);sprintf(outpipe,"child1processissendingmessage!");/*把串放入數(shù)組outpipe中*/write(fd[1],outpipe,50);/*向管道寫(xiě)長(zhǎng)為50字節(jié)的串*/sleep(5);/*自我阻塞5秒*/lockf(fd[1],0,0);exit(0);}else{while((pid2=fork())==-1);if(pid2==0){lockf(fd[1],1,0);/*互斥*/sprintf(outpipe,"child2processissendingmessage!");write(fd[1],outpipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{wait(0);/*同步*/read(fd[0],inpipe,50);/*從管道中讀長(zhǎng)為50字節(jié)的串*/printf("%s\n",inpipe);wait(0);read(fd[0],inpipe,50);printf("%s\n",inpipe);exit(0);}}}7、消息的相關(guān)代碼:lient.c#include<sys/types.h>#include<stdio.h>#include<sys/msg.h>#include<sys/ipc.h>#include<stdlib.h>#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidclient(){inti;msgqid=msgget(MSGKEY,0777);for(i=10;i>=1;i--){msg.mtype=i;printf("(client)sent\n");msgsnd(msgqid,&msg,1024,0);}exit(0);}intmain(){client();}server.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#include<stdio.h>#include<stdlib.h>#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidserver(){msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*創(chuàng)建75#消息隊(duì)列*/do{msgrcv(msgqid,&msg,1030,0,0);/*接收消息*/printf("(server)received\n");}while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*刪除消息隊(duì)列,歸還資源*/exit(0);}intmain(){server();}8、共享存儲(chǔ)機(jī)制的相關(guān)代碼#include<sys/types.h>#include<sys/shm.h>#include<sys/ipc.h>#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<sys/wait.h>#include<signal.h>#defineSHMKEY75#defineSHMSZ128intshmid,i;int*addr;voidclient(){inti;shmid=shmget(SHMKEY,1024,0777);/*打開(kāi)共享存儲(chǔ)區(qū)*/addr=shmat(shmid,0,0);/*獲得共享存儲(chǔ)區(qū)首地址*/for(i=9;i>=0;i--){while(*addr!=-1);printf("(client)sent\n");*addr=i;}exit(0);}voidserver(){shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);/創(chuàng)建共享存儲(chǔ)區(qū)*/addr=shmat(shmid,0,0);/*獲取首地址*/do{*addr=-1;while(*addr==-1);printf("(server)received\n");}while(*addr);shmctl(shmid,IPC_RMID,0);/*撤消共享存儲(chǔ)區(qū),歸還資源*/exit(0);}intmain(){while((i=fork())==-1);if(!i)server();system("ipcs-m");while((i=fork())==-1);if(!i)client();wait(0);wait(0);}六、實(shí)驗(yàn)結(jié)果

實(shí)驗(yàn)1.1bcaroot^localhostJesktap.#./bbc:a.r□□+@1ncalhcistDesk+op.bcaroot^localhostJesktap.#./bbc:a.r□□+@1ncalhcistDesk+op.#./bbca[root?localhostDesktop]ff./bbcaxoot?localhostDesktop;#./bbca'root?localhostDesktop'#./bbacroot^localhostDesktap.#./bbac.r□□+@1ncalhcistDesk+op.#./bbca[root?localhostDesktop]#./bbcaxoot?localhostDesktop;#./bbca'root?localhostDesktop'#./bab[root^localhoEtDesktop]#c./bat[root?localhostDesktop]#c./bBesktop]#./bLesktop]#./bJesktap]#./bDesktop,#./bBesktop]#./bBesktop]#./bLesktop]#./bat[raat^locslhastDesktop]#c.Besktop]#./bLesktop]#./bJesktap]#./bDesktop,#./bBesktop]#./bBesktop]#./bLesktop]#./b本來(lái)從進(jìn)程并發(fā)執(zhí)行來(lái)看,各種情況都有可能。上面的三個(gè)進(jìn)程沒(méi)有同步措施,父進(jìn)程與子進(jìn)程的輸出內(nèi)容會(huì)疊加在一起。輸出次序帶有隨機(jī)性。實(shí)驗(yàn)1.2由實(shí)驗(yàn)1.1可知各種情況都有可能由于函數(shù),而且printf()在輸出字符串時(shí)不會(huì)被中斷,因此,字符串內(nèi)部字符順序輸出不變。但由于進(jìn)程并發(fā)執(zhí)行的調(diào)度順序和父子進(jìn)程搶占處理機(jī)問(wèn)題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結(jié)果相同。實(shí)驗(yàn)2.1~2.2root@ligee-oTe.c:root@l=-ffi./TtotaT84drwxr-xr-x2root4390Mov830149"U-LdeosdrwMr-xr-x2root4396NOVaTemplatesdrwxr-xr-x2root439&NOVa06mmPublicdrwxr-xr-x2root4ageNOVB06mmP±cturesdrwxr-xr-x2root439&NOVB36mmMusic-rwxr-xr-x2root74SONOVaOS111f一rw-r--r--1root753NOVaosme*c—一rw-r--r——3root7BtLNOV日OS:e_cdrwxr-xr-x2root439&NOVs36:49Downloadsdrwxr-xr-x2root439&NOVs06,49Documentsdrwxr-xr-x2rootNovs06149Desktop-r-wxr-xr-x1root7372LNovs37±2Bd—rw-r—r—1root441Novs37i27仁土仁-rwMr-xr-K1root;T37ZNOV8O7:21-rw-r—「—1root;26ZNOVSO7:21ay=-rw-r—「—1irgE矣日NOVSO7:21電-rwxr-xr-x1SQ七262Nov807:17a?-rwxr-xr-K1root26ZNOVsE:17isconoletecJIrOOttjJl:-X*|程序在調(diào)用fork()建立一個(gè)子進(jìn)程后,馬上調(diào)用wait(),使父進(jìn)程在子進(jìn)程結(jié)束之前,一直處于睡眠狀態(tài)。子進(jìn)程用exec()裝入命令ls,exec()后,子進(jìn)程的代碼被ls的代碼取代,這時(shí)子進(jìn)程的PC指向ls的第1條語(yǔ)句,開(kāi)始執(zhí)行l(wèi)s的命令代碼。wait()給我們提供了一種實(shí)現(xiàn)進(jìn)程同步的簡(jiǎn)單方法。實(shí)驗(yàn)3.1~3.2Desiftqizi]W=HZin□123d-DS789rli234日CITIS9-ttL-tL-tslr七七L-t七-t-t七L-tL-tt-玖rL+EL-L-uL-LH-H&L-RL-H-1410"口e名MM*吧eM-£Mppppp[lld.d.d.d.d.d.d..id.加鎖和沒(méi)加鎖還是有區(qū)別的。沒(méi)加鎖,子進(jìn)程的for循環(huán)會(huì)被打斷”,也就是說(shuō),10個(gè)daughter和10個(gè)son會(huì)互相穿插。而加鎖以后,盡管10個(gè)son和10個(gè)daughter會(huì)或先或后出現(xiàn),但是不會(huì)互相穿插,以10個(gè)10個(gè)這樣的完整形式輸出。這是因?yàn)榧渔i以后,屏幕輸出要等解鎖指令發(fā)出后,才會(huì)讓第二個(gè)進(jìn)程執(zhí)行輸出,在第一個(gè)進(jìn)程沒(méi)有解鎖前,其余進(jìn)程不能輸出。實(shí)驗(yàn)4.1終端:gcc-qjfiduty!gcc-qjfiduty!Dae-nonon日志:The£!urrwitttrreisThe£!urrwitttrreisSunNawBIBThecoree*ittineIs鈿由hov布10:16;19神”ThecurrentH*?t?鈿由wov&10:19:1?2615ThecurrenttinsisSunNawB1D:ZO:19Z^15S2A1SThecurrenttineis鈿,havTOC\o"1-5"\h\zThecorrectERmtsSajkihov&10:22:192”ThecurrenttineisSunn岫510:Z3:l?Z915Thecurreflttin=isSunNawB10:24:192€1SThecurreritttne1.5鈿』ho*ThThecurrer>ttinetsSw-hev8】加牯;242巧MPLahTfthTvTjbWdib.BLnJ^Cri1IMSfprintf(fp,"Thecurrenttimeis%s\n”,asctime(localtime(&t)))只是把當(dāng)前時(shí)間輸入到緩沖區(qū),并沒(méi)有寫(xiě)到Mydaemon.log文件里面,所以并不會(huì)輸出時(shí)間。唯有在fprintf最后寫(xiě)上fflush(fp)才能強(qiáng)制輸出時(shí)間戳到Mydaemon.log文件里面。S2A1S實(shí)驗(yàn)5?1~5?2屏幕上無(wú)反應(yīng),按下^C后,顯示Parentprocessiskilled!root@l:~#gcc-oIk.c./IACPorentprocessiskilled!.上述程序中,signal()都放在一段程序的前面部位,而不是在其他接收信號(hào)處。這是因?yàn)閟ignal()的執(zhí)行只是為進(jìn)程指定信號(hào)值16或17的作用,以及分配相應(yīng)的與stop()過(guò)程鏈接的指針。因而,signal()函數(shù)必須在程序前面部分執(zhí)行。實(shí)驗(yàn)6.1roatgl:gcc-opo+crootgl:./pchild2processissendingmessage1child1processissendingmessage1roat@1|

延遲5秒后顯示:child1processissendingmessage!再延遲5秒:child2processissendingmessage!實(shí)驗(yàn)7.1rootgl:-#gccoserverserve「?(:rootgl;-#*/servers2636root@l:~utpcs-qused-bytesmessages00MessageQueueskeymsqtdownerperns0x0000004b9root777root@l;~#*/client(cltent)sent(server)received(client)5ent(serverjrecetvefi(clientJsent(server)received(client^sent(server)received(cltent)sent(server^received(client)sent(竺丁營(yíng)「)「ewI如d應(yīng)當(dāng)是每當(dāng)client發(fā)送一個(gè)消息后,server接收該消息,client再發(fā)送下一條。也就是說(shuō)“(client)sent”和“(server)received”的字樣應(yīng)該在屏幕上交替出現(xiàn)。實(shí)際的結(jié)果大多是,先由client發(fā)送了兩條消息,然后server接收一條消息。此后client>server交替發(fā)送和接收消息。最后server一次接收兩條消息。client和server分別發(fā)送和接收了used-bytesmessages00實(shí)驗(yàn)8.1FOOt01:root@l:~廿gcc-orq.c-/r————SharedMemorysegments-——----keyshnidownerpermsb^tesnattchstatus□XBQ3DCJ0D33Z7G30rQOT60352^2882dest0M00O00O0&360449root60041943^42dest□XBQ30O9B3393218FOOT60352AZE8Z0M00O00O0&root60041943042dest7299^9root7771tcltenr}sent(srrvrr)received(client)sent:(srrvrr)received(client)sent(server)received(client)sentfserver)received(cllen-t)sent(server)received(client)Eent(server^received在運(yùn)行過(guò)程中,發(fā)現(xiàn)每當(dāng)client發(fā)送一次數(shù)據(jù)后,server要等待大約0.1秒才有響應(yīng)。同樣,之后client又需要等待大約0.1秒才發(fā)送下一個(gè)數(shù)據(jù)。七、問(wèn)題回答分析系統(tǒng)是怎樣創(chuàng)建進(jìn)程的?答:系統(tǒng)通過(guò)forkO系統(tǒng)調(diào)用來(lái)創(chuàng)建父進(jìn)程對(duì)應(yīng)的子進(jìn)程,創(chuàng)建成功將返回一個(gè)值“0”給子進(jìn)程,父進(jìn)程會(huì)被返回子進(jìn)程的id值(大于0),若創(chuàng)建失敗返回“-1”。(1.2)當(dāng)首次調(diào)用新創(chuàng)建進(jìn)程時(shí),其入口在哪里?答:入口就是fork()返回給創(chuàng)建的子進(jìn)程的pid值。(2.1)可執(zhí)行文件加載時(shí)進(jìn)行了哪些處理?答:獲得目錄下所有文件的信息,然后把目錄倒序,再加載到子進(jìn)程中。(2.2)什么是進(jìn)程同步?wait()是如何實(shí)現(xiàn)進(jìn)程同步的?答:進(jìn)程同步就是不同進(jìn)程按照一定的順序先后執(zhí)行,而不是沒(méi)有順序的或先或后執(zhí)行。Wait()是要等待子進(jìn)程中exit()返回正常軟中斷的信號(hào)時(shí)才結(jié)束等待,執(zhí)行父進(jìn)程wait()后面的代碼。Wait和exit是配合使用的,在進(jìn)程的同步上面,一般wait放在父進(jìn)程中用來(lái)等待子進(jìn)程的exit返回值。⑶無(wú)習(xí)題。答:略。⑷無(wú)習(xí)題。答:略。(5.1)該程序段前面部分用了兩個(gè)wait(0),它們起什么作用?答:等待兩個(gè)子進(jìn)程exit()的返回值再繼續(xù)執(zhí)行下面代碼。(5.2)該程序段中每個(gè)進(jìn)程退出時(shí)都用了語(yǔ)句exit(0),為什么?答:子進(jìn)程正常退出時(shí),返回值給wait(),再執(zhí)行父進(jìn)程。(5.3)為何預(yù)期的結(jié)果并未顯示出?答:由于父子進(jìn)程都同時(shí)接收到七中斷信號(hào),所以兩個(gè)子進(jìn)程在創(chuàng)建之后,signal就得到中斷信號(hào),子進(jìn)程正常中止,并沒(méi)有執(zhí)行signal之后的代碼,返回正常中止的信號(hào)給wait(0),父進(jìn)程得到子進(jìn)程正常中止的信號(hào)后就執(zhí)行后面的代碼,輸出“Parentprocessiskilled!”。(5.4)程序該如何修改才能得到正確結(jié)果?答:在終端發(fā)送指令給父進(jìn)程,或著更換成如下代碼:#include<stdio.h>#include<signal.h>#include<unistd.h>#include<stdlib.h>#include<sys/wait.h>voidwaiting(),stop(),nye();

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論