操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理進(jìn)程間通信_(tái)第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理進(jìn)程間通信_(tái)第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理進(jìn)程間通信_(tái)第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理進(jìn)程間通信_(tái)第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程管理進(jìn)程間通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩24頁(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)介

煙臺(tái)大學(xué)文經(jīng)學(xué)院設(shè)計(jì)名稱成員課程設(shè)計(jì)地址

課程:操作系統(tǒng)學(xué)號(hào):姓名:班級(jí):指導(dǎo)老師:進(jìn)度管理。進(jìn)度間通信。一.課程設(shè)計(jì)思想及目的1)加深對(duì)進(jìn)度見(jiàn)解的理解,明確進(jìn)度和程序的差別。2)進(jìn)一步認(rèn)識(shí)并發(fā)履行的實(shí)質(zhì)。3)分析進(jìn)度競(jìng)爭(zhēng)資源現(xiàn)象,學(xué)習(xí)解決進(jìn)度互斥的方法。4)認(rèn)識(shí)Linux系統(tǒng)中進(jìn)度通信的基本源理。Linux系統(tǒng)的進(jìn)度通信機(jī)構(gòu)(IPC)贊成在隨意進(jìn)度間大量量地互換數(shù)據(jù)。本實(shí)驗(yàn)的目的是認(rèn)識(shí)和熟習(xí)Linux支持的信息通信系統(tǒng)及信息量系統(tǒng)。二.課程設(shè)計(jì)設(shè)施及環(huán)境裝有Linux操作系統(tǒng)的PC機(jī)三.課程設(shè)計(jì)內(nèi)容(1)進(jìn)度的創(chuàng)立編寫(xiě)一段源程序,使系統(tǒng)調(diào)用fork( )創(chuàng)立兩個(gè)子進(jìn)度,當(dāng)此程序運(yùn)轉(zhuǎn)時(shí),在系統(tǒng)中有一個(gè)父進(jìn)度和兩個(gè)子進(jìn)度活動(dòng)。讓每一個(gè)進(jìn)度在屏幕上顯示一個(gè)字符:父進(jìn)度顯示字符“a”;子進(jìn)度分別顯示字符“b”和字符“c”。試察看紀(jì)錄屏幕上的顯示結(jié)果,并分析原由。(2)進(jìn)度的控制改正已編寫(xiě)的程序,將每個(gè)進(jìn)度輸出一個(gè)字符改為每個(gè)進(jìn)度輸出一句話,在察看程序履行時(shí)屏幕出現(xiàn)的現(xiàn)象,并分析原由。假如在程序中使用調(diào)用lockf( )來(lái)給每一個(gè)子進(jìn)度加鎖,能夠?qū)崿F(xiàn)進(jìn)度之間的互斥,察看并分析出現(xiàn)的現(xiàn)象。3)①編寫(xiě)一段程序,使其現(xiàn)實(shí)進(jìn)度的軟中止通信。信息的創(chuàng)立,發(fā)送和接收。①使用系統(tǒng)調(diào)用msgget( ),msgsnd( ),msgrev( ),

及msgctl( )

編制一長(zhǎng)度為

