操作系統(tǒng)試驗(yàn)_第1頁(yè)
操作系統(tǒng)試驗(yàn)_第2頁(yè)
操作系統(tǒng)試驗(yàn)_第3頁(yè)
操作系統(tǒng)試驗(yàn)_第4頁(yè)
操作系統(tǒng)試驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(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)介

1、操作系統(tǒng)實(shí)驗(yàn)報(bào)告 2013/2014 學(xué)年 第 2 學(xué)期系 別 * 專 業(yè) * 班 級(jí) * 姓 名 * 學(xué) 號(hào) * 授課老師 * *學(xué)院實(shí)驗(yàn)報(bào)告 姓名: 課程名稱:* 院(系):計(jì)算機(jī)學(xué)院 專業(yè)/年級(jí):*實(shí)驗(yàn)項(xiàng)目二 進(jìn)程管理一、實(shí)驗(yàn)?zāi)康?. 理解進(jìn)程的概念,掌握父、子進(jìn)程創(chuàng)建的方法。2. 認(rèn)識(shí)和了解并發(fā)執(zhí)行的實(shí)質(zhì),掌握進(jìn)程的并發(fā)及同步操作。二、實(shí)驗(yàn)內(nèi)容1. 編寫(xiě)一C語(yǔ)言程序,實(shí)現(xiàn)在程序運(yùn)行時(shí)通過(guò)系統(tǒng)調(diào)用fork( )創(chuàng)建兩個(gè)子進(jìn)程,使父、子三進(jìn)程并發(fā)執(zhí)行,父親進(jìn)程執(zhí)行時(shí)屏幕顯示“I am father”,兒子進(jìn)程執(zhí)行時(shí)屏幕顯示“I am son”,女兒進(jìn)程執(zhí)行時(shí)屏幕顯示“I am daught

2、er”。2. 多次連續(xù)反復(fù)運(yùn)行這個(gè)程序,觀察屏幕顯示結(jié)果的順序,直至出現(xiàn)不一樣的情況為止。記下這種情況,試簡(jiǎn)單分析其原因。3. 修改程序,在父、子進(jìn)程中分別使用wait()、exit()等系統(tǒng)調(diào)用“實(shí)現(xiàn)”其同步推進(jìn),并獲取子進(jìn)程的ID號(hào)及結(jié)束狀態(tài)值。多次反復(fù)運(yùn)行改進(jìn)后的程序,觀察并記錄運(yùn)行結(jié)果。三、源程序及運(yùn)行結(jié)果源程序1:#include<sys/types.h>#include<unistd.h>#include<stdlib.h>#include<stdio.h>int main() char *massage; int i; int pi

3、d=fork(); if(pid<0) printf("error"); else if(pid=0) massage="I am sonn" i=4; else i=4; pid=fork(); if(pid=0) massage="I am daugthern" else massage="I am fathern" for(;i>0;i-) printf("%s",massage); sleep(1);return 0;運(yùn)行結(jié)果:(截圖)源程序2:#include <sy

4、s/types.h>#include <unistd.h>#include <stdio.h>#include <sys/wait.h>#include <stdlib.h>int main(int argc,char *argv) int pid,status,i ; pid=fork(); if(pid<0) printf("error!"); if(pid=0) printf("I am son.My process ID is %d.n",getpid(); exit(5); else

5、sleep(1); printf("I am father.My process ID is %d.wait for child.n",getpid(); pid=wait(&status); i=WEXITSTATUS(status); printf("My child's ID is %d.exit status=%dn",pid,i); 運(yùn)行結(jié)果:四、實(shí)驗(yàn)分析與總結(jié)1. 實(shí)驗(yàn)內(nèi)容1運(yùn)行結(jié)果為什么無(wú)固定順序,fork()函數(shù)創(chuàng)建進(jìn)程是如何并發(fā)執(zhí)行的。 答:因?yàn)槭遣l(fā)執(zhí)行的,fork()函數(shù)創(chuàng)建的三個(gè)進(jìn)程搶占CPU不同,從而導(dǎo)致三個(gè)進(jìn)被

