級操作系統(tǒng)實驗報告_第1頁
級操作系統(tǒng)實驗報告_第2頁
級操作系統(tǒng)實驗報告_第3頁
級操作系統(tǒng)實驗報告_第4頁
級操作系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、哈 爾 濱 學(xué) 院實 驗 報 告課程名稱: 計算機操作系統(tǒng) 專 業(yè): 軟件工程 班 級: 12-8 學(xué) 號: 12031801 姓 名: 常燕如 教務(wù)處制實驗一 進程管理【實驗?zāi)康呐c要求】 加深對進程概念的理解,明確進程與程序的區(qū)別。 掌握Linux進程創(chuàng)建及撤銷的方法,進一步認(rèn)識并發(fā)執(zhí)行的實質(zhì)。 掌握Linux系統(tǒng)下守護進程的創(chuàng)建方法。【實驗原理】 Linux進程管理命令進程查看進程終止進程優(yōu)先級設(shè)置 Linux進程控制函數(shù)創(chuàng)建和修改進程設(shè)置進程屬性獲取進程屬性進程的退出 Linux守護進程獨立啟動守護進程超級守護進程守護進程的編寫流程 守護進程的編寫遵循特定的流程,主要包括五個步驟: St

2、ep 創(chuàng)建子進程,退出父進程 Step 在子進程中創(chuàng)建新會話 Step 改變當(dāng)前目錄為根目錄 Step 重設(shè)文件權(quán)限掩碼 Step 關(guān)閉文件描述符【實驗主要儀器與材料】 帶Linux操作系統(tǒng)的PC機 GCC編譯器【實驗內(nèi)容】 獲取進程信息通過管理命令,獲取系統(tǒng)當(dāng)前執(zhí)行進程的信息,包括進程名稱與ID、PID和PGID等。 創(chuàng)建進程編程程序,實現(xiàn)父進程創(chuàng)建一個子進程,返回后父子進程都分別循環(huán)輸出字符串“I am parent.”或“I am child.”5次,每輸出一次延時1秒(sleep(1),然后進入下一次循環(huán)。觀察并分析運行結(jié)果。然后將程序改為父子進程同步執(zhí)行:子進程循環(huán)輸出字符串“I a

3、m child.”5次,然后父進程再循環(huán)輸出字符串“I am parent.”5次。再次觀察并分析運行結(jié)果?!緦嶒灢襟E及實驗結(jié)果分析】 實驗內(nèi)容1 通過進程實現(xiàn)及驗證父進程及子進程的id號的命令ps -lg 實驗內(nèi)容2實現(xiàn)父進程創(chuàng)建一個子進程,返回后父子進程都分別循環(huán)輸出字符串“I am parent.”或“I am child.”5次,每輸出一次延時1秒(sleep(1),然后進入下一次循環(huán)。 #include<sys/types.h>#include<unistd.h>#include<stdio.h>int main() pid_t pt; print

4、f("Hello world!n"); int i; pt=fork(); for(i=0;i<5;i+) if(pt=-1) printf("Fork error.n"); else if printf("I am a parent.n");Sleep(1); else printf("I am a child.n");Sleep(1); return 0; 父子進程同步執(zhí)行:子進程循環(huán)輸出字符串“I am child.”5次,然后父進程再循環(huán)輸出字符串“I am parent.”5次。#include&l

5、t;sys/types.h>#include<unistd.h>#include<stdio.h>int main() pid_t pt; printf("Hello world!n"); int i; pt=fork(); for(i=0;i<5;i+) if(pt=-1) printf("Fork error.n"); else if printf("I am a parent.n"); else printf("I am a child.n"); return 0;【思考題

6、】 程序和進程的區(qū)別。 (1)程序是動態(tài)的,程序是靜態(tài)的:程序是有序代碼的集合;進程是程序的執(zhí)行。通常進程不可在計算機之間遷移;而程序通常對應(yīng)著文件、靜態(tài)和可以復(fù)制。 (2)進程是暫時的,程序是永久的:進程是一個狀態(tài)變化的過程,程序可長久保存。 (3)進程和程序的組成不同:進程的組成包括程序、數(shù)據(jù)和進程控制塊(即進程狀態(tài)信息)。 (4)進程和程序的對應(yīng)關(guān)系:通過多次執(zhí)行,一個程序可對應(yīng)多個進程;通過調(diào)用關(guān)系,一個進程可包括多個程序。 Linux操作系統(tǒng)下有哪些進程類型。 交互進程; 批處理進程; 守護進程; 進程創(chuàng)建函數(shù)fork和vfork的區(qū)別。 (1)fork()用于創(chuàng)建一個新進程。由fo

7、rk()創(chuàng)建的子進程是父進程的副本。即子進程 獲取父進程數(shù)據(jù)空間,堆和棧的副本。父子進程之間不共享這些存儲空間的部分。而vfork()創(chuàng)建的進程并不將父進程的地址空間完全復(fù)制到子進程中,因為子進程會立即調(diào)用exec (或exit)于是也就不會存放該地址空間。相反,在子進程調(diào)用exec或exit之前,它在父進程的空間進行。 (2)vfork()與fork()另一個區(qū)別就是:vfork保證子進程先運行,在調(diào)用exec或exit之前與父進程數(shù)據(jù)是共享的,在它調(diào)用exec或exit之后父進程才可能被調(diào)度運行。 (3)vfork和fork之間的還有一個區(qū)別是:vfork保證子進程先運行,在她調(diào)用exec

8、或exit之后父進程才可能被調(diào)度運行。如果在調(diào)用這兩個函數(shù)之前子進程依賴于父進程的進一步動作,則會導(dǎo)致死鎖。 進程的退出函數(shù)有哪些?有何區(qū)別?C程序是如何被啟動終止的? exit 函數(shù); return 函數(shù); abort函數(shù) _exit函數(shù)。 exit和_exit函數(shù)用于正常終止一個程序 exit先執(zhí)行一些清除處理.然后進入內(nèi)核清除操作包括調(diào)用執(zhí)行各終止處理程序,關(guān)閉所有標(biāo)準(zhǔn)I/O流 _exit立即進入內(nèi)核 abort函數(shù)用于異常終止一個程序 exit是一個函數(shù),有參數(shù),把控制權(quán)交給系統(tǒng) return是函數(shù)執(zhí)行完后的返回,將控制權(quán)交給調(diào)用函數(shù)1 / 16文檔可自由編輯打印實驗二 進程通信【實驗

9、目的與要求】 了解基于信號的進程通信機制。 熟悉LINUX系統(tǒng)中進程之間軟中斷通信的基本原理?!緦嶒炘怼?一、信號 信號的基本概念 信號的發(fā)送 對信號的處理 二、所涉及的中斷調(diào)用 kill() signal() wait() waitpid() lockf()【實驗主要儀器與材料】 帶Linux操作系統(tǒng)的PC機 GCC編譯器【實驗內(nèi)容】 編寫程序:用fork()創(chuàng)建兩個子進程,再用系統(tǒng)調(diào)用signal()讓父進程捕捉鍵盤上來的中斷信號(即按c鍵);捕捉到中斷信號后,父進程用系統(tǒng)調(diào)用kill()向兩個子進程發(fā)出信號,子進程捕捉到信號后分別輸出下列信息后終止:Child process1 is

10、killed by parent!Child process2 is killed by parent!父進程等待兩個子進程終止后,輸出如下的信息后終止:Parent process is killed! 分析利用軟中斷通信實現(xiàn)進程同步的機理?!緦嶒灢襟E及實驗結(jié)果分析】 編寫程序:用fork()創(chuàng)建兩個子進程,再用系統(tǒng)調(diào)用signal()讓父進程捕捉鍵盤上來的中斷信號(即按c鍵);捕捉到中斷信號后,父進程用系統(tǒng)調(diào)用kill()向兩個子進程發(fā)出信號,子進程捕捉到信號后分別輸出下列信息后終止:Child process1 is killed by parent!Child process2 is

11、killed by parent!父進程等待兩個子進程終止后,輸出如下的信息后終止:Parent process is killed! 對軟中斷信號的處理分三種情況進行: (1)如果進程收到的軟中斷是一個已決定要忽略的信號,不做處理便立即返回。 (2)進程收到軟中斷后便退出。 (3)執(zhí)行用戶設(shè)置的軟中斷處理程序?!舅伎碱}】實驗內(nèi)容的參考程序如下,請仔細閱讀、調(diào)試、分析,回答下述問題:#include <stdio.h>#include <signal.h>#include <unistd.h>#include <stdlib.h>#include

12、 <sys/wait.h> void waiting(),stop();int wait_mark; int main()int p1, p2, stdout=1;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*/wai

13、t(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*/wait

14、ing();lockf(stdout, 1, 0);printf("Child process 1 is killed by parent!n");lockf(stdout, 0, 0);exit(0);return 0;void waiting()while(wait_mark != 0);void stop()wait_mark=0; 參考程序段前面部分用了兩個wait(0),它們起什么作用?作用:wait(0)函數(shù)作用是等待子進程結(jié)束,父進程有兩個子進程,所以兩個wait函數(shù)。 參考程序段中每個進程退出時都用了語句exit(0),為什么?作用:是為了讓子進程正常自我終

15、止,正常退出。 參考程序的運行結(jié)果是什么?Parent process is killed! 參考程序是否符合實驗要求?為什么?不符合。原因:p1,p2都會捕捉中斷信號。對于父進程,當(dāng)它捕捉到中斷信號時就會轉(zhuǎn)向指定的函數(shù)stop();函數(shù),之后父進程被喚醒,從被中斷處繼續(xù)執(zhí)行。對于子進程,由于沒有給它們指定的收到中斷信號后的動作,就會執(zhí)行默認(rèn)的動作,結(jié)束自己。所以當(dāng)我們發(fā)出中斷信號后,父進程按預(yù)計的方式正常執(zhí)行,而p1,p2自己結(jié)束了自己,所以不會有預(yù)計的結(jié)果。 參考程序該如何修改才能得到正確結(jié)果?第一種方法:在fork()語句創(chuàng)建子進程之前捕捉中斷信號,既signal(SIGINT, sto

16、p);。第二種方法:在每個子進程前添加忽略中斷信號的語句,既signal(SIGINT,SIG_IGN);。第三種方法:打開兩個界面,一個界面正常編譯,另一個界面執(zhí)行:ps -aps -a|grep a.outkill -s INT 11313實驗三 內(nèi)存管理【實驗?zāi)康呐c要求】 了解虛擬存儲技術(shù)的特點。 掌握請求頁式存儲管理的頁面置換算法。 3.了解頁面大小和內(nèi)存實際容量對命中率的影響。【實驗原理】分頁存儲管理將一個進程的邏輯地址空間分成若干大小相等的片,成為頁面或頁。在進程運行過程中,若其所要訪問的頁面不在內(nèi)存而需要把他們調(diào)入內(nèi)存,但內(nèi)存已無空閑時,為了保證該進程能正常運行,系統(tǒng)必須從內(nèi)存中

17、調(diào)出一頁程序或數(shù)據(jù),送磁盤的對換區(qū)中。但應(yīng)將哪個頁面調(diào)出,須根據(jù)一定的算法來確定。通常,把選擇換出頁面的算法稱為頁面置換算法(Page Replacement Algorithm)。一個好的頁面置換算法,應(yīng)具有較低的頁面更換頻率。從理論上講,應(yīng)將那些以后不再會訪問的頁面換出,或?qū)⒛切┰谳^長時間內(nèi)不會再訪問的頁面調(diào)出。 最佳置換算法OPT(Optimal) 先進先出頁面置換算法FIFO 最近最久未使用置換算法LRU 最少訪問頁面置換算法LFU 最近最不經(jīng)常使用算法NUR【實驗主要儀器與材料】 帶Linux操作系統(tǒng)的PC機。 GCC編譯器?!緦嶒瀮?nèi)容】1、通過隨機數(shù)產(chǎn)生一個指令序列,共320條指令

