


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)實(shí)驗(yàn)三報(bào)告實(shí)驗(yàn)題目 :進(jìn)程管理及進(jìn)程通信實(shí)驗(yàn)環(huán)境 :虛擬機(jī) Linux 操作系統(tǒng)實(shí)驗(yàn)?zāi)康?:1. 利用 Linux 提供的系統(tǒng)調(diào)用設(shè)計(jì)程序, 加深對進(jìn)程概念的理解。2. 體會系統(tǒng)進(jìn)程調(diào)度的方法和效果。3. 了解進(jìn)程之間的通信方式以及各種通信方式的使用。實(shí)驗(yàn)內(nèi)容 :例程 1:利用 fork() 創(chuàng)建子進(jìn)程#include#include#includemain()int i;if (fork()i=wait(0);/* 父進(jìn)程執(zhí)行的程序段*/*等待子進(jìn)程結(jié)束*/printf(It is parent process.n);printf(The child process,ID numbe
2、r %d, is finished.n,i);elseprintf(It is child process.n);sleep(10);/* 子進(jìn)程執(zhí)行的程序段*/exit(1);/* 向父進(jìn)程發(fā)出結(jié)束信號*/運(yùn)行結(jié)果:思考:子進(jìn)程是如何產(chǎn)生的? 又是如何結(jié)束的?子進(jìn)程被創(chuàng)建后它的運(yùn)行環(huán)境是怎樣建立的?答:子進(jìn)程是通過函數(shù)fork()創(chuàng)建的,通過exit()函數(shù)自我結(jié)束的,子進(jìn)程被創(chuàng)建后核心將為其分配一個進(jìn)程表項(xiàng)和進(jìn)程標(biāo)識符, 檢查同時運(yùn)行的進(jìn)程數(shù)目, 并且拷貝進(jìn)程表項(xiàng)的數(shù)據(jù),由子進(jìn)程繼承父進(jìn)程的所有文件。例程 2:循環(huán)調(diào)用fork() 創(chuàng)建多個子進(jìn)程#include#include#inclu
3、demain() int i,j;printf(“ My pid is %d, my fatherns”pid,getpid()is%d,getppid();for(i=0; i3; i+)if(fork()=0)printf(“ %d pid=%d ppid=%dn” , i,getpid(),getppid();else j=wait(0);Printf(“ %d:The chile %d is finished”. ,getpid(),j);運(yùn)行結(jié)果:思考:畫出進(jìn)程的家族樹。子進(jìn)程的運(yùn)行環(huán)境是怎樣建立的?反復(fù)運(yùn)行此程序看會有什么情況?解釋一下。答:21440214412144521447
4、21442214442144621443子進(jìn)程的運(yùn)行環(huán)境是由將其創(chuàng)建的父進(jìn)程而建立的, 反復(fù)運(yùn)行程序會發(fā)現(xiàn)每個進(jìn)程標(biāo)識號在不斷改變,這是因?yàn)橥粫r間有許多進(jìn)程在被創(chuàng)建。例程 3:創(chuàng)建子進(jìn)程并用execlp() 系統(tǒng)調(diào)用執(zhí)行程序的實(shí)驗(yàn)#include#includemain()int child_pid1,child_pid2,child_pid3;int pid,status;setbuf(stdout,NULL);child_pid1=fork(); /*創(chuàng)建子進(jìn)程1*/if(child_pid1=0) execlp(echo,echo,child process 1,(char *)0);
5、 /*子進(jìn)程 1 啟動其它程序 */perror(exec1 error.n );exit(1);child_pid2=fork(); /*創(chuàng)建子進(jìn)程2*/if(child_pid2=0) execlp(date,date,(char *)0); /* 子進(jìn)程 2 啟動其它程序 */ perror(exec2 error.n );exit(2);child_pid3=fork(); /*創(chuàng)建子進(jìn)程3*/if(child_pid3=0) execlp(ls,ls,(char *)0); /*子進(jìn)程 3 啟動其它程序perror(exec3 error.n );exit(3);puts(Paren
6、t process is waiting for chile process return!);*/while(pid=wait(&status)!=-1) /*等待子進(jìn)程結(jié)束*/ if(child_pid1=pid) /*若子進(jìn)程1 結(jié)束 */printf(child process 1 terminated with status %dn,(status8);elseif(child_pid2=pid) /*若子進(jìn)程2 結(jié)束 */printf(child process 2 terminated with status %dn,(status8);else if(child_pid3=pi
7、d) /*若子進(jìn)程3 結(jié)束 */printf(child process 3 terminated with status %dn ,(status8);puts(All child processes terminated.);puts(Parent process terminated.);exit(0);運(yùn)行結(jié)果:思考:子進(jìn)程運(yùn)行其他程序后,進(jìn)程運(yùn)行環(huán)境怎樣變化的?反復(fù)運(yùn)行此程序看會有什么情況?解釋一下。答:子進(jìn)程運(yùn)行其他程序后,這個進(jìn)程就完全被新程序代替。由于并沒有產(chǎn)生新進(jìn)程所以進(jìn)程標(biāo)識號不改變,除此之外舊進(jìn)程的其它信息,代碼段, 數(shù)據(jù)段, 棧段等均被新程序的信息所代替。 新程序從自己
8、的 main() 函數(shù)開始運(yùn)行。 反復(fù)運(yùn)行此程序發(fā)現(xiàn)結(jié)束的先后次序是不可預(yù)知的, 每次運(yùn)行結(jié)果都不一樣。 原因是當(dāng)每個子進(jìn)程運(yùn)行其他程序時,他程序的結(jié)束而結(jié)束,所以結(jié)束的先后次序在改變。他們的結(jié)束隨著其例程 4:觀察父、子進(jìn)程對變量處理的影響#include#include#includeint globa=4;int main()pid_t pid;int vari=5;printf(before fork.n);if (pid=fork()0)printf(fork error.n);exit(0);elseif(pid=0)/* 子進(jìn)程執(zhí)行 */globa+;vari-;printf(C
9、hild %d changed the vari and globa.n,getpid();else/* 父進(jìn)程執(zhí)行 */wait(0);printf(Parent %d did not changed the vari and globa.n,getpid();printf(pid=%d, globa=%d, vari=%dn,getpid(),globa,vari);/* 都執(zhí)行 */exit(0);運(yùn)行結(jié)果:思考:子進(jìn)程被創(chuàng)建后,對父進(jìn)程的運(yùn)行環(huán)境有影響嗎?解釋一下。答:子進(jìn)程被創(chuàng)建后,對父進(jìn)程的運(yùn)行環(huán)境無影響,因?yàn)楫?dāng)子進(jìn)程在運(yùn)行時,它有自己的代碼段和數(shù)據(jù)段, 這些都可以作修改, 但是父
10、進(jìn)程的代碼段和數(shù)據(jù)段是不會隨著子進(jìn)程數(shù)據(jù)段和代碼段的改變而改變的。例程 5:管道通信的實(shí)驗(yàn)#include#includemain()int i,r,j,k,l,p1,p2,fd2;char buf50,s50;pipe(fd);while(p1=fork()=-1);if(p1=0)lockf(fd1,1,0);/* 子進(jìn)程 1 執(zhí)行 */* 管道寫入端加鎖*/sprintf(buf,Child process P1 is sending messages! n);printf(Child process P1! n);write(fd1,buf,50);lockf(fd1,0,0);/*
11、信息寫入管道 */* 管道寫入端解鎖*/sleep(5);j=getpid();k=getppid();printf(P1 %d is weakup. My parent process ID is %d.n,j,k);exit(0);else while(p2=fork()=-1); if(p2=0)lockf(fd1,1,0);/* 創(chuàng)建子進(jìn)程 2*/ /* 子進(jìn)程 2 執(zhí)行 */ /* 管道寫入端加鎖 */sprintf(buf,Child process P2 is sending messages! n);printf(Child process P2! n);write(fd1,b
12、uf,50);lockf(fd1,0,0);/* 信息寫入管道 */* 管道寫入端解鎖*/sleep(5);j=getpid();k=getppid();printf(P2 %d is weakup. My parent process ID is %d.n,j,k);exit(0);else l=getpid(); wait(0); if(r=read(fd0,s,50)=-1) printf(Cant read pipe. n); elseprintf(Parent %d: %s n,l,s); wait(0); if(r=read(fd0,s,50)=-1) printf(Cant re
13、ad pipe. n); elseprintf(Parent %d: %s n,l,s); exit(0);運(yùn)行結(jié)果:思考:( 1)什么是管道?進(jìn)程如何利用它進(jìn)行通信的?解釋一下實(shí)現(xiàn)方法。( 2)修改睡眠時機(jī)、睡眠長度,看看會有什么變化。解釋。( 3)加鎖、解鎖起什么作用?不用它行嗎?答:( 1)管道是指能夠連接一個寫進(jìn)程和一個讀進(jìn)程、并允許他們以生產(chǎn)者消費(fèi)者方式進(jìn)行通信的一個共享文件,又稱 pipe 文件。由寫進(jìn)程從管道的入端將數(shù)據(jù)寫入管道,而讀進(jìn)程則從管道的出端讀出數(shù)據(jù)來進(jìn)行通信。( 2)修改睡眠時機(jī)和睡眠長度都會引起進(jìn)程被喚醒的時間不一,因?yàn)樗邥r機(jī)決定進(jìn)程在何時睡眠,睡眠長度決定進(jìn)程何
14、時被喚醒。( 3)加鎖、解鎖是為了解決臨界資源的共享問題。 不用它將會引起無法有效的管理數(shù)據(jù),即數(shù)據(jù)會被修改導(dǎo)致讀錯了數(shù)據(jù)。例程 7:軟中斷信號實(shí)驗(yàn)#include#includemain()int i,j,k;int func();signal(18,func();if(i=fork()j=kill(i,18);/* 創(chuàng)建子進(jìn)程 */* 父進(jìn)程執(zhí)行 */* 向子進(jìn)程發(fā)送信號*/printf(Parent: signal 18 has been sent to child %d,returned %d.n,i,j);k=wait();/* 父進(jìn)程被喚醒 */printf(After wait
15、%d,Parent %d: finished.n,k,getpid();else/* 子進(jìn)程執(zhí)行 */sleep(10);printf(Child %d: A signal from my parent is recived.n,getpid(); /* 子進(jìn)程結(jié)束,向父進(jìn)程發(fā)子進(jìn)程結(jié)束信號*/func()/* 處理程序 */ int m; m=getpid();printf(I am Process %d: It is signal 18 processing function.n,m);運(yùn)行結(jié)果:思考:討論一下它與硬中斷有什么區(qū)別?答:硬中斷是由外部硬件產(chǎn)生的,而軟中斷是CPU根據(jù)軟件的某
16、條指令或者軟件對標(biāo)志寄存器的某個標(biāo)志位的設(shè)置而產(chǎn)生的。研究:什么是進(jìn)程?如何產(chǎn)生的?答:進(jìn)程是進(jìn)程實(shí)體的運(yùn)行過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位。一旦操作系統(tǒng)發(fā)現(xiàn)了要求創(chuàng)建新進(jìn)程的事件后, 便調(diào)用進(jìn)程創(chuàng)建原語 Creat() 按下述步驟創(chuàng)建一個新進(jìn)程:(1)申請空白 PCB。為新進(jìn)程申請獲得惟一的數(shù)字標(biāo)識符,并從 PCB集合中索取一個空白PCB。( 2)為新進(jìn)程分配資源。為新進(jìn)程的程序和數(shù)據(jù)以及用戶棧分配必要的內(nèi)存空間。顯然此時操作系統(tǒng)必須知道新進(jìn)程所需內(nèi)存的大小。 對于批處理作業(yè), 其大小可在用戶提出創(chuàng)建進(jìn)程要求時提供。 若是為應(yīng)用進(jìn)程創(chuàng)建子進(jìn)程, 也應(yīng)是在該進(jìn)程提出創(chuàng)建進(jìn)程的請求中
17、給出所需內(nèi)存的大小。 對于交互型作業(yè), 用戶可以不給出內(nèi)存要求而由系統(tǒng)分配一定的空間。 如果新進(jìn)程要共享某個已在內(nèi)在的地址空間 (即已裝入內(nèi)存的共享段) ,則必須建立相應(yīng)的鏈接。(3)初始化進(jìn)程控件塊。 PCB 的初始化包括: 1. 初始化標(biāo)識信息,將系統(tǒng)分配的標(biāo)識符和父進(jìn)程標(biāo)識符填入新 PCB中;2. 初始化處理機(jī)狀態(tài)信息, 使程序計(jì)數(shù)器指向程序的入口地址,使棧指針指向棧頂; 3. 初始化處理機(jī)控制信息, 將進(jìn)程的狀態(tài)設(shè)置為就緒狀態(tài)或靜止就緒狀態(tài),對于優(yōu)先級,通常是將它設(shè)置為最低優(yōu)先級,除非用戶以顯式方式提出高優(yōu)先級要求。(4)將新進(jìn)程插入就緒隊(duì)列,如果進(jìn)程就緒隊(duì)列能夠接納新進(jìn)程,便將新進(jìn)程
18、插入就緒隊(duì)列。進(jìn)程控制如何實(shí)現(xiàn)的?答:為了描述和控制進(jìn)程的運(yùn)行,系統(tǒng)為每個進(jìn)程定義了一個數(shù)據(jù)結(jié)構(gòu)進(jìn)程控制塊PCB,它是進(jìn)程實(shí)體的一部分,是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)結(jié)構(gòu)。PCB中記錄了操作系統(tǒng)所需的、用于描述進(jìn)程的當(dāng)前情況以及控制進(jìn)程運(yùn)行的全部信息。當(dāng)系統(tǒng)創(chuàng)建一個新進(jìn)程時,就為它建立了一個PCB;進(jìn)程結(jié)束時又回收其PCB,進(jìn)程于是也隨之消亡。進(jìn)程通信方式各有什么特點(diǎn)?答:高級通信機(jī)制可歸結(jié)為三大類:共享存儲器系統(tǒng)、消息傳遞系統(tǒng)以及管道通信系統(tǒng)。在共享存儲器系統(tǒng)中, 相互通信的進(jìn)程共享某些數(shù)據(jù)結(jié)構(gòu)或共享存儲區(qū), 進(jìn)程之間能夠通過這些空間進(jìn)行通信。消息傳遞系統(tǒng)中,進(jìn)程間的數(shù)據(jù)交換是以格式化的消息為單位的。管道通信系統(tǒng)能有效地傳送大量數(shù)據(jù),因而又被引入到許多其它操作系統(tǒng)中。管道通信如何實(shí)現(xiàn)?該通信方式可以用在何
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度雇主免責(zé)協(xié)議書:航空航天領(lǐng)域雇主責(zé)任界定合同
- 2025年度產(chǎn)業(yè)轉(zhuǎn)型升級信息咨詢服務(wù)合同
- 2025年度農(nóng)產(chǎn)品質(zhì)量安全監(jiān)管與風(fēng)險評估合作協(xié)議
- 2025年度國際會展中心招商合作合同協(xié)議
- 2025年度臨時工臨時性數(shù)據(jù)錄入與處理合同
- 2025年度出租房屋裝修改造及租賃糾紛解決協(xié)議
- 2025年度區(qū)塊鏈技術(shù)應(yīng)用合伙投資合同
- 2025年度城市老舊建筑拆除勞務(wù)合作合同
- 2025年度教師聘用的教育教學(xué)改革與創(chuàng)新合同
- 親子樂園裝修合同樣板
- 絲綢之路上的民族學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 四年級語文下冊第六單元【集體備課】(教材解讀+教學(xué)設(shè)計(jì))
- 分子生物學(xué)在醫(yī)藥中的研究進(jìn)展及應(yīng)用
- 《對折剪紙》)ppt
- 03SG520-1實(shí)腹式鋼吊車梁(中輕級工作制A1~A5_Q235鋼_跨度6.0m、7.5m、9.0m)
- 以虛報(bào)注冊資本、虛假出資、抽逃出資為由對實(shí)行認(rèn)繳資本登記制的公司進(jìn)行處罰無法律依據(jù)
- 風(fēng)電場生產(chǎn)運(yùn)營準(zhǔn)備大綱11.14
- 人教版八年級語文下冊教材研說
- 《機(jī)械制造裝備設(shè)計(jì)》ppt課件
- 中學(xué)家訪記錄大全100篇 關(guān)于中學(xué)家訪隨筆
- 小學(xué)綜合實(shí)踐活動_植物的繁殖—扦插
評論
0/150
提交評論