《計算機操作系統(tǒng)》實驗指導書_第1頁
《計算機操作系統(tǒng)》實驗指導書_第2頁
《計算機操作系統(tǒng)》實驗指導書_第3頁
《計算機操作系統(tǒng)》實驗指導書_第4頁
《計算機操作系統(tǒng)》實驗指導書_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、計算機操作系統(tǒng)實驗指導書(適合于計算機科學與技術專業(yè))湖南工業(yè)大學計算機與通信學院二O一二 年 十月前言計算機操作系統(tǒng)是計算機科學與技術專業(yè)的主要專業(yè)基礎課程,其實踐性、應用性很強。實踐教學環(huán)節(jié)是必不可少的一個重要環(huán)節(jié)。計算機操作系統(tǒng)的實驗目的是加深對理論教學內容的理解和掌握,使學生較系統(tǒng)地掌握操作系統(tǒng)的基本原理,加深對操作系統(tǒng)基本方法的理解,加深對課堂知識的理解,為學生綜合運用所學知識,在Linux環(huán)境下調用一些常用的函數(shù)編寫功能較簡單的程序來實現(xiàn)操作系統(tǒng)的基本方法、并在實踐應用方面打下一定基礎。要求學生在實驗指導教師的幫助下自行完成各個操作環(huán)節(jié),并能實現(xiàn)且達到舉一反三的目的,完成一個實驗解

2、決一類問題。要求學生能夠全面、深入理解和熟練掌握所學內容,并能夠用其分析、設計和解答類似問題;對此能夠較好地理解和掌握,并且能夠進行簡單分析和判斷;能夠熟練使用Linux用戶界面;掌握操作系統(tǒng)中進程的概念和控制方法;了解進程的并發(fā),進程之間的通信方式,了解虛擬存儲管理的基本思想。同時培養(yǎng)學生進行分析問題、解決問題的能力;培養(yǎng)學生完成實驗分析、實驗方法、實驗操作與測試、實驗過程的觀察、理解和歸納能力。為了收到良好的實驗效果,編寫了這本實驗指導書。在指導書中,每一個實驗均按照該課程實驗大綱的要求編寫,力求緊扣理論知識點、突出設計方法、明確設計思路,通過多種形式完成實驗任務,最終引導學生有目的、有方

3、向地完成實驗任務,得出實驗結果。任課教師在實驗前對實驗任務進行一定的分析和講解,要求學生按照每一個實驗的具體要求提前完成準備工作,如:查找資料、設計程序、完成程序、寫出預習報告等,做到有準備地上機。進行實驗時,指導教師應檢查學生的預習情況,并對調試過程給予積極指導。實驗完畢后,學生應根據實驗數(shù)據及結果,完成實驗報告,由學習委員統(tǒng)一收齊后交指導教師審閱評定。實驗成績考核:實驗成績占計算機操作系統(tǒng)課程總評成績的20%。指導教師每次實驗對學生進行出勤考核,對實驗效果作記錄,并及時批改實驗報告,綜合評定每一次的實驗成績,在學期終了以平均成績作為該生的實驗成績。有以下情形之一者,實驗成績?yōu)椴患案瘢?.

4、遲到、早退、無故缺勤總共3次及以上者;2. 未按時完成實驗達3次及以上者;3. 缺交實驗報告2次及以上者。目 錄第一部分 實驗環(huán)境及所用系統(tǒng)函數(shù)介紹11.1 Linux操作系統(tǒng)簡介11.2 Linux的使用11.2.1 vi的使用11.2.2 gcc的使用21.2.3主要系統(tǒng)調用函數(shù)2第二部分 實驗內容5實驗一 熟悉LINUX基本命令及編程環(huán)境5實驗二 進程管理8實驗三 進程調度12實驗四 進程間通信17實驗五 存儲管理實驗20ii第一部分 實驗環(huán)境及所用系統(tǒng)函數(shù)介紹DOS操作系統(tǒng)是單道操作系統(tǒng),無法進行多道程序設計,Windows環(huán)境下的Visual C+雖然也可用于多道程序設計,但是并不是