18、。指令的地址按下述原則生成:l 50%的指令是順序執(zhí)行的l 25%的指令是均勻分布在前地址部分l 25%的指令是均勻分布在后地址部分具體的實施方法是:l 在【0,319】的指令地址之間隨機選取一起點m;l 順序執(zhí)行一條指令,即執(zhí)行地址為m+1的指令;l 在前地址【0,m+1】中隨機選取一條指令并執(zhí)行,該指令的地址為m;l 順序執(zhí)行一條指令,其地址為m+1;l 在后地址m+2,319中隨機選取一條指令并執(zhí)行;l 重復(fù)上述步驟,直到執(zhí)行320次指令。2、將指令序列變換成為頁地址流設(shè):l 頁面大小為1K;l 用戶內(nèi)存容量為4頁到32頁;l 用戶虛擬容量為32K。在用戶虛存中,按每K存放10條指令排列

19、虛擬地址,即320條指令在虛存中的存放方式為:第0條第9條指令為第0頁(對應(yīng)虛存地址為【0,9】);第10條第19條指令為第1頁(對應(yīng)虛存地址為【10,19】);第310條第319條指令為第31頁(對應(yīng)虛存地址為【310,319】)。按以上方式,用戶指令可組成32頁。3、計算并輸出下列各種算法在不同內(nèi)存容量下的命中率。l 先進先出的算法(FIFO);l 最近最少使用算法(LRU);l 最佳淘汰算法(OPT):先淘汰最不常用的頁地址;其中OPT為選作內(nèi)容。命中率 = 1 頁面時效次數(shù)/頁地址流長度在本實驗中,頁地址流長度為320,頁面失效次數(shù)為每次訪問相應(yīng)指令時,該指令所對應(yīng)的頁不在內(nèi)存的次數(shù)。

