版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、廣州大學學生實驗報告開課學院及實驗室:計算機科學與工程實驗室 2015年11月10日實驗課程名稱操作系統(tǒng)實驗成績實驗項目名稱進程管理與進程通信指導老師(*報告只能為文字和圖片,老師評語將添加到此處,學生請勿作答*)1、 實驗目的1.1、掌握進程的概念,明確進程的含義1.2、認識并了解并發(fā)執(zhí)行的實質(zhì)2.1、掌握進程另外的創(chuàng)建方法2.2、熟悉進程的睡眠、同步、撤消等進程控制方法3.1、進一步認識并發(fā)執(zhí)行的實質(zhì)3.2、分析進程競爭資源的現(xiàn)象,學習解決進程互斥的方法4.1、了解守護進程5.1、了解什么是信號5.2、INUX系統(tǒng)中進程之間軟中斷通信的基本原理6.1、了解什么是管道6.2、熟悉UNIX/L
2、INUX支持的管道通信方式7.1、了解什么是消息7.2、熟悉消息傳送的機理8.1、了解和熟悉共享存儲機制二、實驗內(nèi)容1.1、編寫一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個子進程。當此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示'a',子進程分別顯示字符'b'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。1.2、修改上述程序,每一個進程循環(huán)顯示一句話。子進程顯示'daughter '及'son ',父進程顯示 'parent ',觀察結(jié)果,分
3、析原因。2.1、用fork( )創(chuàng)建一個進程,再調(diào)用exec( )用新的程序替換該子進程的內(nèi)容2.2、利用wait( )來控制進程執(zhí)行順序3.1、修改實驗(一)中的程序2,用lockf( )來給每一個進程加鎖,以實現(xiàn)進程之間的互斥3.2、觀察并分析出現(xiàn)的現(xiàn)象4.1、寫一個使用守護進程(daemon)的程序,來實現(xiàn): 創(chuàng)建一個日志文件/var/log/Mydaemon.log ;每分鐘都向其中寫入一個時間戳(使用time_t的格式) ;5.1、用fork( )創(chuàng)建兩個子進程,再用系統(tǒng)調(diào)用signal( )讓父進程捕捉鍵盤上來的中斷信號(即按c鍵);捕捉到中斷信號后,父進程用系統(tǒng)調(diào)用kill( )
4、向兩個子進程發(fā)出信號,子進程捕捉到信號后分別輸出下列信息后終止:Child process1 is killed by parent!Child process2 is killed by parent!父進程等待兩個子進程終止后,輸出如下的信息后終止:Parent process is killed!5.2、用軟中斷通信實現(xiàn)進程同步的機理6.1、編寫程序?qū)崿F(xiàn)進程的管道通信。用系統(tǒng)調(diào)用pipe( )建立一管道,二個子進程P1和P2分別向管道各寫一句話: Child 1 is sending a message! Child 2 is sending a message!父進程從管道中讀出二個來
5、自子進程的信息并顯示(要求先接收P1,后P2)。7.1、消息的創(chuàng)建、發(fā)送和接收。使用系統(tǒng)調(diào)用msgget( ),msgsnd( ),msgrev( ),及msgctl( )編制一長度為k的消息發(fā)送和接收的程序。8.1、 編制一長度為1k的共享存儲區(qū)發(fā)送和接收的程序。三、實驗原理1、 程既是一個獨立擁有資源的基本單位,又是一個獨立調(diào)度的基本單位。一個進程實體由若干個區(qū)(段)組成,包括程序區(qū)、數(shù)據(jù)區(qū)、棧區(qū)、共享存儲區(qū)等。每個區(qū)又分為若干頁,每個進程配置有唯一的進程控制塊PCB,用于控制和管理進程。2、 進程是進程映像的執(zhí)行過程,也就是正在執(zhí)行的進程實體。3、 fork( )返回值意義如下:0:在子
6、進程中,pid變量保存的fork( )返回值為0,表示當前進程是子進程。>0:在父進程中,pid變量保存的fork( )返回值為子進程的id值(進程唯一標識符)。4、NIX/LINUX中fork( )是一個非常有用的系統(tǒng)調(diào)用,但在UNIX/LINUX中建立進程除了fork( )之外,也可用與fork( ) 配合使用的exec( )。5、lockf(files,function,size)用作鎖定文件的某些段或者整個文件。6、每個信號都對應一個正整數(shù)常量(稱為signal number,即信號編號。定義在系統(tǒng)頭文件<signal.h>中),代表同一用戶的諸進程之間傳送事先約定的
7、信息的類型,用于通知某進程發(fā)生了某異常事件。每個進程在運行時,都要通過信號機制來檢查是否有信號到達。若有,便中斷正在執(zhí)行的程序,轉(zhuǎn)向與該信號相對應的處理程序,以完成對該事件的處理;處理結(jié)束后再返回到原來的斷點繼續(xù)執(zhí)行。實質(zhì)上,信號機制是對中斷機制的一種模擬,故在早期的UNIX版本中又把它稱為軟中斷。7、信號的發(fā)送,是指由發(fā)送進程把信號送到指定進程的信號域的某一位上。如果目標進程正在一個可被中斷的優(yōu)先級上睡眠,核心便將它喚醒,發(fā)送進程就此結(jié)束。一個進程可能在其信號域中有多個位被置位,代表有多種類型的信號到達,但對于一類信號,進程卻只能記住其中的某一個。8、當一個進程要進入或退出一個低優(yōu)先級睡眠狀
8、態(tài)時,或一個進程即將從核心態(tài)返回用戶態(tài)時,核心都要檢查該進程是否已收到軟中斷。當進程處于核心態(tài)時,即使收到軟中斷也不予理睬;只有當它返回到用戶態(tài)后,才處理軟中斷信號。9、管道,是指能夠連接一個寫進程和一個讀進程的、并允許它們以生產(chǎn)者消費者方式進行通信的一個共享文件,又稱為pipe文件。10、消息機制允許由一個進程給其它任意的進程發(fā)送一個消息。 11、該機制可使若干進程共享主存中的某一個區(qū)域,且使該區(qū)域出現(xiàn)(映射)在多個 進程的虛地址空間中。 四、實驗設(shè)備Linux系統(tǒng)五、實驗程序1、創(chuàng)建子進程相關(guān)代碼#include <stdio.h>#include<unistd.h>
9、;int main( )int p1,p2;while(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'); 修改后:#include<stdio.h>#include<unistd.h>int main( )int p1,p2,i;while(p1=fork( )= -1); /*創(chuàng)建子進程p1*/if (p1=0)
10、 for(i=0;i<10;i+)printf("daughter %dn",i);else while(p2=fork( )= -1); /*創(chuàng)建子進程p2*/if(p2=0) for(i=0;i<10;i+) printf("son %dn",i);else for(i=0;i<10;i+) printf("parent %dn",i);2、exec,wait相關(guān)代碼 #include<stdio.h>#include<stdlib.h> #include<unistd.h>#
11、include <sys/wait.h>void main( ) 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: /*父進程*/ w
12、ait(NULL); /*同步*/ printf("ls completed !n"); exit(0); 3、lockf相關(guān)代碼#include <stdio.h>#include <unistd.h>#include <sys/wait.h>int main( )int p1,p2,i;while(p1=fork( )=-1); /*創(chuàng)建子進程p1*/if (p1=0)lockf(1,1,0); /*加鎖,這里第一個參數(shù)為stdout(標準輸出設(shè)備的描述符)*/for(i=0;i<10;i+)printf("daugh
13、ter %dn",i);lockf(1,0,0); /*解鎖*/elsewhile(p2=fork( )=-1); /*創(chuàng)建子進程p2*/if (p2=0)lockf(1,1,0); /*加鎖*/for(i=0;i<10;i+)printf("son %dn",i);lockf(1,0,0); /*解鎖*/elselockf(1,1,0); /*加鎖*/for(i=0;i<10;i+)printf("parent %dn",i);lockf(1,0,0); /*解鎖*/4、守護神程序:#include <stdio.h>
14、#include <time.h>#include <stdlib.h>#include <unistd.h>#include<sys/time.h>int main()time_t t; FILE *fp; fp=fopen("/var/log/Mydaemon.log","a");pid_t pid; pid=fork();if(pid>0)printf("Daemon on duty!n");exit(0);else if(pid<0)printf("Can&
15、#39;t fork!n");exit(-1);while(1)if(fp>=0)sleep(60); printf("Daemon on duty!n");t=time(0);fprintf(fp,"The current time is %sn",asctime(localtime(&t);fclose(fp);5、通信中斷關(guān)代碼#include <stdio.h>#include <stdlib.h>#include<sys/wait.h>#include <signal.h>
16、#include <unistd.h>void waiting( ),stop( );int wait_mark;int main( )int p1,p2,stdout;while(p1=fork( )=-1); /*創(chuàng)建子進程p1*/if(p1>0)while(p2=fork( )=-1); /*創(chuàng)建子進程p2*/if(p2>0)wait_mark=1;signal(SIGINT,stop); /*接收到c信號,轉(zhuǎn)stop*/waiting( );kill(p1,16); /*向p1發(fā)軟中斷信號16*/kill(p2,17); /*向p2發(fā)軟中斷信號17*/wait(
17、0); /*同步*/wait(0);printf("Parent process is killed!n");exit(0);elsewait_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);elsewait_mark=1;signal(16,stop); /*接收到軟中斷信號16,轉(zhuǎn)stop*/waiting(
18、 );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;6、管道相關(guān)代碼:#include <unistd.h>#include <signal.h>#include <stdio.h>#include<stdlib.h> #include<sys/wait.h> i
19、nt pid1,pid2;int 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); /*向管道寫長為50字節(jié)的串*/sleep(5); /*自我阻塞5秒*/lockf(fd1,0,0);exit(0);elsewh
20、ile(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é)的串*/printf("%sn",inpipe);wait(0);read(fd0,inpipe,50);printf(&quo
21、t;%sn",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> #define MSGKEY 75struct msgform long mtype;char mtext1000;msg;int msgqid;void client()int i;msgqid=msgget(MSGKEY,0777);for(i=10;i&
22、gt;=1;i-)msg.mtype=i;printf("(client)sentn");msgsnd(msgqid,&msg,1024,0); exit(0);int main( ) client( );server.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#include<stdio.h>#include<stdlib.h> #define MSGKEY 75struct msgform long mtype;char mt
23、ext1000;msg;int msgqid;void server( )msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*創(chuàng)建75#消息隊列*/do msgrcv(msgqid,&msg,1030,0,0); /*接收消息*/printf("(server)receivedn");while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0); /*刪除消息隊列,歸還資源*/exit(0);int main( ) server( );8、共享存儲機制的相關(guān)代碼#include<sys/types.h&
24、gt;#include<sys/shm.h>#include<sys/ipc.h>#include<unistd.h> #include<stdlib.h> #include<stdio.h>#include<sys/wait.h> #include<signal.h> #define SHMKEY 75#define SHMSZ 128int shmid,i;int *addr;void client( ) int i;shmid=shmget(SHMKEY,1024,0777); /*打開共享存儲區(qū)*/ad
25、dr=shmat(shmid,0,0); /*獲得共享存儲區(qū)首地址*/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 (*
26、addr);shmctl(shmid,IPC_RMID,0); /*撤消共享存儲區(qū),歸還資源*/exit(0);int main( )while(i=fork( )=-1);if(!i) server( );system("ipcs -m");while(i=fork( )=-1);if(!i) client( );wait(0);wait(0);六、實驗結(jié)果實驗1.1本來從進程并發(fā)執(zhí)行來看,各種情況都有可能。上面的三個進程沒有同步措施,父進程與子進程的輸出內(nèi)容會疊加在一起。輸出次序帶有隨機性。實驗1.2由實驗1.1可知各種情況都有可能由于函數(shù),而且printf( )在輸出
27、字符串時不會被中斷,因此,字符串內(nèi)部字符順序輸出不變。但由于進程并發(fā)執(zhí)行的調(diào)度順序和父子進程搶占處理機問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結(jié)果相同。實驗2.12.2程序在調(diào)用fork( )建立一個子進程后,馬上調(diào)用wait( ),使父進程在子進程結(jié)束之前,一直處于睡眠狀態(tài)。子進程用exec( )裝入命令ls ,exec( )后,子進程的代碼被ls的代碼取代,這時子進程的PC指向ls的第1條語句,開始執(zhí)行l(wèi)s的命令代碼。wait( )給我們提供了一種實現(xiàn)進程同步的簡單方法。實驗3.13.2加鎖和沒加鎖還是有區(qū)別的。沒加鎖,子進程的for循環(huán)會被“打斷”,也就是說
28、,10個daughter和10個son會互相穿插。而加鎖以后,盡管10個son和10個daughter會或先或后出現(xiàn),但是不會互相穿插,以10個10個這樣的完整形式輸出。這是因為加鎖以后,屏幕輸出要等解鎖指令發(fā)出后,才會讓第二個進程執(zhí)行輸出,在第一個進程沒有解鎖前,其余進程不能輸出。實驗4.1終端:日志:fprintf(fp,"The current time is %sn",asctime(localtime(&t)只是把當前時間輸入到緩沖區(qū),并沒有寫到Mydaemon.log文件里面,所以并不會輸出時間。唯有在fprintf最后寫上fflush(fp)才能強制輸
29、出時間戳到Mydaemon.log文件里面。實驗5.15.2屏幕上無反應,按下C后,顯示 Parent process is killed!上述程序中,signal( )都放在一段程序的前面部位,而不是在其他接收信號處。這是因為signal( )的執(zhí)行只是為進程指定信號值16或17的作用,以及分配相應的與stop( )過程鏈接的指針。因而,signal( )函數(shù)必須在程序前面部分執(zhí)行。實驗6.1延遲5秒后顯示:child 1 process is sending message!再延遲5秒:child 2 process is sending message!實驗7.1應當是每當client發(fā)
30、送一個消息后,server接收該消息,client再發(fā)送下一條。也就是說“(client)sent”和 “(server)received”的字樣應該在屏幕上交替出現(xiàn)。實際的結(jié)果大多是,先由client發(fā)送了兩條消息,然后server接收一條消息。此后client 、server交替發(fā)送和接收消息。最后server一次接收兩條消息。client 和server 分別發(fā)送和接收了10條消息,與預期設(shè)想一致。實驗8.1在運行過程中,發(fā)現(xiàn)每當client發(fā)送一次數(shù)據(jù)后,server要等待大約0.1秒才有響應。同樣,之后client又需要等待大約0.1秒才發(fā)送下一個數(shù)據(jù)。七、問題回答分析(1.1)系統(tǒng)
31、是怎樣創(chuàng)建進程的?答:系統(tǒng)通過fork()系統(tǒng)調(diào)用來創(chuàng)建父進程對應的子進程,創(chuàng)建成功將返回一個值“0”給子進程,父進程會被返回子進程的id值(大于0),若創(chuàng)建失敗返回“-1”。(1.2)當首次調(diào)用新創(chuàng)建進程時,其入口在哪里?答:入口就是fork()返回給創(chuàng)建的子進程的pid值。(2.1)可執(zhí)行文件加載時進行了哪些處理?答:獲得目錄下所有文件的信息,然后把目錄倒序,再加載到子進程中。(2.2)什么是進程同步?wait( )是如何實現(xiàn)進程同步的?答:進程同步就是不同進程按照一定的順序先后執(zhí)行,而不是沒有順序的或先或后執(zhí)行。Wait()是要等待子進程中exit()返回正常軟中斷的信號時才結(jié)束等待,執(zhí)
32、行父進程wait()后面的代碼。Wait和exit是配合使用的,在進程的同步上面,一般wait放在父進程中用來等待子進程的exit返回值。(3)無習題。答:略。(4)無習題。答:略。(5.1)該程序段前面部分用了兩個wait(0),它們起什么作用?答:等待兩個子進程exit()的返回值再繼續(xù)執(zhí)行下面代碼。(5.2) 該程序段中每個進程退出時都用了語句exit(0),為什么?答:子進程正常退出時,返回值給wait(),再執(zhí)行父進程。(5.3) 為何預期的結(jié)果并未顯示出? 答:由于父子進程都同時接收到c中斷信號,所以兩個子進程在創(chuàng)建之后,signal就得到中斷信號,子進程正常中止,并沒有執(zhí)行sig
33、nal之后的代碼,返回正常中止的信號給wait(0),父進程得到子進程正常中止的信號后就執(zhí)行后面的代碼,輸出“Parent process is killed!”。(5.4) 程序該如何修改才能得到正確結(jié)果?答:在終端發(fā)送指令給父進程,或著更換成如下代碼:#include<stdio.h>#include<signal.h> #include<unistd.h> #include<stdlib.h> #include<sys/wait.h> void waiting( ),stop( ),nye( ); int wait_mark; int main( ) int p1,p2,stdout; while(p1=fork( )=-1); if (p1>0) while(p2=fork( )=-1); if(p2>0) wait_mark=1; signal(SIGINT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《家庭護士》課件
- 2023-2024學年福建省福州市福清市高一(下)期中地理試卷
- 高速公路施工總承包合同段春節(jié)節(jié)后復工工作計劃及保障措施
- 2024年山東省日照市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- 2024年福建省福州市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- 2024年四川省眉山市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- 2021年貴州省安順市公開招聘警務輔助人員輔警筆試自考題1卷含答案
- 湖南省張家界市(2024年-2025年小學六年級語文)部編版摸底考試(上學期)試卷及答案
- 2024年ATM機項目資金需求報告代可行性研究報告
- 2025年P(guān)S鋁合金板項目立項申請報告模板
- 三相同步發(fā)電機的基本工作原理
- 青年干部成長成才成功
- GB/T 29636-2023疑似毒品中甲基苯丙胺檢驗
- 2023年全國中小學思政課教師網(wǎng)絡培訓研修總結(jié)心得體會
- 老年人能力評估標準表
- 卷內(nèi)目錄及卷內(nèi)備考表
- 國開大學2023年01月11110《工程地質(zhì)》期末考試答案
- 2023春國家開放大學-02272數(shù)據(jù)結(jié)構(gòu)(本)-期末考試題帶答案
- 模擬電子技術(shù)課程設(shè)計報告
- Nikon Z6 Z7 數(shù)碼微單攝影技巧大全
- 成都市金牛區(qū)八年級上學期期末考試語文試題
評論
0/150
提交評論