5、完全的多道,因為它也可用于DOS編程。所以我們的實驗選用Linux操作系統(tǒng)。Linux操作系統(tǒng)是一個類UINX操作系統(tǒng),是一個純多道并發(fā)的網絡操作系統(tǒng)。1.1 Linux操作系統(tǒng)簡介 Linux是一個多用戶操作系統(tǒng),是UNIX的一個克隆版本(界面相同但內部實現(xiàn)不同),同時它是一個自由軟件,是免費的、源代碼開放的,這是它與UNIX的不同之處?,F(xiàn)在,Linux憑借優(yōu)秀的設計,不凡的性能,加上IBM、Intel、CA、CORE、Oracle等國際知名企業(yè)的大力支持,市場份額逐步擴大,已成為與Windows和UNIX并存的三大主流操作系統(tǒng)之一。1.2 Linux的使用1.2.1 vi的使用1) vi的

6、簡單應用vi是linux環(huán)境下赫赫有名的文本編輯工具之一。進入vi編輯器的方法: vi filename.c 注:文件名必須帶有擴展名.c,如 filename.c否則無法通過編譯;進入vi后要按:按“i”鍵從命令方式切換到輸入方式;從輸入方式切換到命令方式的方法:按“Esc”鍵保存文件 :w保存文件并退出 :wq不保存文件退出 :q!注:以上操作必須在命令方式下進行。2) 其他常用vi操作命令j,k,h,l:上下左右0: 行首 $:  行尾 ctrl+f :后翻頁 ctrl+b:前翻頁 G : 文件尾 數(shù)字G: 數(shù)字所指定行 i,I

7、 : 插入命令,i 在當前光標處插入, I 行首插入 a,A: 追加命令,a 在當前光標后追加,A 在行末追加 o,O: 打開命令,o 在當前行下打開一行,O在當前行上插入一行 x: 刪除光標處字符 dd: 刪除當前行 d0: 刪除光標前半行 d$: 刪除光標后半行 r,R : 替換命令,r 替換當前光標處字符,R從光標處開始替換/string: 查找字符串 n :  繼續(xù)查找 N :  反向繼續(xù)查找 %  :查找對應括號 u

