操作系統(tǒng)課程設計進程管理進程間通信_第1頁
操作系統(tǒng)課程設計進程管理進程間通信_第2頁
操作系統(tǒng)課程設計進程管理進程間通信_第3頁
操作系統(tǒng)課程設計進程管理進程間通信_第4頁
操作系統(tǒng)課程設計進程管理進程間通信_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

煙臺大學文經(jīng)學院設計名稱成員課程設計地址

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

及msgctl( )

編制一長度為

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

/*

同步*/wait(0);printf("parentprocessiskilled!\n");exit(0);}else{wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN);/*忽視^c信號*/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

信號*/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;}<運轉結果>不做任何操作等候五秒鐘父進度回在子進度縣推出退后出,并打印退出的次序;或許點擊ctrl+C后程序退出并打印退出的次序。〈任務2〉在上邊的任務1中,增加語句signal(SIGINT,SIG_IGN)和語句signal(SIGQUIT,SIG_IGN),察看履行結果,并分析原由。這里,signal(SIGINT,SIG_IGN)signal(SIGQUIT,SIG_IGN)分別為忽視鍵信號以及忽視中止信號。<程序>#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( );}}〈運轉結果〉請讀者將上述程序輸入計算機后,履行并察看。3.進度的管道通信〈任務〉編制一段程序,實現(xiàn)進度的管道通信。使用系統(tǒng)調用pipe( )成立一條管道線。兩個子進度p1和p2分別向通道個寫一句話:child1processissendingmessage!child2processissendingmessage!而父進度則從管道中讀出來自兩個進度的信息,顯示在屏幕上?!闯绦颉?include<unistd.h>#include<signal.h>#include<stdio.h>intpid1,pid2;main( ){intfd[2];charoutpipe[100],inpipe[100];pipe(fd);/*創(chuàng)立一個管道*/while((pid1=fork( ))==-1);if(pid1==0){lockf(fd[1],1,0);sprintf(outpipe,"child1processissendingmessage!");/*把串放入數(shù)組outpipe中*/write(fd[1],outpipe,50);/*向管道寫長為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);/*

從管道中讀長為

50字節(jié)的串*/printf("%s\n",inpipe);wait(0);read(fd[0],inpipe,50);printf("%s\n",inpipe);exit(0);}}}〈運轉結果〉延緩5秒后顯示:child1processissendingmessage!再延緩5秒:child2processissendingmessage!(2)進度的管道通信編制一段程序,實現(xiàn)進度的管道通信。使用系統(tǒng)調用pipe( )成立一條管道線。兩個子進度p1和p2分別向通道個寫一句話:child1processissendingmessage!child2processissendingmessage!而父進度則從管道中讀出來自兩個進度的信息,顯示在屏幕上。#include<unistd.h>#include<signal.h>#include<stdio.h>intpid1,pid2;main( ){intfd[2];charoutpipe[100],inpipe[100];pipe(fd);/*創(chuàng)立一個管道*/while((pid1=fork( ))==-1);if(pid1==0){lockf(fd[1],1,0);sprintf(outpipe,"child1processissendingmessage!");/*把串放入數(shù)組outpipe中*/write(fd[1],outpipe,50);/*向管道寫長為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);/*從管道中讀長為50字節(jié)的串*/printf("%s\n",inpipe);wait(0);read(fd[0],inpipe,50);printf("%s\n",inpipe);exit(0);}}}〈運轉結果〉延緩5秒后顯示:child1processissendingmessage!再延緩5秒:child2processissendingmessage!(2)信息的創(chuàng)立,發(fā)送和接收#include<stdio.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75/*定義重點詞MEGKEY*/Structmsgform/*信息構造*/{longmtype;charmtexe[100];/*文本長度*/}msg;intmsgqid,i;voidCLIENT( ){inti;msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(i=10;i>=1;i--){msg.mtype=i;printf("(c

溫馨提示

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

評論

0/150

提交評論