




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、操作系統(tǒng)實驗報告樣本1 操作系統(tǒng)實驗報告內(nèi)容(1) 基本信息:完成人姓名、學號、報告日期(2) 實驗內(nèi)容(3) 實驗目的(4) 實驗題目(5) 設計思路和流程圖(6) 主要數(shù)據(jù)結構及其說明(7) 源程序并附上注釋(8) 程序運行時的初值和運行結果(9) 實驗體會:實驗中遇到的問題及解決過程、實驗中產(chǎn)生的錯誤及原因分析、實驗的體會及收獲、對做好今后實驗提出建設性建議等。實驗報告可以書面或電子文檔形式提交。2操作系統(tǒng)實驗報告樣本一、實驗內(nèi)容(1)進程的創(chuàng)建 編寫一段源程序,使系統(tǒng)調(diào)用fork()創(chuàng)建兩個子進程,當此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:
2、父進程顯示字符“b”;子進程分別顯示字符“c”和字符“a”。試觀察紀錄屏幕上的顯示結果,并分析原因。 (2)進程的控制 修改已編寫的程序,將每個進程輸出一個字符改為每個進程輸出一句話,在觀察程序執(zhí)行時屏幕出現(xiàn)的現(xiàn)象,并分析原因。 如果在程序中使用調(diào)用lockf()來給每一個子進程加鎖,可以實現(xiàn)進程之間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。 (3)編寫一段程序,使其現(xiàn)實進程的軟中斷通信。 要求:使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個子進程,再用系統(tǒng)調(diào)用signal()讓父進程捕捉鍵盤上來的中斷信號(即按DEL鍵);當捕捉到中斷信號后,父進程用系統(tǒng)調(diào)用Kill()向兩個子進程發(fā)出信號,子進程捕捉到信號后分別輸出
3、下列信息后終止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父進程等待兩個子進程終止后,輸出如下的信息后終止 Parent Process is Killed! 在上面的程序中增加語句signal (SIGNAL, SIG-IGN) 和signal (SIGQUIT, SIG-IGN), 觀察執(zhí)行結果,并分析原因。 (4)進程的管道通信 編制一段程序,實現(xiàn)進程的管理通信。 使用系統(tǒng)調(diào)用pipe()建立一條管道線;兩個子進程P1和P2分別向管道中寫一句話: Child 1 is sendin
4、g a message! Child 2 is sending a message! 而父進程則從管道中讀出來自于兩個子進程的信息,顯示在屏幕上。 要求父進程先接收子進程P1發(fā)來的消息,然后再接收子進程P2發(fā)來的消息。二、實驗目的實驗2(1)加深對進程概念的理解,明確進程和程序的區(qū)別(2)進一步認識并發(fā)執(zhí)行的實質(3)分析進程競爭資源現(xiàn)象,學習解決進程互斥的方法。(4)了解Linux系統(tǒng)中進程通信的基本原理。實驗3Linux系統(tǒng)的進程通信機構 (IPC) 允許在任意進程間大批量地交換數(shù)據(jù)。本實驗的目的是了解和熟悉Linux支持的消息通訊機制及信息量機制。三、實驗題目本實驗有六個題目。第一題:進
5、程的創(chuàng)建系統(tǒng)調(diào)用fork()創(chuàng)建兩個子進程,當程序運行時,系統(tǒng)中有一個父進程一個子進程和一個孫子進程在活動,使父進程顯示b,子進程顯示c,孫子進程顯示a,來觀察進程的執(zhí)行與并發(fā)。開始創(chuàng)建子進程子進程是否創(chuàng)建輸出a是創(chuàng)建子進程子進程是否創(chuàng)建否否輸出c結束輸出b是第二題:進程的控制將上面程序的輸出由單個字符改為一句話,使輸出parent塊,son塊和grandchild塊,在此基礎上再設置另一個程序:在該程序中使用系統(tǒng)調(diào)用lockf()來給每個程序加鎖,lockf(1,1,0)鎖定標準輸出設備,lockf(1,0,0)解鎖標準輸出設備,在lockf(1,1,0)與lockf(1,0,0)中間的fo
6、r循環(huán)輸出不會被中斷,實現(xiàn)進程之間的互斥。觀察運行結果,從運行結果中可以看出加鎖的程序中每個塊的輸出過程不會被打斷,而沒有加鎖的程序中各塊輸出被其他塊給打斷了。未加鎖:加鎖:開始創(chuàng)建子進程子進程是否創(chuàng)建輸出parent是創(chuàng)建子進程子進程是否創(chuàng)建否否輸出grandchild結束輸出son是第三題:軟中斷通信 系統(tǒng)調(diào)用fork()創(chuàng)建兩個子進程,在調(diào)用signal()讓父進程捕捉鍵盤上來的中斷信號,當捕捉到中斷信號后,父進程用系統(tǒng)調(diào)用kill()向兩個子進程發(fā)出信號,子進程捕捉到信號后,輸出信息后終止。Kill(p1,16);Kill(p1,17);分別向p1和p2發(fā)出軟中斷信號16與17,信號由
7、signal(16,stop)與signal(17,stop)捕捉然后輸出相應的信息,終止進程。其中signal(SIGINT,SIG_IGN)能夠忽略鍵信號。第四題:進程的管道通信 使用系統(tǒng)調(diào)用pipe(fd);來創(chuàng)建一個管道。并且對管道加鎖,從而形成獨占,避免沖突產(chǎn)生。而父進程用之前的wait()函數(shù)等待兩個子進程執(zhí)行后再執(zhí)行。兩個子進程p1和p2分別向管道各寫一句話,父進程先接收子進程p1發(fā)來的消息,然后再接收子進程p2發(fā)來的消息。 第五題:消息的創(chuàng)建,發(fā)送和接收 使用系統(tǒng)調(diào)用msgget( ), megsnd( ), msgrev( )及msgctl()編制一長度為1K的消息發(fā)送和接收
8、的程序, 為了便于操作和觀察結果,用一個 程序為“引子”,先后fork( )兩個子進程,SERVER和CLIENT,進行通信。SERVER端建立一個Key為75的消息隊列,等待其他進程發(fā)來的消息。當遇到類型為1的消息,則作為結束信號,取消該隊列,并退出SERVER 。SERVER每接收到一個消息后顯示一句“(server)received”。 CLIENT端使用Key為75的消息隊列,先后發(fā)送類型從10到1的消息,然后退出。最后的一個消息,既是 SERVER端需要的結束信號。CLIENT每發(fā)送一條消息后顯示一句“(client)sent”。 父進程在 SERVER和 CLIENT均退出后結束。
9、 第六題:共享存儲區(qū)的創(chuàng)建,附接和斷接 用一個 程序為“引子”,先后fork( )兩個子進程,SERVER 和 CLIENT,進行通信。SERVER端建立一個KEY為75的共享區(qū),并將第一個字節(jié)置為-1.作為數(shù)據(jù)空的標志.等待其他進程發(fā)來的消息.當該字節(jié)的值發(fā)生變化時,表示收到了該消息,進行處理.然后再次把它的值設為-1.如果遇到的值為0,則視為結束信號,取消該隊列,并退出SERVER.SERVER每接收到一次數(shù)據(jù)后顯示”(server)received”. CLIENT端建立一個為75的共享區(qū),當共享取得第一個字節(jié)為-1時, Server端空閑,可發(fā)送請求. CLIENT 隨即填入9到0.期
10、間等待Server端再次空閑.進行完這些操作后, CLIENT 退出. CLIENT每發(fā)送一次數(shù)據(jù)后顯示”(client)sent”. 父進程在SERVER和CLIENT均退出后結束. 四 打印的源程序及附上的注釋和運行結果1.進程的創(chuàng)建:代碼:#include<stdio.h>main()int p1,p2; if(p1=fork()/獲得子進程號,在父進程內(nèi)。 putchar('b'); else/在子進程內(nèi) if(p2=fork()/子進程創(chuàng)建成功 putchar('c'); else putchar('a');/孫子進程執(zhí)行
11、運行結果:分析:從進程執(zhí)行并發(fā)來看,輸出abc的排列都是有可能的。原因:fork()創(chuàng)建進程所需的時間雖然可能多于輸出一個字符的時間,但各個進程的時間片的獲得卻不是一定是順序的,所以輸出abc的排列都是有可能的。2.進程的控制未加鎖代碼:#include<stdio.h>main()int p1,p2,i;if(p1=fork() for(i=0;i<100;i+) printf("parent %dn",i); wait(0);/保證在子進程終止前,父進程不會終止 exit(0);else if(p2=fork() for(i=0;i<100;i+
12、) printf("son %dn",i); wait(0);/保證在子進程終止前,父進程不會終止 exit(0); else for(i=0;i<100;i+) printf("grandchild %dn",i); exit(0); 運行結果:分析:由于函數(shù)printf()輸出的字符串之間不會被中斷,因此,每個字符串內(nèi)部的字符順序輸出時不變。但是 , 由于進程并發(fā)執(zhí)行時的調(diào)度順序和父子進程的搶占處理機問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結果相同。加鎖后代碼:#include<stdio.h>#inc
13、lude<unistd.h>main()int p1,p2,i;if(p1=fork() lockf(1,1,0); for(i=0;i<100;i+) printf("child %dn",i); lockf(1,0,0);else if(p2=fork() lockf(1,1,0); for(i=0;i<100;i+) printf("son %dn",i); lockf(1,0,0); else lockf(1,1,0); for(i=0;i<100;i+) printf("daughter %dn"
14、;,i); lockf(1,0,0); 運行結果:分析:因為上述程序執(zhí)行時,lockf(1,1,0)鎖定標準輸出設備,lockf(1,0,0)解鎖標準輸出設備,在lockf(1,1,0)與lockf(1,0,0)中間的for循環(huán)輸出不會被中斷,加鎖與不加鎖效果不相同。3.軟中斷通信代碼:#include<stdio.h>#include<signal.h>#include<unistd.h> void waiting(),stop();int wait_mark;main()int p1,p2;if(p1=fork() /*創(chuàng)建子進程p1*/if(p2=fo
15、rk()/*創(chuàng)建子進程p2*/wait_mark=1;signal(SIGINT,stop); /*接收到c信號,轉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);elsewait_mark=1;signal(SIGINT,stop);waiting();lockf(1,1,0);printf("child process2 is
16、killed by parent!n");lockf(1,0,0);exit(0);elsewait_mark=1;signal(SIGINT,stop);waiting();lockf(1,1,0);printf("child process1 is killed by parent!n");lockf(1,0,0);exit(0);void waiting()while (wait_mark!=0);void stop()wait_mark=0;分析:不做任何操作等待五秒鐘父進程回在子進程縣推出后退出,并打印退出的順序;或者點擊ctrl+C后程序退出并打印退出
17、的順序。代碼2:#include<stdio.h>#include<signal.h>#include<unistd.h>int pid1,pid2;int EndFlag=0;void IntDelete()/printf("%d,%d/n",pid1,pid2);kill(pid1,16);kill(pid2,17);void Int1()printf("child process 1 is killed !by parentn");exit(0);void Int2()printf("child pro
18、cess 2 is killed !by parentn");exit(0);main()int exitpid;if(pid1=fork()if(pid2=fork()signal(SIGINT,IntDelete);waitpid(-1,&exitpid,0);waitpid(-1,&exitpid,0);printf("parent process is killedn");exit(0);elsesignal(SIGINT,SIG_IGN);signal(17,Int2);pause();elsesignal(SIGINT,SIG_IGN)
19、;signal(16,Int1);pause();分析:signal(SIGINT,SIG-IGN)和signal(SIGQUIT,SIG-IGN)的作用是屏蔽從鍵盤上傳來的中斷信號,因此子進程可以接收到父進程傳來的軟中斷信號,進而先后打印出來兩個子進程和父進程的輸出內(nèi)容。4.進程的管道通信代碼:#include <unistd.h>#include <signal.h>#include <stdio.h>int pid1,pid2; main( ) int fd2;char outpipe100,inpipe100;pipe(fd); /*創(chuàng)建一個管道*/
20、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(1); /*自我阻塞5秒*/ lockf(fd1,0,0); exit(0); else while(pid2=fork( )=-1); if(pid2=0) lockf(fd1,1,0); /*互斥*/ sprintf(outpipe
21、,"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("%sn",inpipe); exit(0); 分析:管道通信通過系統(tǒng)調(diào)用pipe()初始化一個二元組為
22、管道,1出0進。父進程先接收子進程p1發(fā)來的消息,然后再接收子進程p2發(fā)來的消息。5.消息的創(chuàng)建,發(fā)送和接收代碼:#include <stdio.h> #include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75 /*定義關鍵詞MEGKEY*/struct msgform /*消息結構*/long mtype;char mtexe100; /*文本長度*/msg;int msgqid,i;void CLIENT( )int i;msgqid=msgg
23、et(MSGKEY,0777|IPC_CREAT);/printf("%d",msgqid);for(i=10;i>=1;i-) msg.mtype=i; printf("(client)sentn"); msgsnd(msgqid,&msg,1030,0); /*發(fā)送消息msg入msgid消息隊列*/exit(0);void SERVER( ) msgqid=msgget(MSGKEY,0777|IPC_CREAT); do msgrcv(msgqid,&msg,1030,0,0); /*從隊列msgid接受消息msg*/ pri
24、ntf("(server)receiven"); while(msg.mtype!=1); /*消息類型為1時,釋放隊列*/ msgctl(msgqid, IPC_RMID,0); exit(0);main() if(fork()SERVER();wait(0);/wait(0);else CLIENT( );分析:message的傳送和控制并不保證完全同步,當一個程序不再激活狀態(tài)的時候,它完全可能繼續(xù)睡眠,造成上面現(xiàn)象,在多次send message 后才 receive message.這一點有助于理解消息轉送的實現(xiàn)機理.6.共享存儲區(qū)的創(chuàng)建,附接和斷接代碼:#incl
25、ude<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#define SHMKEY 75 /*定義共享區(qū)關鍵詞*/int shmid,i;int *addr; CLIENT()int i;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*獲取共享區(qū),長度1024,關鍵詞SHMKEY*/addr=(void*)shmat(shmid,0,0); /*共享區(qū)起始地址為addr*/addr=shmat(shmid,0,0); /*共享區(qū)起始地址為addr*/for(i=9;i>=0;i-) while(*addr!= -2); printf("(client)sent%dn",i); /*打印(client
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療設備進貨合同范本
- 午托廚房合同范本
- 《荷花》教學反思三年級語文教學反思
- 《老狼》音樂教案
- 華夏聯(lián)??照{(diào)合同范本
- 縣城轉讓超市合同范本
- 口紅廠家合同范本
- 分期車貸合同范本
- 原版合同范例
- 《對稱圖形》教學反思
- GA/T 765-2020人血紅蛋白檢測金標試劑條法
- 第2章-西周-春秋戰(zhàn)國時期的音樂-1-3節(jié)課件
- 提高白云石配比對燒結生產(chǎn)的影響
- 公安基礎知識考試題庫(含各題型)
- 選礦試車方案
- 小課題專題研究參考題目
- 《最好的未來》合唱曲譜
- GB∕T 8081-2018 天然生膠 技術分級橡膠(TSR)規(guī)格導則
- 教學課件個人理財-2
- 航空航天概論(課堂PPT)
- 【圖文】煤礦井下常見的失爆現(xiàn)象
評論
0/150
提交評論