8、  :取消上次操作 注:以上操作必須在命令方式下進行。1.2.2 gcc的使用gcc是linux下的一種c程序編譯工具,使用方法如下(有提示符#的情況): 編譯: gcc o filename1 filename.c其中: filename.c是源文件名,filename1 是目標文件名,o代表object 執(zhí)行:./filenamel示例:鍵入一簡單的程序:vi ab.c 按回車鍵輸入以下代碼段,#include<stdio.h>#include<unisted.h>main()printf(“aaaa”);按ESC鍵,再按“:WQ”(W是保存,Q是退出)出

9、現(xiàn)提示符:root GGG-LINUX root#鍵入:gcc o ab ab.c進行編譯。執(zhí)行:./ab1.2.3主要系統(tǒng)調用函數(shù)1.2.1系統(tǒng)調用fork()功能:創(chuàng)建一個新的進程. 頭文件:#include <unistd.h>說明:本系統(tǒng)調用產生一個新的進程, 叫子進程, 是調用進程的一個復制品. 調用進程叫父進程, 子進程繼承了父進程的幾乎所有的屬性。 (1) 該子進程繼承了父進程的程序空間,復制了父進程的數(shù)據段和棧段。也就是說不管是父進程還是子進程,在占有處理機后,都從fork()調用的返回點開始運行;(2) 調用成功則對父進程返回子進程標識號pid;(3) 調用成功對

10、子進程返回0, 這也是最方便的區(qū)分父子進程的方法。(4) 若調用失敗則返回-1給父進程, 子進程不生成。 注意:如果fork()值>0,>0的數(shù)即是子進程號。但這時是父進程占有處理機。1.2.2系統(tǒng)調用wait(&status):功能: 等待子進程結束。(1)當有多個子進程時,任一個子進程結束即將控制返回調用者,并將子進程調用exit (status)時的status值送到&status指針所指單元中。(2)在控制返回調用者時,同時將所等到的子進程pid作為wait()系統(tǒng)調用函數(shù)的返回值。(3)waitpid(pid,):等待pid所指定的進程結束。(4)返回值:

11、等待到一個子進程返回時,返回值為該子進程號;否則返回值為1。說明: 允許調用進程(即父進程)取得子進程的狀態(tài)信息,調用進程將會掛起直到其一個子進程終止。1.2.3系統(tǒng)調用exit()功能: 終止進程. 語法: #include <stdlib.h> void exit(status) int status功能:調用進程被該系統(tǒng)調用終止。該系統(tǒng)調用發(fā)出后,操作系統(tǒng)將從系統(tǒng)中刪除調用exit的進程,并將status值傳給等待它結束的父進程。返回值: 無 1.2.4系統(tǒng)調用kill()功能: 向一個或一組進程發(fā)送一個信號。 語法:#include <signal.h> int

12、 kill(pid, sig); pid_t pid; int sig;說明:向一個或一組進程發(fā)送一個信號,該信號由參數(shù)sig指定,為系統(tǒng)給出的信號表中的一個。Sig是signal的縮寫。返回值: 調用成功則返回0,否則返回-1. kill -STOP pid: 發(fā)送SIGSTOP (17,19,23)停止一個進程,而并不消滅這個進程。kill -CONT pid: 發(fā)送SIGCONT (19,18,25)重新開始一個停止的進程。kill -KILL pid: 發(fā)送SIGKILL (9)強迫進程立即停止,并且不實施清理操作。kill -9 -1: 終止擁有的全部進程。SIGKILL和SIGST

13、OP信號不能被捕捉、封鎖或者忽略。1.2.5系統(tǒng)調用lockf()功能:應用、檢測或刪除打開文件的一個POSIX鎖語法:#include <unistd.h> int lockf(int fd, int cmd, off_t len);說明: 應用、檢測或刪除打開文件某部分的一個POSIX鎖,文件通過fd指明,文件的描述符的請求操作通過cmd指明。#define F_ULOCK 0 解鎖一個區(qū)域#define F_LOCK 1 上鎖一個區(qū)域#define F_TLOCK 2 檢測并上鎖一個區(qū)域#define F_TEST 3 檢測一個區(qū)域是否上鎖文件上鎖區(qū)域的請求起始于隱含的偏移并

14、包好len字節(jié),假如len為負,從pospos+len-1,這里pos為當前文件位置,假如len為零,則位置從當前文件位置延伸延伸到無限長,包括當前和以后的文件最后的位置。在所有情況下,位置可延伸到以前當前的文件的最后位置。在Linux中,這稱為fcntl(2)的接口(一般會指明lockf 和fcntl的關系)。1.2.6 系統(tǒng)調用pipe()是用來建立管道的。語法: #include <unistd.h> int pipe(int fd2); 這里fd1為寫入端,fd0為讀出端。功能:從管道里寫或從管道里讀。.25.計算機操作系統(tǒng)實驗指導書第二部分 實驗內容實驗一 熟悉LINUX

15、基本命令及編程環(huán)境一、 實驗類型 本實驗為驗證性實驗。二、 實驗目的與任務1) 熟悉使用Linux字符界面,窗口系統(tǒng)的常用命令;2) 熟悉運用Linux常用的編程工具;3) 熟悉運用Linux的在線求助系統(tǒng)。三、 預習要求1) 熟悉一種操作系統(tǒng)的使用和安裝,如windows操作系統(tǒng)的安裝,DOS系統(tǒng)的使用2) 了解進程的概念及進程的狀態(tài)3) 熟悉c語言程序設計4) 熟悉c語言程序編譯過程四、 實驗基本原理進入Linux操作系統(tǒng)后,控制終端的命令行輸入方式下輸入各種命令,并顯示各種命令操作后的輸出結果,操作包括文件操作命令的使用,vi命令的使用以及gcc編譯器的使用,詳細的各種命令及使用方式見第