6、CPU調(diào)用執(zhí)行的順序不同,從而輸出的結(jié)果無(wú)固定順序;fork()函數(shù)調(diào)用成功后,子進(jìn)程與父進(jìn)程并發(fā)執(zhí)行相同的代碼,但由于子進(jìn)程也繼承了父進(jìn)程的程序指針,所以子進(jìn)程是從fork()后的語(yǔ)句開(kāi)始執(zhí)行,另外fork在子進(jìn)程和父進(jìn)程中的返回值是不同的,在父進(jìn)程中返回子進(jìn)程的PID,而在子進(jìn)程中返回0,使父進(jìn)程和子進(jìn)程執(zhí)行不同的分支,從而實(shí)現(xiàn)了進(jìn)程的并發(fā)執(zhí)行。2. 實(shí)驗(yàn)內(nèi)容3是如何實(shí)現(xiàn)父子進(jìn)程的同步執(zhí)行的。 答:wait()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號(hào)來(lái)到或子進(jìn)程結(jié)束。程序段主要使用了函數(shù)wait()和, exit()這是 因 為 父 進(jìn) 程 必 須等待兩個(gè)子進(jìn)程終止后才終。在父進(jìn)程中調(diào)用wai

7、t()函數(shù),則父進(jìn)程被阻塞,進(jìn)入等待隊(duì)列,等待子進(jìn)程結(jié)束。子進(jìn)程終止時(shí)執(zhí)行exit()向父進(jìn)程發(fā)終止信號(hào),當(dāng)接到信號(hào)后,父進(jìn)提取子進(jìn)程的結(jié)束狀態(tài)值,從wait()返回繼續(xù)執(zhí)行原程序,從而實(shí)現(xiàn)了父、子進(jìn)程的同步推進(jìn)。實(shí)驗(yàn)項(xiàng)目三 進(jìn)程調(diào)度一、實(shí)驗(yàn)?zāi)康?.理解進(jìn)程控制塊和進(jìn)程組織方式;2.掌握時(shí)間片輪轉(zhuǎn)調(diào)度算法實(shí)現(xiàn)處理機(jī)調(diào)度。二、實(shí)驗(yàn)內(nèi)容1. 建立合理的PCB數(shù)據(jù)結(jié)構(gòu),建立含有8個(gè)進(jìn)程結(jié)點(diǎn)的就緒隊(duì)列,每個(gè)進(jìn)程的要求運(yùn)行時(shí)間隨機(jī)產(chǎn)生,要求每個(gè)進(jìn)程的要求運(yùn)行時(shí)間不大于15。2. 設(shè)置時(shí)間片大小(36),使用時(shí)間片輪轉(zhuǎn)調(diào)度算法實(shí)現(xiàn)處理機(jī)調(diào)度。三、源程序及運(yùn)行結(jié)果源程序:#include<time.h

8、>#include<stdio.h>#include<stdlib.h>#include<malloc.h> #define NUM 8 #define LEN sizeof(PCB)typedef struct PCBint name;int runtime; int runedtime;int killtime;struct PCB *next;PCB;void main() int timeslice=6,i; PCB *top,*tail,*temp,*runqueue; srand(int)time(0); for(i=0;i<NUM;

9、i+) temp=(PCB*)malloc(LEN); temp->name=i; temp->runtime=rand()%15; temp->runedtime=0; temp->next=NULL; temp->killtime=0; if(i=0) top=temp; tail=temp; else tail->next=temp; tail=temp; printf("process name %d,runtime=%d,runedtime=%d,killtime=%dn",tail->name,tail->runt

10、ime,tail->runedtime,tail->killtime);printf("*n");while(top!=NULL)runqueue=top;top=top->next;runqueue->next=NULL;runqueue->runtime=runqueue->runtime-timeslice;if(runqueue->runtime<=0)runqueue->killtime=runqueue->runtime+timeslice;runqueue->runedtime=runqueue

11、->killtime+runqueue->runedtime;runqueue->runtime=0;printf("process name %d,runtime=%d,runedtime=%d,killtime=%d(.END.)n",runqueue->name,runqueue->runtime,runqueue->runedtime,runqueue->killtime); else runqueue->killtime=timeslice; runqueue->runedtime=runqueue->r