1k的信息的發(fā)送和接收程序。②察看上邊的程序,說(shuō)明控制信息行列系統(tǒng)調(diào)用msgctl( )在此起什么作用?共享儲(chǔ)蓄區(qū)的創(chuàng)立、附接和段接。使用系統(tǒng)調(diào)用shmget( ),shmat( ),sgmdt( ),shmctl( ),編制一個(gè)與上述功能同樣的程序。比較上述(1),(2)兩種信息通信系統(tǒng)中數(shù)據(jù)傳輸?shù)臅r(shí)間。四.課程設(shè)計(jì)過(guò)程及結(jié)果1.進(jìn)度的創(chuàng)立〈任務(wù)〉編寫(xiě)一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)立兩個(gè)子進(jìn)度。當(dāng)此程序運(yùn)轉(zhuǎn)時(shí),在系統(tǒng)中有一個(gè)父進(jìn)度和兩個(gè)子進(jìn)度活動(dòng)。讓每一個(gè)進(jìn)度在屏幕上顯示一個(gè)字符;父進(jìn)度顯示字符“a”,子進(jìn)度分別顯示字符“b”和“c”。試察看記錄屏幕上的顯示結(jié)果,并分析原因。〈程序〉#include<stdio.h>main( ){intp1,p2;if(p1=fork( ))/*子進(jìn)度創(chuàng)立成功*/putchar('b');else{if(p2=fork( ))/*子進(jìn)度創(chuàng)立成功*/putchar('c');elseputchar('a');/*父進(jìn)度履行*/}}<運(yùn)轉(zhuǎn)結(jié)果>bca(有時(shí)會(huì)出現(xiàn)abc的隨意的擺列)分析:從進(jìn)度履行并發(fā)來(lái)看,輸出abc的擺列都是有可能的。原由:fork( )創(chuàng)立進(jìn)度所需的時(shí)間固然可能多于輸出一個(gè)字符的時(shí)間,但各個(gè)進(jìn)度的時(shí)間片的獲取卻不是必定是次序的,所以輸出abc的擺列都是有可能的。2.進(jìn)度的控制<任務(wù)>改正已編寫(xiě)好的程序,將每個(gè)程序的輸出由單個(gè)字符改為一句話,再察看程序履行時(shí)屏幕上出現(xiàn)的現(xiàn)象,并分析其原由。假如在程序中使用系統(tǒng)調(diào)用lockf( )來(lái)給每個(gè)程序加鎖,能夠?qū)崿F(xiàn)進(jìn)度之間的互斥,察看并分析出現(xiàn)的現(xiàn)象?!闯绦?〉#include<stdio.h>main( ){intp1,p2,i;if(p1=fork( )){for(i=0;i<500;i++)printf("parent%d\n",i);wait(0);/*保證在子進(jìn)度停止前,父進(jìn)度不會(huì)停止*/exit(0);}else{if(p2=fork( )){for(i=0;i<500;i++)printf("son%d\n",i);wait(0);/*保證在子進(jìn)度停止前,父進(jìn)度不會(huì)停止*/exit(0);/*向父進(jìn)度信號(hào)0且該進(jìn)度推出*/}else{for(i=0;i<500;i++)printf(“grandchild%d\n",i);exit(0);}}}〈運(yùn)轉(zhuǎn)結(jié)果〉parent?.son?grandchild?grandchild?grandchildsongrandchildsonparent分析:因?yàn)楹瘮?shù)printf( )輸出的字符串之間不會(huì)被中止,所以,每個(gè)字符串內(nèi)部的字符次序輸出時(shí)不變??墒?因?yàn)檫M(jìn)度并發(fā)履行時(shí)的調(diào)動(dòng)次序和父子進(jìn)度的搶占辦理機(jī)問(wèn)題,輸出字符串的次序和先后跟著履行的不同樣而發(fā)生變化。這與打印單字符的結(jié)果同樣。〈程序2〉#include<stdio.h>main( ){intp1,p2,i;if(p1=fork( )){lockf(1,1,0);for(i=0;i<500;i++)printf("parent%d\n",i);lockf(1,0,0);wait(0);/*保證在子進(jìn)度停止前,父進(jìn)度不會(huì)停止*/exit(0);}else{if(p2=fork( )){lockf(1,1,0);for(i=0;i<500;i++)printf("son%d\n",i);lockf(1,0,0);wait(0);/*保證在子進(jìn)度停止前,父進(jìn)度不會(huì)停止*/exit(0);}else{lockf(1,1,0);for(i=0;i<500;i++)printf("daughter%d\n",i);lockf(1,0,0);exit(0);}}}<運(yùn)轉(zhuǎn)結(jié)果〉輸出parent塊,son塊,grandchild塊的次序可能不同樣,可是每個(gè)塊的輸出過(guò)程不會(huì)被打斷。分析:因?yàn)樯鲜龀绦蚵男袝r(shí),lockf(1,1,0)鎖定標(biāo)準(zhǔn)輸出設(shè)施,lockf(1,0,0)解鎖標(biāo)準(zhǔn)輸出設(shè)施,在lockf(1,1,0)與lockf(1,0,0)中間的for循環(huán)輸出不會(huì)被中止,加鎖與不加鎖見(jiàn)效不同樣。3.軟中止通信〈任務(wù)1〉編制一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)立兩個(gè)子進(jìn)度,再用系統(tǒng)調(diào)用signal( )讓父進(jìn)度捕獲鍵盤上來(lái)的中止信號(hào)(即按ctrl+c鍵),當(dāng)捕獲到中止信號(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!#include<stdio.h>#include<signal.h>#include<unistd.h>voidwaiting( ),stop( ),alarming( );intwait_mark;main( ){intp1,p2;if(p1=fork( ))/*創(chuàng)立子進(jìn)度p1*/{if(p2=fork( ))/*創(chuàng)立子進(jìn)度p2*/{wait_mark=1;signal(SIGINT,stop);/*接收到^c信號(hào),轉(zhuǎn)stop*/signal(SIGALRM,alarming);/*接受SIGALRMwaiting( );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);signal(SIGINT,SIG_IGN);/*忽視^c信號(hào)*/while(wait_mark!=0);lockf(1,1,0);printf("childprocess2iskilledbyparent!\n");lockf(1,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN);/*