16、一部分的介紹。五、 實驗儀器與設備(或工具軟件) 實驗設備:計算機一臺,軟件環(huán)境要求:安裝Red Hat Linux操作系統(tǒng)和gcc編譯器。六、 實驗內容1) 使用常用的操作命令ls, cp, rm, mkdir, man, vi等。2) 熟悉怎么編輯一個程序(編輯,調試,運行見),輸入一個簡單的C程序進行練習,參考練習程序如下:程序1#include<stdio.h>main()int p1;while(p1=fork()=-1);if(p1=0)putchar(B);else putchar(A);程序2#include<stdio.h>#include "

17、;stdafx.h" main()int row,column,num,n=6;for(row=1;row<n;row+)for(column=1;column<n-row;column+) printf(" "); for(num=row;num>=1;num-) printf("%d",num); for(num=2;num<=row;num+) printf("%d",num); printf("n"); 七、 實驗步驟1) 進入Linux操作系統(tǒng)開機后,選擇進入Linux操

18、作系統(tǒng)方式,輸入用戶名和密碼,即可進入Linux操作系統(tǒng)。2) 進入控制終端的命令行輸入方式在Linux操作系統(tǒng)環(huán)境下,點擊“小紅帽”菜單,選擇“系統(tǒng)”下拉菜單,選擇“終端”選項,進入命令行輸入方式。3) 輸入命令后按回車鍵在命令行輸入方式下,輸入各種文件操作命令,并按回車查看顯示結果。八、 注意事項1) gcc編譯器不能編譯不帶擴展名的c語言程序。2) 注意編譯和運行程序的基本過程。3) 注意熟練使用man命令來查看某條命令的含義及使用方式。九、 實驗報告要求 要求列出多條命令的使用和相應結果,需要列出運行了的程序清單及相應結果,并對結果進行分析和討論。實驗二 進程管理一、 實驗類型 本實驗

19、為設計性實驗。二、 實驗目的與任務1) 加深對進程概念的理解,明確進程和程序的區(qū)別。2) 進一步認識并發(fā)執(zhí)行的實質三、 預習要求1) 進程的概念2) 進程控制的概念及內容3) 進程的并發(fā)執(zhí)行4) 熟悉互斥的概念5) 用到的Linux函數(shù)有:fork(),lockf()等。四、 實驗基本原理 使用fork()系統(tǒng)調用來創(chuàng)建一個子進程,父進程和子進程并發(fā)執(zhí)行,交替輸出結果。使用lockf()系統(tǒng)調用對臨界區(qū)進行加鎖操作,實現(xiàn)對共享資源的互斥使用。五、 實驗儀器與設備(或工具軟件)實驗設備:計算機一臺,軟件環(huán)境要求:安裝Red Hat Linux操作系統(tǒng)和gcc編譯器。六、 實驗內容1)進程的創(chuàng)建

20、編寫一段程序,使用系統(tǒng)調用fork( ) 創(chuàng)建兩個子程序。當此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示字符“a”;子進程分別顯示字符“b”和字符“c”。運行程序10次,觀察記錄屏幕上的顯示結果,并分析原因。2)進程的控制 修改已編寫的程序,將每個進程輸出一個字符改為每個進程輸出一句話,再觀察程序執(zhí)行時屏幕上出現(xiàn)的現(xiàn)象,并分析原因。如果在程序中使用系統(tǒng)調用lockf()來給每一個進程加鎖,可以實現(xiàn)進程間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。 (1)進程的創(chuàng)建參考程序如下:#include<stdio.h>main() int p1,p2;