12、unedtime+runqueue->killtime; printf("process name %d,runtime=%d,runedtime=%d,killtime=%dn", runqueue->name,runqueue->runtime,runqueue->runedtime,runqueue->killtime); tail->next=runqueue;tail=tail->next; 運(yùn)行結(jié)果:(截圖)四、實(shí)驗(yàn)分析與總結(jié)對(duì)實(shí)驗(yàn)運(yùn)行結(jié)果進(jìn)行分析:如果時(shí)間片設(shè)置值過(guò)大或過(guò)小,會(huì)對(duì)進(jìn)程的調(diào)度產(chǎn)生何種影響。答:時(shí)間片輪轉(zhuǎn)算

13、法調(diào)度的過(guò)程是首先取就緒隊(duì)列的隊(duì)首結(jié)點(diǎn)為運(yùn)行隊(duì)列的結(jié)點(diǎn),修改就緒隊(duì)列隊(duì)首指針后移;然后調(diào)度運(yùn)行隊(duì)列結(jié)點(diǎn),即運(yùn)行隊(duì)列結(jié)點(diǎn)的要求運(yùn)行時(shí)間減去時(shí)間片時(shí)間;若修改后要求運(yùn)行時(shí)間<=0,則表示該進(jìn)程結(jié)點(diǎn)運(yùn)行完畢,修改進(jìn)程結(jié)點(diǎn)的PCB信息,記錄runtime,runedtime,killtime等信息,并將結(jié)點(diǎn)信息輸出。 否則,表示該進(jìn)程結(jié)點(diǎn)未完成,記錄runtime,runedtime,killtime等信息,將結(jié)點(diǎn)信息輸出。并將該結(jié)點(diǎn)置于就緒隊(duì)列的隊(duì)尾,等待下次調(diào)度,同時(shí)修改隊(duì)尾指針。若就緒隊(duì)列非空,則繼續(xù)執(zhí)行第1步,直至就緒隊(duì)列為空。  如果時(shí)間片設(shè)置過(guò)大使得每個(gè)

14、進(jìn)程能在一個(gè)時(shí)間片內(nèi)完成,時(shí)間片輪轉(zhuǎn)算法便退化為FCFS算法,無(wú)法滿足交互式用戶的需求。時(shí)間片設(shè)置過(guò)小,使得有些進(jìn)程不能在一個(gè)時(shí)間片內(nèi)運(yùn)行完,會(huì)頻繁的發(fā)生中斷、進(jìn)程上下文的切換,從而增加系統(tǒng)開(kāi)銷,但有利于短作業(yè)。實(shí)驗(yàn)項(xiàng)目四 進(jìn)程通信一、 實(shí)驗(yàn)?zāi)康?.了解什么是消息,熟悉消息傳送原理。2.了解和熟悉共享存儲(chǔ)機(jī)制。3.掌握消息的發(fā)送與接收的實(shí)現(xiàn)方法。二、實(shí)驗(yàn)內(nèi)容1.根據(jù)消息傳送機(jī)理,使用系統(tǒng)調(diào)用msgget( ), msgsnd( ), msgrev( ), 及msgctl( )編制一長(zhǎng)度為k的消息發(fā)送和接收的程序,要求在程序中完成10次消息的發(fā)送和接收,每次發(fā)送消息結(jié)束和接收消息結(jié)束都需給出相應(yīng)

15、的屏幕提示,且每次發(fā)送的的內(nèi)容不少于一個(gè)字符,并能在接收端輸出。2.根據(jù)共享存儲(chǔ)區(qū)原理,使用系統(tǒng)調(diào)用shmget( ), shmat( ), shmdt( ), 及shctl( )編制程序,要求創(chuàng)建一個(gè)長(zhǎng)度為k的共享存儲(chǔ)區(qū),并完成10次數(shù)據(jù)的發(fā)送和接收,每次發(fā)送數(shù)據(jù)結(jié)束和接收數(shù)據(jù)結(jié)束都需給出相應(yīng)的屏幕提示,且每次發(fā)送的的數(shù)據(jù)應(yīng)能在接收端輸出。三、源程序及運(yùn)行結(jié)果1.源程序:#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/msg.h>#include<s