忽視^c

信號(hào)*/while(wait_mark!=0)lockf(1,1,0);printf("childprocess1iskilledbyparent!\n");lockf(1,0,0);exit(0);}}voidwaiting( ){sleep(5);if(wait_mark!=0)kill(getpid( ),SIGALRM);}voidalarming( ){wait_mark=0;}voidstop( ){wait_mark=0;}<運(yùn)轉(zhuǎn)結(jié)果>不做任何操作等候五秒鐘父進(jìn)度回在子進(jìn)度縣推出退后出,并打印退出的次序;或許點(diǎn)擊ctrl+C后程序退出并打印退出的次序?!慈蝿?wù)2〉在上邊的任務(wù)1中,增加語(yǔ)句signal(SIGINT,SIG_IGN)和語(yǔ)句signal(SIGQUIT,SIG_IGN),察看履行結(jié)果,并分析原由。這里,signal(SIGINT,SIG_IGN)signal(SIGQUIT,SIG_IGN)分別為忽視鍵信號(hào)以及忽視中止信號(hào)。<程序>#include<stdio.h>#include<signal.h>#include<unistd.h>intpid1,pid2;intEndFlag=0;intpf1=0;intpf2=0;voidIntDelete( ){kill(pid1,16);kill(pid2,17);}voidInt1( ){printf("childprocess1iskilled!byparent\n");exit(0);}voidInt2( ){printf("childprocess2iskilled!byparent\n");exit(0);}main( ){intexitpid;if(pid1=fork( )){if(pid2=fork( )){signal(SIGINT,IntDelete);waitpid(-1,&exitpid,0);waitpid(-1,&exitpid,0);printf("parentprocessiskilled\n");exit(0);}else{signal(SIGINT,SIG_IGN);signal(17,Int2);pause( );}}else{signal(SIGINT,SIG_IGN);signal(16,Int1);pause( );}}〈運(yùn)轉(zhuǎn)結(jié)果〉請(qǐng)讀者將上述程序輸入計(jì)算機(jī)后,履行并察看。3.進(jìn)度的管道通信〈任務(wù)〉編制一段程序,實(shí)現(xiàn)進(jìn)度的管道通信。使用系統(tǒng)調(diào)用pipe( )成立一條管道線。兩個(gè)子進(jìn)度p1和p2分別向通道個(gè)寫(xiě)一句話:child1processissendingmessage!child2processissendingmessage!而父進(jìn)度則從管道中讀出來(lái)自兩個(gè)進(jìn)度的信息,顯示在屏幕上?!闯绦颉?include<unistd.h>#include<signal.h>#include<stdio.h>intpid1,pid2;main( ){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);}}}〈運(yùn)轉(zhuǎn)結(jié)果〉延緩5秒后顯示:child1processissendingmessage!再延緩5秒:child2processissendingmessage!(2)進(jìn)度的管道通信編制一段程序,實(shí)現(xiàn)進(jìn)度的管道通信。使用系統(tǒng)調(diào)用pipe( )成立一條管道線。兩個(gè)子進(jìn)度p1和p2分別向通道個(gè)寫(xiě)一句話:child1processissendingmessage!child2processissendingmessage!而父進(jìn)度則從管道中讀出來(lái)自兩個(gè)進(jìn)度的信息,顯示在屏幕上。#include<unistd.h>#include<signal.h>#include<stdio.h>intpid1,pid2;main( ){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);}}}〈運(yùn)轉(zhuǎn)結(jié)果〉延緩5秒后顯示:child1processissendingmessage!再延緩5秒:child2processissendingmessage!(2)信息的創(chuàng)立,發(fā)送和接收#include<stdio.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75/*定義重點(diǎn)詞MEGKEY*/Structmsgform/*信息構(gòu)造*/{longmtype;charmtexe[100];/*文本長(zhǎng)度*/}msg;intmsgqid,i;voidCLIENT( ){inti;msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(i=10;i>=1;i--){msg.mtype=i;printf("(c

溫馨提示

  • 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)論