21、 while(p1=fork()=-1); if(p1!=0) while(p2=fork()=-1); if(p2=0) putchar('b'); else putchar('c'); else putchar('a');運行結果:bca(或bac)分析:從進程并發(fā)執(zhí)行來看,輸出bac,acb等情況都有可能。原因:fork()創(chuàng)建進程所需的時間要多于輸出一個字符的時間,因此在主程序創(chuàng)建進程的同時,進程2就輸出了”b”,而進程2和主程序的輸出次序是隨機的,所以出現(xiàn)上述結果。(2)進程的控制參考程序如下#include<stdio.h>

22、;main()int p1,p2,i;while (p1=fork()=-1);if(p1=0) for(i=0;i<500;i+) printf("child %dn",i);else while(p2=fork()=-1); if(p2=0) for(i=0;i<500;i+) printf("son %dn",i); else for(i=0;i<500;i+) printf("daughter %dn",i);運行結果:略分析:由于函數(shù)printf()輸出和字符串之間不會被中斷,因此字符串內部的字符順序輸出不

23、變。但是由于進程并發(fā)執(zhí)行時的調度順序和父進程的搶占處理機問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。進程加鎖后的參考程序如下:#include<stdio.h>main()int p1,p2,i;while (p1=fork()=-1);if(p1=0) lock(1,1,0);for(i=0;i<500;i+) printf("child %dn",i);lock(1,0,0);else while(p2=fork()=-1); if(p2=0)lock(1,1,0) for(i=0;i<500;i+) printf("son

24、%dn",i); lock(1,0,0) else lock(1,1,0) for(i=0;i<500;i+) printf("daughter %dn",i); lock(1,0,0)運行結果:略分析:學生自己完成七、 實驗步驟1) 進入vi編輯器2) 在編譯器中輸入所要運行的程序代碼3) 退出編輯器,返回命令行輸入方式,使用gcc編譯器編譯程序,獲得能運行的目標程序。4) 運行目標程序,查看運行結果。八、 注意事項1) 如果使用gcc編譯程序有錯的話,需要重新修改程序,直到無錯為止。2) 注意系統(tǒng)是如何創(chuàng)建進程的?3) 查看結果是否是交替輸出,如果修改輸

25、出的次數(shù)是否會出現(xiàn)交替現(xiàn)象?4) 相關函數(shù)的介紹見第一部分的介紹。九、 實驗報告要求 需要列出運行了的程序清單及相應結果,并對結果進行分析和討論。對結果的分析主要討論結果為什么會交替出現(xiàn)?并發(fā)進程是如何執(zhí)行的?實驗三 進程調度一、 實驗類型本實驗為綜合性實驗二、 實驗目的與任務在采用多道程序設計的系統(tǒng)中,往往有若干個進程同時處于就緒狀態(tài)。當就緒進程個數(shù)大于處理機數(shù)時,就必須依照某種策略來決定那些進程優(yōu)先占用處理機。本實驗模擬在單處理機情況下的處理機調度,幫助學生加深了解處理機調度的工作。三、 預習要求1) 熟悉進程控制塊和進程組織方式2) 熟悉進程調度的概念3) 熟悉時間片輪轉調度算法等4)

26、熟悉c語言編程,指針及結構體等知識5) 數(shù)據結構中的鏈表的建立及基本操作四、 實驗基本原理 進程控制塊通過鏈表隊列的方式組織起來,系統(tǒng)中存在運行隊列和就緒隊列(為簡單起見,不設阻塞隊列),進程的調度就是進程控制塊在運行隊列和就緒隊列之間的切換。當需要調度時,從就緒隊列中挑選一個進程占用處理機,即從就緒隊列中刪除一個進程,插入到運行隊列中,當占用處理機的進程運行的時間片完成后,放棄處理機,即在運行隊列中的進程控制塊等待一段時間(時間片)后,從該隊列上刪除,如果該進程運行完畢,則刪除該進程(節(jié)點);否則,則插入到就緒隊列中。五、 實驗儀器與設備(或工具軟件)實驗設備:計算機一臺,軟件環(huán)境要求:安裝