16、ys/ipc.h>#define MSGKEY 75 /定義關(guān)鍵詞MEGKEYstruct msgform/消息結(jié)構(gòu)long mtype; int mtext1024;/文本長(zhǎng)度msg;int msgqid,i; void CLIENT( ) int i; msgqid=msgget(MSGKEY,0777); for(i=10;i>=1;i-) msg.mtype=i; msg.mtexti=i; printf("(client)sentn"); msgsnd(msgqid,&msg,1024,0);/發(fā)送消息msg入msgid消息隊(duì)列 exit(0)

17、;void SERVER( ) msgqid=msgget(MSGKEY,0777|IPC_CREAT);/由關(guān)鍵字獲得消息隊(duì)列 do msgrcv(msgqid,&msg,1024,0,0);/從隊(duì)列msgid接受消息msg printf("%d ",msg.mtextmsg.mtype); printf("(server)receiven"); while(msg.mtype!=1);/消息類型為1時(shí),釋放隊(duì)列msgctl(msgqid,IPC_RMID,0);exit(0);main() if(fork() SERVER(); else C

18、LIENT(); wait(0); wait(0);運(yùn)行結(jié)果:(截圖)2.源程序:#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/shm.h>#include<sys/ipc.h>#define SHMKEY 75int shmid,i;char *addr;client() int i; shmid=shmget(SHMKEY,1024,0777);/獲取共享區(qū)長(zhǎng)度1024,關(guān)鍵詞SHMKEY addr=shmat(shmid,0,0);/共享

19、區(qū)起始地址為addr for(i=9;i>=0;i-) while(*addr!=-1); printf("(client)sentn");/打印(client)sent *addr='a'+i;/把i賦給addr exit(0);server() shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);/創(chuàng)建共享區(qū) addr=shmat(shmid,0,0);/共享區(qū)起始地址為addr for(i=0;i<10;i+) *addr=-1; while(*addr=-1); printf("%c",*

20、addr); printf(" (server)receivedn");/服務(wù)進(jìn)程使用共享區(qū) shmctl(shmid,IPC_RMID,0);exit(0);main()if(fork()server();if(fork()client();wait(0);wait(0);運(yùn)行結(jié)果:(截圖)四、實(shí)驗(yàn)分析與總結(jié)對(duì)實(shí)驗(yàn)運(yùn)行結(jié)果進(jìn)行分析:試比較實(shí)驗(yàn)中兩種方法實(shí)現(xiàn)進(jìn)程通信的不同之處。答:消息隊(duì)列的建立比共享區(qū)的設(shè)立消耗的資源少.前者只是一個(gè)軟件上設(shè)定的問(wèn)題,后者需要對(duì)硬件操作,實(shí)現(xiàn)內(nèi)存的映像,當(dāng)然控制起來(lái)比前者復(fù)雜.如果每次都重新進(jìn)行隊(duì)列或共享的建立,共享區(qū)的設(shè)立沒(méi)有什么優(yōu)勢(shì)。&

21、#160; 當(dāng)消息隊(duì)列和共享區(qū)建立好后,共享區(qū)的數(shù)據(jù)傳輸,受到了系統(tǒng)硬件的支持,不耗費(fèi)多余的資源;而消息傳遞,由軟件進(jìn)行控制和實(shí)現(xiàn),需要消耗一定的CPU資源.從這個(gè)意義上講,共享區(qū)更適合頻繁和大量的數(shù)據(jù)傳輸.  消息的傳遞,自身就帶有同步的控制.當(dāng)?shù)鹊较⒌臅r(shí)候,進(jìn)程進(jìn)入睡眠狀態(tài),不再消耗CPU資源.而共享隊(duì)列如果不借助其他機(jī)制進(jìn)行同步,接受數(shù)據(jù)的一方必須進(jìn)行不斷的查詢,白白浪費(fèi)了大量的CPU資源。 實(shí)驗(yàn)項(xiàng)目五 存儲(chǔ)管理一、 實(shí)驗(yàn)?zāi)康?. 熟悉內(nèi)存空閑分區(qū)的分配方式;4. 理解動(dòng)態(tài)分區(qū)存儲(chǔ)管理方式;5. 掌握動(dòng)態(tài)分區(qū)的分配與回收的過(guò)程。二、 實(shí)驗(yàn)內(nèi)容使用一個(gè)鏈表來(lái)

22、模擬內(nèi)存存儲(chǔ)空間,建立內(nèi)存塊來(lái)記錄內(nèi)存分配使用情況,通過(guò)隨機(jī)產(chǎn)生進(jìn)程及其所需要的內(nèi)存來(lái)模擬真實(shí)的進(jìn)程。通過(guò)給進(jìn)程分配內(nèi)存及回收來(lái)實(shí)現(xiàn)對(duì)動(dòng)態(tài)分區(qū)存儲(chǔ)管理方法。編制程序完成上述內(nèi)容,內(nèi)存空間大小為100,進(jìn)程數(shù)為5,每個(gè)進(jìn)程所需空間為隨機(jī)產(chǎn)生,大小為120,首先對(duì)5個(gè)進(jìn)程進(jìn)行內(nèi)存分配,然后回收指定的進(jìn)程空間,并進(jìn)行適當(dāng)?shù)目臻e分區(qū)合并操作,要求每次操作結(jié)束后都能顯示當(dāng)前的內(nèi)存分配情況。三、 源程序及運(yùn)行結(jié)果源程序:#include<stdio.h>#include<time.h>#include<malloc.h> #define NUM 5 #define LE

23、N sizeof(MEMORY_BLOCK) typedef struct MEMORY_BLOCK int name; int address; int length; int flag; struct MEMORY_BLOCK *next; MEMORY_BLOCK; void allocation(MEMORY_BLOCK *Header,int name,int length_p) MEMORY_BLOCK *temp,*t; int minsize=2; t=Header; while(t!=0) if(t->length>length_p&&t->

24、flag=0) break; t=t->next; if(t->length-length_p>minsize) temp=(MEMORY_BLOCK*)malloc(LEN); temp->name=-1; temp->flag=0; temp->length=t->length-length_p; temp->address=t->address+length_p; t->name=name; t->flag=1; t->length=length_p; temp->next=t->next; t->

25、next=temp; else t->name=name; t->flag=1; void main() int length_p,i,processname; MEMORY_BLOCK *Header,*t; Header=(MEMORY_BLOCK*)malloc(LEN);Header->name=-1; Header->address=0; Header->length=100; Header->flag=0; Header->next=NULL; srand(int)time(0); for(i=1;i<=NUM;i+) length_

26、p=rand()%20+1; allocation(Header,i,length_p); printf("當(dāng)前內(nèi)存分配情況: n"); t=Header; while(t!=0) printf("process name=%d,address=%d,length=%d,flag=%dn", t->name, t->address, t->length,t->flag); t=t->next; 運(yùn)行結(jié)果:(截圖)四、 實(shí)驗(yàn)分析與總結(jié)對(duì)實(shí)驗(yàn)運(yùn)行結(jié)果進(jìn)行分析: 程序采用的是何種動(dòng)態(tài)分區(qū)分配算法,寫(xiě)出判斷依據(jù),并分析該算法的優(yōu)缺點(diǎn)。答:采用的是首次適應(yīng)算法,程序使用一個(gè)鏈表來(lái)模擬內(nèi)存存儲(chǔ)空間,以地址遞增的順序鏈接。該算法傾向于優(yōu)先利用內(nèi)存中低地址部分的空閑分區(qū),保留了高地址部分的大空閑分區(qū),為后來(lái)的大作業(yè)分配大內(nèi)存創(chuàng)造了條件;其缺點(diǎn)是低地址部分被不斷劃分,留下了許多小的空閑分區(qū),而每次查找又是從低地址部分開(kāi)始的,從而增加了查找可用空閑分區(qū)時(shí)的開(kāi)銷。實(shí)驗(yàn)項(xiàng)目六 Shell程

溫馨提示

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