20、【實驗步驟及實驗結(jié)果分析】首先用srand()和rand()函數(shù)定義和產(chǎn)生指令序列,然后將指令序列變換成相應(yīng)的頁地址流,并針對不同的算法計算出相應(yīng)的命中率。/*利用先進先出算法(FIFO)和最近最久未使用算法(LRU)*/#include<stdio.h>#include<stdlib.h>#include<unistd.h> #include<string.h>#define NULL_1 10000const int ty=320;int d320; /指令序列int page320; /頁地址流int p32; /內(nèi)存頁面int que;

21、/缺頁次數(shù)int time32; /記錄頁面距離上次被訪問的時間void creat(int leng) /leng為內(nèi)存頁面數(shù)量int i;que=0;for(i=0;i<leng;i+)pi=NULL_1; /讓內(nèi)存頁面置空timei=0; /*先進先出算法void FIFO(int leng) /leng為內(nèi)存頁面數(shù)量 int i,j,k;int n; /n為要被替換的頁面號,按0,1,2.leng,0,1,2.leng循環(huán)變化creat(leng); /初始化內(nèi)存頁面 n=0; for(i=0;i<ty;i+) k=0;for(j=0;j<leng;j+)if(pj=

22、NULL_1)break;else if(pj=pagei)/在內(nèi)存中有該頁k=1;break; if(k=0) que+;pn=pagei;n+; if(n=leng)n=0; printf("%-7.3ft",1-(float)que/ty); /*最近最久未使用算法 void LRU(int leng) /leng為內(nèi)存頁面數(shù)量 int i,j,k; int tmax; /存time的最大值 int t; /t為要被訪問的頁面號 creat(leng); /初始化內(nèi)存頁面 for(i=0;i<ty;i+) k=0;for(j=0;j<leng;j+)if(

23、pj=NULL_1)break;else if(pj=pagei)/在內(nèi)存中有該頁k=1;t=j;break;if(k=0)que+;tmax=time0;t=0;for(j=0;j<leng;j+) /查找最久沒訪問的頁面號賦予tif(tmax<timej)tmax=timej;t=j;pt=pagei;for(j=0;j<leng;j+) /將每個頁面time自增timej+;timet=0; /將這次被訪問的頁面time清零 printf(" %-7.3ft",1-(float)que/ty); void main( ) int m,i; srand

24、(10*getpid(); /用來作為初始化隨機數(shù)隊列的"種子" m=(int)(float)(ty-1)*(rand()/(RAND_MAX+1.0); /選0-319中一數(shù) for (i=0; i<ty; i+=4) /產(chǎn)生指令隊列 di=m; /任選一指令訪問點m di+1=di+1; /順序執(zhí)行一條指令m+1 di+2=(int)(float)di*(rand()/(RAND_MAX+1.0); /執(zhí)行前地址指令m',即選擇(0,m+1)之間的數(shù) di+3=di+2+1; /順序執(zhí)行一條指令 m= (int)(float)(ty-1)-di+2)*(r

25、and()/(RAND_MAX+1.0) + di+2; /選(m'+2,319)之間數(shù) for(i=0;i<ty;i+) /將指令序列變換成頁地址流 pagei=di/10; printf("PAGEtFIFOt LRUtn"); for(i=4;i<=32;i+) /內(nèi)存從4頁到32頁 printf(" %2dt",i); FIFO(i); LRU(i); printf("n"); 程序運行結(jié)果:【思考題】 在內(nèi)存頁面較少(45個)的情況時,各種頁面置換算法的命中率有何差別? FIFO算法和LRU算法命中率都在

26、55%左右,相差不大。 在內(nèi)存頁面為712個頁面時,各種頁面置換算法的命中率有何差異?FIFO算法命中率在59%-67%,LRU算法命中率在60%-70%之間,相對來說,最近最久未使用算法效率更好一些。 在內(nèi)存頁面為2532個頁面時,各種頁面置換算法的命中率有何差異?兩種算法命中率都在80%-90%之間,當(dāng)內(nèi)存中中頁面數(shù)逐漸增加時,訪問的都已裝入內(nèi)存,從而命中率都較大。實驗四 文件系統(tǒng)【實驗?zāi)康呐c要求】1、熟悉Linux文件系統(tǒng)的文件和目錄結(jié)構(gòu),掌握Linux文件系統(tǒng)的基本特征。2、掌握命令行方式下文件操作命令和程序中文件操作函數(shù)的使用方法。3.、掌握Linux文件系統(tǒng)的加載和卸載方法?!緦嶒?/p>

27、主要儀器與材料】1、帶Linux操作系統(tǒng)的PC機2、GCC編譯器【實驗內(nèi)容】1. 熟悉Linux下的文件操作命令,如查看文件系統(tǒng)的分區(qū)和設(shè)備文件、查看文件系統(tǒng)目錄結(jié)構(gòu)、創(chuàng)建文件夾、復(fù)制文件、更改文件權(quán)限等,觀察Linux文件系統(tǒng)的特點。2. 對比實驗一的文件拷貝代碼,利用不同的文件操作函數(shù)實現(xiàn)文件的輸出和拷貝。3. 實現(xiàn)對光盤的加載和訪問,然后卸載設(shè)備。4. 加載Windows文件系統(tǒng),實現(xiàn)對Windows數(shù)據(jù)的訪問和共享?!緦嶒灢襟E及實驗結(jié)果分析】實驗內(nèi)容:1.df:查看文件系統(tǒng)的狀態(tài)信息,顯示各分區(qū)容量、硬盤占用空間、目前剩余空間及掛載點等信息 du:統(tǒng)計目錄或文件所占磁盤空間的大小 mkdir:創(chuàng)建文件夾 cp:復(fù)制文件 chmod:更改文件權(quán)限 2. (1) #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() FILE *fp;char ch;char fname30;printf("Please inp

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論