27、Red Hat Linux操作系統(tǒng)和gcc編譯器。六、 實驗內容設計一個時間片輪轉調度算法實現(xiàn)處理機調度的程序,具體內容如下1) 實驗中使用的數(shù)據結構(1) PCB進程控制塊內容包括參數(shù)進程名name;要求運行時間 runtime;優(yōu)先數(shù) prior;狀態(tài) state;已運行時間runedtime。(2) 為簡單起見,只設運行隊列,就緒鏈表兩種數(shù)據結構,進程的調度在這兩個隊列中切換,如圖3.1所示運行隊列PCBi就緒隊列PCBjPCBj1PCBj1圖3.1PCB鏈表2) 每個進程運行時間隨機產生,為120之間的整數(shù)。3) 時間片的大小由實驗者自己定義,可為3或54) 可參考的程序流程圖如圖3.

28、2否否是建立運行隊列指針,初始值指向空建立就緒隊列,每個進程設置相應參數(shù),如運行時間,進程名字等從就緒隊列中按時間先后順序選一個進程插入運行隊列每個進程占用處理機一個時間片,即runtime=runtime-時間片大小如果runtime0?Runtime=0修改相應參數(shù)修改相應參數(shù)結束該進程,即釋放節(jié)點空間將該進程插入就緒隊列中就緒隊列為空嗎?產生一次調度,即按時間先后順序從頭節(jié)點刪除一個節(jié)點插入運行隊列中結束程序是圖3.2模擬進程調度的流程圖5) 參考程序#include "stdio.h"#include "stdlib.h"typedef stru

29、ct PCB int name; int runtime; int runedtime; int state; int killtime;struct PCB *next;PCB;#define NUM 10void main()int timeslice=3;PCB *runqueue;PCB *top,*tail,*temp;int i;srand(10); for(i=0;i<NUM;i+) temp=new PCB; temp->name=i; temp->runtime=rand()%20; temp->runedtime=0; temp->next=N

30、ULL; temp->killtime=0;if(i=0) top=temp; tail=temp; elsetail->next=temp;tail=temp;printf("process name %d, runtime=%d, runedtime=%d,killtime=%dn",tail->name,tail->runtime,tail->runedtime,tail->killtime); while(top!=NULL) runqueue=top; top=top->next; runqueue->next=NU

31、LL; runqueue->runtime= runqueue->runtime-timeslice; if(runqueue->runtime<=0) runqueue->killtime=runqueue->runtime+timeslice; runqueue->runedtime=runqueue->runedtime+runqueue->killtime;runqueue->runtime=0;printf("process name %d, runtime=%d, runedtime=%d,killtime=%d

32、n",runqueue->name,runqueue->runtime,runqueue->runedtime,runqueue->killtime); else runqueue->killtime=timeslice; runqueue->runedtime=runqueue->runedtime+runqueue->killtime;printf("process name %d, runtime=%d, runedtime=%d,killtime=%dn",runqueue->name,runqueue

33、->runtime,runqueue->runedtime,runqueue->killtime);tail->next=runqueue;tail=tail->next; 6) 運行結果,包括各個進程的運行順序,每次占用處理機的運行時間,可以參考下列輸出如圖4.3。圖4.3輸出結果示意圖七、 實驗步驟1) 進入vi編輯器2) 在編譯器中輸入所要運行的程序代碼3) 退出編輯器,返回命令行輸入方式,使用gcc編譯器編譯程序,獲得能運行的目標程序。4) 運行目標程序,查看運行結果。八、 注意事項1) 修改時間片大小,查看對實驗結果的影響。2) 隨機數(shù)的產生由rand(

34、)函數(shù)實現(xiàn),rand()的輸出隨機數(shù)范圍在0215之間,需要轉換到020范圍。3) 注意鏈表節(jié)點的插入,刪除方法。九、 實驗報告要求需要列出運行了的程序清單及相應結果,并對結果進行分析和討論。對結果的分析主要討論時間片大小對程序執(zhí)行的影響?實驗四 進程間通信 一、 實驗類型 本實驗為設計性實驗二、 實驗目的與任務了解Linux系統(tǒng)中的進程管道通信的基本原理,并能編寫簡單的管道通信的程序。三、 預習要求1) 熟悉進程通信的概念2) 熟悉管道通信的基本原理3) 用到的系統(tǒng)調用有pipe()四、 實驗基本原理 實驗利用Linux操作系統(tǒng)提供的系統(tǒng)調用pipe()來實現(xiàn)兩個進程之間的通信。輸入進程從管

35、道的一端輸入數(shù)據,另一個進程從管道的另一端讀數(shù)據,通過這種方式來實現(xiàn)進程間的通信。五、 實驗儀器與設備(或工具軟件)實驗設備:計算機一臺,軟件環(huán)境要求:安裝Red Hat Linux操作系統(tǒng)和gcc編譯器。六、 實驗內容編制一段程序,實現(xiàn)進程管道通信。使用系統(tǒng)調用pipe()建立一條管道。兩個子進程P1和P2分別向管道各寫一句話:Child process 1 is sending message!Child process 2 is sending message!而父進程則從管道中讀出來自兩個子進程的信息,顯示在屏幕上。參考程序程序如下#include<unistd.h>#in

36、clude<signal.h>#include<stdio.h>int pid1,pid2;main()int fd2;char OutPipe100,InPipe100;pipe(fd);while(pid1=fork()=-1);if(pid1=0)lockf(fd1,1,0);sprintf(OutPipe,"n Child process 1 is sending message!n");write(fd1,OutPipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewhile(pid2=fork()=-1

37、);if(pid2=0)lockf(fd1,1,0);sprintf(OutPipe,"n Child process 2 is sending message!n");write(fd1,OutPipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewait(0);read(fd0,InPipe,50);printf("%sn",InPipe);wait(0);read(fd0,InPipe,50);printf("%sn",InPipe);exit(0);七、 實驗步驟1) 進入vi編輯器2) 在

38、編譯器中輸入所要運行的程序代碼3) 退出編輯器,返回命令行輸入方式,使用gcc編譯器編譯程序,獲得能運行的目標程序。4) 運行目標程序,查看運行結果。八、 注意事項1) 管道按怎樣的方式傳送消息?是否能夠雙向傳送消息?2) 在管道通信方式中,如何來實現(xiàn)進程同步與互斥的?3) pipe()函數(shù)的使用可參看第一部分的介紹。九、 實驗報告要求需要列出運行了的程序清單及相應結果,并對結果進行分析和討論。對結果的分析主要討論管道通信方式的特點,實驗結果是否體現(xiàn)該特點。實驗五 存儲管理實驗一、 實驗類型 本實驗為綜合性實驗。二、 實驗目的與任務1) 理解動態(tài)異長存儲分區(qū)資源管理2) 掌握所需數(shù)據結構和管理

39、程序3) 了解各種存儲分配算法的優(yōu)點和缺點。4) 編程實現(xiàn)動態(tài)不等長存儲管理的模擬程序。三、 預習要求1) 進程控制的概念及內容2) 熟悉存儲管理的概念3) 了解動態(tài)分區(qū)管理的思想,熟悉分配算法和回收算法4) 熟悉c語言編程,指針及結構體等知識5) 數(shù)據結構中的鏈表的建立及基本操作四、 實驗基本原理 使用一個一維數(shù)組來模擬內存儲空間,建立內存塊來記錄內存分配使用情況,通過隨機產生進程及其所需要的內存來模擬真實的進程。通過給進程分配內存及回收來實現(xiàn)對動態(tài)不等長存儲管理方法。五、 實驗儀器與設備(或工具軟件)實驗設備:計算機一臺,軟件環(huán)境要求:安裝Red Hat Linux操作系統(tǒng)和gcc編譯器。

40、六、 實驗內容1) 實驗中使用的數(shù)據結構(1) 內存塊表,包括參數(shù)進程名name;起始地址 address;長度 length;標志 flag,表示該塊是否被分配。(2) 為簡單起見,只設內存分配記錄鏈表數(shù)據結構,用來記錄內存分配與空閑情況。2) 實驗中假設有若干個進程,如5個,每個需要空間隨機產生,為020之間的整數(shù),進程名字實驗者自己定義,可以是一個整數(shù)。3) 其他一些參數(shù),如內存空間的大小實驗者自己定義,建議為100;4) 為了得到清晰的實驗結果,建議先給每個進程分配存儲空間,后進行回收。5) 程序的流程圖如圖5.1, 圖5.2, 圖5.3建立鏈表初始化鏈表,表示整個存儲空間對5個進程分

41、別分配空間回收1個進程結束程序圖5.1總的流程圖否是查找鏈表,找到一個大于或等于進程所需空間的空閑節(jié)點|節(jié)點空間-進程空間|<minsize將節(jié)點分配給該進程,即修改相應參數(shù)將該節(jié)點空間分割成兩部分,分別修改其參數(shù),插入鏈表分配結束圖5.2分配流程圖僅右都為空閑節(jié)點僅左都為空閑節(jié)點查找鏈表,找到相應記錄進程使用內存的節(jié)點分四種情況回收空間與合并左右節(jié)點,即修改相應參數(shù),刪除多余節(jié)點與左節(jié)點合并,即修改相應參數(shù),刪除多余節(jié)點與右節(jié)點合并,即修改相應參數(shù),刪除多余節(jié)點回收該節(jié)點,即修改有關參數(shù)回收結束左右都為空閑節(jié)點直接修改該節(jié)點的參數(shù)左右都不為空閑節(jié)點圖5.3回收流程圖6) 參考程序#in

42、clude "math.h"#include "stdafx.h"#include "stdio.h"#include "stdlib.h"typedef struct MEMORY_BLOCK int name; int address; int length; int flag; MEMORY_BLOCK *next;MEMORY_BLOCK;int allocation(MEMORY_BLOCK *Header,int name,int time);int reclaim(int processname, M

43、EMORY_BLOCK *Header);int main() #define NUM 10 int time,i; MEMORY_BLOCK *Header,*t; Header=new MEMORY_BLOCK; /初始化存儲空間 Header->name=-1; Header->address=0; Header->length=100; Header->flag=0; Header->next=NULL;srand(100); for(i=0;i<NUM;i+) time=rand()%20; / time=time%20; allocation(H

44、eader,i,time); t=Header; while(t!=NULL) printf("process name %d, address=%d, length=%d,flag=%dn",t->name,t->address,t->length,t->flag); t=t->next; int processname=3;/回收 printf("回收 process name %dn",processname); reclaim(processname,Header); t=Header; while(t!=0) pr

45、intf("process name %d, address=%d, length=%d,flag=%dn",t->name,t->address,t->length,t->flag); t=t->next; processname=4; printf("回收 process name %dn",processname); reclaim(processname,Header); t=Header; while(t!=0) printf("process name %d, address=%d, length=%d

46、,flag=%dn",t->name,t->address,t->length,t->flag); t=t->next; return 1;int reclaim(int processname, MEMORY_BLOCK *Header) MEMORY_BLOCK *temp,*t,*tt;t=Header; temp=t; while(t->name!=processname) temp=t; t=t->next; if(t=0) printf("no process");return 0; else if(t->next!=NULL) if(temp->flag=0&&t->next->flag=0)/左右為空 temp-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論