




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書(適合于計(jì)算機(jī)科學(xué)與技術(shù)專業(yè))湖南工業(yè)大學(xué)計(jì)算機(jī)與通信學(xué)院二O一二 年 十月前言計(jì)算機(jī)操作系統(tǒng)是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的主要專業(yè)基礎(chǔ)課程,其實(shí)踐性、應(yīng)用性很強(qiáng)。實(shí)踐教學(xué)環(huán)節(jié)是必不可少的一個(gè)重要環(huán)節(jié)。計(jì)算機(jī)操作系統(tǒng)的實(shí)驗(yàn)?zāi)康氖羌由顚?duì)理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較系統(tǒng)地掌握操作系統(tǒng)的基本原理,加深對(duì)操作系統(tǒng)基本方法的理解,加深對(duì)課堂知識(shí)的理解,為學(xué)生綜合運(yùn)用所學(xué)知識(shí),在Linux環(huán)境下調(diào)用一些常用的函數(shù)編寫功能較簡單的程序來實(shí)現(xiàn)操作系統(tǒng)的基本方法、并在實(shí)踐應(yīng)用方面打下一定基礎(chǔ)。要求學(xué)生在實(shí)驗(yàn)指導(dǎo)教師的幫助下自行完成各個(gè)操作環(huán)節(jié),并能實(shí)現(xiàn)且達(dá)到舉一反三的目的,完成一個(gè)實(shí)驗(yàn)解
2、決一類問題。要求學(xué)生能夠全面、深入理解和熟練掌握所學(xué)內(nèi)容,并能夠用其分析、設(shè)計(jì)和解答類似問題;對(duì)此能夠較好地理解和掌握,并且能夠進(jìn)行簡單分析和判斷;能夠熟練使用Linux用戶界面;掌握操作系統(tǒng)中進(jìn)程的概念和控制方法;了解進(jìn)程的并發(fā),進(jìn)程之間的通信方式,了解虛擬存儲(chǔ)管理的基本思想。同時(shí)培養(yǎng)學(xué)生進(jìn)行分析問題、解決問題的能力;培養(yǎng)學(xué)生完成實(shí)驗(yàn)分析、實(shí)驗(yàn)方法、實(shí)驗(yàn)操作與測試、實(shí)驗(yàn)過程的觀察、理解和歸納能力。為了收到良好的實(shí)驗(yàn)效果,編寫了這本實(shí)驗(yàn)指導(dǎo)書。在指導(dǎo)書中,每一個(gè)實(shí)驗(yàn)均按照該課程實(shí)驗(yàn)大綱的要求編寫,力求緊扣理論知識(shí)點(diǎn)、突出設(shè)計(jì)方法、明確設(shè)計(jì)思路,通過多種形式完成實(shí)驗(yàn)任務(wù),最終引導(dǎo)學(xué)生有目的、有方
3、向地完成實(shí)驗(yàn)任務(wù),得出實(shí)驗(yàn)結(jié)果。任課教師在實(shí)驗(yàn)前對(duì)實(shí)驗(yàn)任務(wù)進(jìn)行一定的分析和講解,要求學(xué)生按照每一個(gè)實(shí)驗(yàn)的具體要求提前完成準(zhǔn)備工作,如:查找資料、設(shè)計(jì)程序、完成程序、寫出預(yù)習(xí)報(bào)告等,做到有準(zhǔn)備地上機(jī)。進(jìn)行實(shí)驗(yàn)時(shí),指導(dǎo)教師應(yīng)檢查學(xué)生的預(yù)習(xí)情況,并對(duì)調(diào)試過程給予積極指導(dǎo)。實(shí)驗(yàn)完畢后,學(xué)生應(yīng)根據(jù)實(shí)驗(yàn)數(shù)據(jù)及結(jié)果,完成實(shí)驗(yàn)報(bào)告,由學(xué)習(xí)委員統(tǒng)一收齊后交指導(dǎo)教師審閱評(píng)定。實(shí)驗(yàn)成績考核:實(shí)驗(yàn)成績占計(jì)算機(jī)操作系統(tǒng)課程總評(píng)成績的20%。指導(dǎo)教師每次實(shí)驗(yàn)對(duì)學(xué)生進(jìn)行出勤考核,對(duì)實(shí)驗(yàn)效果作記錄,并及時(shí)批改實(shí)驗(yàn)報(bào)告,綜合評(píng)定每一次的實(shí)驗(yàn)成績,在學(xué)期終了以平均成績作為該生的實(shí)驗(yàn)成績。有以下情形之一者,實(shí)驗(yàn)成績?yōu)椴患案瘢?.
4、遲到、早退、無故缺勤總共3次及以上者;2. 未按時(shí)完成實(shí)驗(yàn)達(dá)3次及以上者;3. 缺交實(shí)驗(yàn)報(bào)告2次及以上者。目 錄第一部分 實(shí)驗(yàn)環(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)調(diào)用函數(shù)2第二部分 實(shí)驗(yàn)內(nèi)容5實(shí)驗(yàn)一 熟悉LINUX基本命令及編程環(huán)境5實(shí)驗(yàn)二 進(jìn)程管理8實(shí)驗(yàn)三 進(jìn)程調(diào)度12實(shí)驗(yàn)四 進(jìn)程間通信17實(shí)驗(yàn)五 存儲(chǔ)管理實(shí)驗(yàn)20ii第一部分 實(shí)驗(yàn)環(huán)境及所用系統(tǒng)函數(shù)介紹DOS操作系統(tǒng)是單道操作系統(tǒng),無法進(jìn)行多道程序設(shè)計(jì),Windows環(huán)境下的Visual C+雖然也可用于多道程序設(shè)計(jì),但是并不是
5、完全的多道,因?yàn)樗部捎糜贒OS編程。所以我們的實(shí)驗(yàn)選用Linux操作系統(tǒng)。Linux操作系統(tǒng)是一個(gè)類UINX操作系統(tǒng),是一個(gè)純多道并發(fā)的網(wǎng)絡(luò)操作系統(tǒng)。1.1 Linux操作系統(tǒng)簡介 Linux是一個(gè)多用戶操作系統(tǒng),是UNIX的一個(gè)克隆版本(界面相同但內(nèi)部實(shí)現(xiàn)不同),同時(shí)它是一個(gè)自由軟件,是免費(fèi)的、源代碼開放的,這是它與UNIX的不同之處?,F(xiàn)在,Linux憑借優(yōu)秀的設(shè)計(jì),不凡的性能,加上IBM、Intel、CA、CORE、Oracle等國際知名企業(yè)的大力支持,市場份額逐步擴(kuò)大,已成為與Windows和UNIX并存的三大主流操作系統(tǒng)之一。1.2 Linux的使用1.2.1 vi的使用1) vi的
6、簡單應(yīng)用vi是linux環(huán)境下赫赫有名的文本編輯工具之一。進(jìn)入vi編輯器的方法: vi filename.c 注:文件名必須帶有擴(kuò)展名.c,如 filename.c否則無法通過編譯;進(jìn)入vi后要按:按“i”鍵從命令方式切換到輸入方式;從輸入方式切換到命令方式的方法:按“Esc”鍵保存文件 :w保存文件并退出 :wq不保存文件退出 :q!注:以上操作必須在命令方式下進(jìn)行。2) 其他常用vi操作命令j,k,h,l:上下左右0: 行首 $: 行尾 ctrl+f :后翻頁 ctrl+b:前翻頁 G : 文件尾 數(shù)字G: 數(shù)字所指定行 i,I
7、 : 插入命令,i 在當(dāng)前光標(biāo)處插入, I 行首插入 a,A: 追加命令,a 在當(dāng)前光標(biāo)后追加,A 在行末追加 o,O: 打開命令,o 在當(dāng)前行下打開一行,O在當(dāng)前行上插入一行 x: 刪除光標(biāo)處字符 dd: 刪除當(dāng)前行 d0: 刪除光標(biāo)前半行 d$: 刪除光標(biāo)后半行 r,R : 替換命令,r 替換當(dāng)前光標(biāo)處字符,R從光標(biāo)處開始替換/string: 查找字符串 n : 繼續(xù)查找 N : 反向繼續(xù)查找 % :查找對(duì)應(yīng)括號(hào) u
8、 :取消上次操作 注:以上操作必須在命令方式下進(jìn)行。1.2.2 gcc的使用gcc是linux下的一種c程序編譯工具,使用方法如下(有提示符#的情況): 編譯: gcc o filename1 filename.c其中: filename.c是源文件名,filename1 是目標(biāo)文件名,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進(jìn)行編譯。執(zhí)行:./ab1.2.3主要系統(tǒng)調(diào)用函數(shù)1.2.1系統(tǒng)調(diào)用fork()功能:創(chuàng)建一個(gè)新的進(jìn)程. 頭文件:#include <unistd.h>說明:本系統(tǒng)調(diào)用產(chǎn)生一個(gè)新的進(jìn)程, 叫子進(jìn)程, 是調(diào)用進(jìn)程的一個(gè)復(fù)制品. 調(diào)用進(jìn)程叫父進(jìn)程, 子進(jìn)程繼承了父進(jìn)程的幾乎所有的屬性。 (1) 該子進(jìn)程繼承了父進(jìn)程的程序空間,復(fù)制了父進(jìn)程的數(shù)據(jù)段和棧段。也就是說不管是父進(jìn)程還是子進(jìn)程,在占有處理機(jī)后,都從fork()調(diào)用的返回點(diǎn)開始運(yùn)行;(2) 調(diào)用成功則對(duì)父進(jìn)程返回子進(jìn)程標(biāo)識(shí)號(hào)pid;(3) 調(diào)用成功對(duì)
10、子進(jìn)程返回0, 這也是最方便的區(qū)分父子進(jìn)程的方法。(4) 若調(diào)用失敗則返回-1給父進(jìn)程, 子進(jìn)程不生成。 注意:如果fork()值>0,>0的數(shù)即是子進(jìn)程號(hào)。但這時(shí)是父進(jìn)程占有處理機(jī)。1.2.2系統(tǒng)調(diào)用wait(&status):功能: 等待子進(jìn)程結(jié)束。(1)當(dāng)有多個(gè)子進(jìn)程時(shí),任一個(gè)子進(jìn)程結(jié)束即將控制返回調(diào)用者,并將子進(jìn)程調(diào)用exit (status)時(shí)的status值送到&status指針?biāo)竼卧小?2)在控制返回調(diào)用者時(shí),同時(shí)將所等到的子進(jìn)程pid作為wait()系統(tǒng)調(diào)用函數(shù)的返回值。(3)waitpid(pid,):等待pid所指定的進(jìn)程結(jié)束。(4)返回值:
11、等待到一個(gè)子進(jìn)程返回時(shí),返回值為該子進(jìn)程號(hào);否則返回值為1。說明: 允許調(diào)用進(jìn)程(即父進(jìn)程)取得子進(jìn)程的狀態(tài)信息,調(diào)用進(jìn)程將會(huì)掛起直到其一個(gè)子進(jìn)程終止。1.2.3系統(tǒng)調(diào)用exit()功能: 終止進(jìn)程. 語法: #include <stdlib.h> void exit(status) int status功能:調(diào)用進(jìn)程被該系統(tǒng)調(diào)用終止。該系統(tǒng)調(diào)用發(fā)出后,操作系統(tǒng)將從系統(tǒng)中刪除調(diào)用exit的進(jìn)程,并將status值傳給等待它結(jié)束的父進(jìn)程。返回值: 無 1.2.4系統(tǒng)調(diào)用kill()功能: 向一個(gè)或一組進(jìn)程發(fā)送一個(gè)信號(hào)。 語法:#include <signal.h> int
12、 kill(pid, sig); pid_t pid; int sig;說明:向一個(gè)或一組進(jìn)程發(fā)送一個(gè)信號(hào),該信號(hào)由參數(shù)sig指定,為系統(tǒng)給出的信號(hào)表中的一個(gè)。Sig是signal的縮寫。返回值: 調(diào)用成功則返回0,否則返回-1. kill -STOP pid: 發(fā)送SIGSTOP (17,19,23)停止一個(gè)進(jìn)程,而并不消滅這個(gè)進(jìn)程。kill -CONT pid: 發(fā)送SIGCONT (19,18,25)重新開始一個(gè)停止的進(jìn)程。kill -KILL pid: 發(fā)送SIGKILL (9)強(qiáng)迫進(jìn)程立即停止,并且不實(shí)施清理操作。kill -9 -1: 終止擁有的全部進(jìn)程。SIGKILL和SIGST
13、OP信號(hào)不能被捕捉、封鎖或者忽略。1.2.5系統(tǒng)調(diào)用lockf()功能:應(yīng)用、檢測或刪除打開文件的一個(gè)POSIX鎖語法:#include <unistd.h> int lockf(int fd, int cmd, off_t len);說明: 應(yīng)用、檢測或刪除打開文件某部分的一個(gè)POSIX鎖,文件通過fd指明,文件的描述符的請(qǐng)求操作通過cmd指明。#define F_ULOCK 0 解鎖一個(gè)區(qū)域#define F_LOCK 1 上鎖一個(gè)區(qū)域#define F_TLOCK 2 檢測并上鎖一個(gè)區(qū)域#define F_TEST 3 檢測一個(gè)區(qū)域是否上鎖文件上鎖區(qū)域的請(qǐng)求起始于隱含的偏移并
14、包好len字節(jié),假如len為負(fù),從pospos+len-1,這里pos為當(dāng)前文件位置,假如len為零,則位置從當(dāng)前文件位置延伸延伸到無限長,包括當(dāng)前和以后的文件最后的位置。在所有情況下,位置可延伸到以前當(dāng)前的文件的最后位置。在Linux中,這稱為fcntl(2)的接口(一般會(huì)指明lockf 和fcntl的關(guān)系)。1.2.6 系統(tǒng)調(diào)用pipe()是用來建立管道的。語法: #include <unistd.h> int pipe(int fd2); 這里fd1為寫入端,fd0為讀出端。功能:從管道里寫或從管道里讀。.25.計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書第二部分 實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)一 熟悉LINUX
15、基本命令及編程環(huán)境一、 實(shí)驗(yàn)類型 本實(shí)驗(yàn)為驗(yàn)證性實(shí)驗(yàn)。二、 實(shí)驗(yàn)?zāi)康呐c任務(wù)1) 熟悉使用Linux字符界面,窗口系統(tǒng)的常用命令;2) 熟悉運(yùn)用Linux常用的編程工具;3) 熟悉運(yùn)用Linux的在線求助系統(tǒng)。三、 預(yù)習(xí)要求1) 熟悉一種操作系統(tǒng)的使用和安裝,如windows操作系統(tǒng)的安裝,DOS系統(tǒng)的使用2) 了解進(jìn)程的概念及進(jìn)程的狀態(tài)3) 熟悉c語言程序設(shè)計(jì)4) 熟悉c語言程序編譯過程四、 實(shí)驗(yàn)基本原理進(jìn)入Linux操作系統(tǒng)后,控制終端的命令行輸入方式下輸入各種命令,并顯示各種命令操作后的輸出結(jié)果,操作包括文件操作命令的使用,vi命令的使用以及gcc編譯器的使用,詳細(xì)的各種命令及使用方式見第
16、一部分的介紹。五、 實(shí)驗(yàn)儀器與設(shè)備(或工具軟件) 實(shí)驗(yàn)設(shè)備:計(jì)算機(jī)一臺(tái),軟件環(huán)境要求:安裝Red Hat Linux操作系統(tǒng)和gcc編譯器。六、 實(shí)驗(yàn)內(nèi)容1) 使用常用的操作命令ls, cp, rm, mkdir, man, vi等。2) 熟悉怎么編輯一個(gè)程序(編輯,調(diào)試,運(yùn)行見),輸入一個(gè)簡單的C程序進(jìn)行練習(xí),參考練習(xí)程序如下:程序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"); 七、 實(shí)驗(yàn)步驟1) 進(jìn)入Linux操作系統(tǒng)開機(jī)后,選擇進(jìn)入Linux操
18、作系統(tǒng)方式,輸入用戶名和密碼,即可進(jìn)入Linux操作系統(tǒng)。2) 進(jìn)入控制終端的命令行輸入方式在Linux操作系統(tǒng)環(huán)境下,點(diǎn)擊“小紅帽”菜單,選擇“系統(tǒng)”下拉菜單,選擇“終端”選項(xiàng),進(jìn)入命令行輸入方式。3) 輸入命令后按回車鍵在命令行輸入方式下,輸入各種文件操作命令,并按回車查看顯示結(jié)果。八、 注意事項(xiàng)1) gcc編譯器不能編譯不帶擴(kuò)展名的c語言程序。2) 注意編譯和運(yùn)行程序的基本過程。3) 注意熟練使用man命令來查看某條命令的含義及使用方式。九、 實(shí)驗(yàn)報(bào)告要求 要求列出多條命令的使用和相應(yīng)結(jié)果,需要列出運(yùn)行了的程序清單及相應(yīng)結(jié)果,并對(duì)結(jié)果進(jìn)行分析和討論。實(shí)驗(yàn)二 進(jìn)程管理一、 實(shí)驗(yàn)類型 本實(shí)驗(yàn)
19、為設(shè)計(jì)性實(shí)驗(yàn)。二、 實(shí)驗(yàn)?zāi)康呐c任務(wù)1) 加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。2) 進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)三、 預(yù)習(xí)要求1) 進(jìn)程的概念2) 進(jìn)程控制的概念及內(nèi)容3) 進(jìn)程的并發(fā)執(zhí)行4) 熟悉互斥的概念5) 用到的Linux函數(shù)有:fork(),lockf()等。四、 實(shí)驗(yàn)基本原理 使用fork()系統(tǒng)調(diào)用來創(chuàng)建一個(gè)子進(jìn)程,父進(jìn)程和子進(jìn)程并發(fā)執(zhí)行,交替輸出結(jié)果。使用lockf()系統(tǒng)調(diào)用對(duì)臨界區(qū)進(jìn)行加鎖操作,實(shí)現(xiàn)對(duì)共享資源的互斥使用。五、 實(shí)驗(yàn)儀器與設(shè)備(或工具軟件)實(shí)驗(yàn)設(shè)備:計(jì)算機(jī)一臺(tái),軟件環(huán)境要求:安裝Red Hat Linux操作系統(tǒng)和gcc編譯器。六、 實(shí)驗(yàn)內(nèi)容1)進(jìn)程的創(chuàng)建
20、編寫一段程序,使用系統(tǒng)調(diào)用fork( ) 創(chuàng)建兩個(gè)子程序。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示字符“a”;子進(jìn)程分別顯示字符“b”和字符“c”。運(yùn)行程序10次,觀察記錄屏幕上的顯示結(jié)果,并分析原因。2)進(jìn)程的控制 修改已編寫的程序,將每個(gè)進(jìn)程輸出一個(gè)字符改為每個(gè)進(jìn)程輸出一句話,再觀察程序執(zhí)行時(shí)屏幕上出現(xiàn)的現(xiàn)象,并分析原因。如果在程序中使用系統(tǒng)調(diào)用lockf()來給每一個(gè)進(jìn)程加鎖,可以實(shí)現(xiàn)進(jìn)程間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。 (1)進(jìn)程的創(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');運(yùn)行結(jié)果:bca(或bac)分析:從進(jìn)程并發(fā)執(zhí)行來看,輸出bac,acb等情況都有可能。原因:fork()創(chuàng)建進(jìn)程所需的時(shí)間要多于輸出一個(gè)字符的時(shí)間,因此在主程序創(chuàng)建進(jìn)程的同時(shí),進(jìn)程2就輸出了”b”,而進(jìn)程2和主程序的輸出次序是隨機(jī)的,所以出現(xiàn)上述結(jié)果。(2)進(jìn)程的控制參考程序如下#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);運(yùn)行結(jié)果:略分析:由于函數(shù)printf()輸出和字符串之間不會(huì)被中斷,因此字符串內(nèi)部的字符順序輸出不
23、變。但是由于進(jìn)程并發(fā)執(zhí)行時(shí)的調(diào)度順序和父進(jìn)程的搶占處理機(jī)問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。進(jìn)程加鎖后的參考程序如下:#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)運(yùn)行結(jié)果:略分析:學(xué)生自己完成七、 實(shí)驗(yàn)步驟1) 進(jìn)入vi編輯器2) 在編譯器中輸入所要運(yùn)行的程序代碼3) 退出編輯器,返回命令行輸入方式,使用gcc編譯器編譯程序,獲得能運(yùn)行的目標(biāo)程序。4) 運(yùn)行目標(biāo)程序,查看運(yùn)行結(jié)果。八、 注意事項(xiàng)1) 如果使用gcc編譯程序有錯(cuò)的話,需要重新修改程序,直到無錯(cuò)為止。2) 注意系統(tǒng)是如何創(chuàng)建進(jìn)程的?3) 查看結(jié)果是否是交替輸出,如果修改輸
25、出的次數(shù)是否會(huì)出現(xiàn)交替現(xiàn)象?4) 相關(guān)函數(shù)的介紹見第一部分的介紹。九、 實(shí)驗(yàn)報(bào)告要求 需要列出運(yùn)行了的程序清單及相應(yīng)結(jié)果,并對(duì)結(jié)果進(jìn)行分析和討論。對(duì)結(jié)果的分析主要討論結(jié)果為什么會(huì)交替出現(xiàn)?并發(fā)進(jìn)程是如何執(zhí)行的?實(shí)驗(yàn)三 進(jìn)程調(diào)度一、 實(shí)驗(yàn)類型本實(shí)驗(yàn)為綜合性實(shí)驗(yàn)二、 實(shí)驗(yàn)?zāi)康呐c任務(wù)在采用多道程序設(shè)計(jì)的系統(tǒng)中,往往有若干個(gè)進(jìn)程同時(shí)處于就緒狀態(tài)。當(dāng)就緒進(jìn)程個(gè)數(shù)大于處理機(jī)數(shù)時(shí),就必須依照某種策略來決定那些進(jìn)程優(yōu)先占用處理機(jī)。本實(shí)驗(yàn)?zāi)M在單處理機(jī)情況下的處理機(jī)調(diào)度,幫助學(xué)生加深了解處理機(jī)調(diào)度的工作。三、 預(yù)習(xí)要求1) 熟悉進(jìn)程控制塊和進(jìn)程組織方式2) 熟悉進(jìn)程調(diào)度的概念3) 熟悉時(shí)間片輪轉(zhuǎn)調(diào)度算法等4)
26、熟悉c語言編程,指針及結(jié)構(gòu)體等知識(shí)5) 數(shù)據(jù)結(jié)構(gòu)中的鏈表的建立及基本操作四、 實(shí)驗(yàn)基本原理 進(jìn)程控制塊通過鏈表隊(duì)列的方式組織起來,系統(tǒng)中存在運(yùn)行隊(duì)列和就緒隊(duì)列(為簡單起見,不設(shè)阻塞隊(duì)列),進(jìn)程的調(diào)度就是進(jìn)程控制塊在運(yùn)行隊(duì)列和就緒隊(duì)列之間的切換。當(dāng)需要調(diào)度時(shí),從就緒隊(duì)列中挑選一個(gè)進(jìn)程占用處理機(jī),即從就緒隊(duì)列中刪除一個(gè)進(jìn)程,插入到運(yùn)行隊(duì)列中,當(dāng)占用處理機(jī)的進(jìn)程運(yùn)行的時(shí)間片完成后,放棄處理機(jī),即在運(yùn)行隊(duì)列中的進(jìn)程控制塊等待一段時(shí)間(時(shí)間片)后,從該隊(duì)列上刪除,如果該進(jìn)程運(yùn)行完畢,則刪除該進(jìn)程(節(jié)點(diǎn));否則,則插入到就緒隊(duì)列中。五、 實(shí)驗(yàn)儀器與設(shè)備(或工具軟件)實(shí)驗(yàn)設(shè)備:計(jì)算機(jī)一臺(tái),軟件環(huán)境要求:安裝
27、Red Hat Linux操作系統(tǒng)和gcc編譯器。六、 實(shí)驗(yàn)內(nèi)容設(shè)計(jì)一個(gè)時(shí)間片輪轉(zhuǎn)調(diào)度算法實(shí)現(xiàn)處理機(jī)調(diào)度的程序,具體內(nèi)容如下1) 實(shí)驗(yàn)中使用的數(shù)據(jù)結(jié)構(gòu)(1) PCB進(jìn)程控制塊內(nèi)容包括參數(shù)進(jìn)程名name;要求運(yùn)行時(shí)間 runtime;優(yōu)先數(shù) prior;狀態(tài) state;已運(yùn)行時(shí)間runedtime。(2) 為簡單起見,只設(shè)運(yùn)行隊(duì)列,就緒鏈表兩種數(shù)據(jù)結(jié)構(gòu),進(jìn)程的調(diào)度在這兩個(gè)隊(duì)列中切換,如圖3.1所示運(yùn)行隊(duì)列PCBi就緒隊(duì)列PCBjPCBj1PCBj1圖3.1PCB鏈表2) 每個(gè)進(jìn)程運(yùn)行時(shí)間隨機(jī)產(chǎn)生,為120之間的整數(shù)。3) 時(shí)間片的大小由實(shí)驗(yàn)者自己定義,可為3或54) 可參考的程序流程圖如圖3.
28、2否否是建立運(yùn)行隊(duì)列指針,初始值指向空建立就緒隊(duì)列,每個(gè)進(jìn)程設(shè)置相應(yīng)參數(shù),如運(yùn)行時(shí)間,進(jìn)程名字等從就緒隊(duì)列中按時(shí)間先后順序選一個(gè)進(jìn)程插入運(yùn)行隊(duì)列每個(gè)進(jìn)程占用處理機(jī)一個(gè)時(shí)間片,即runtime=runtime-時(shí)間片大小如果runtime0?Runtime=0修改相應(yīng)參數(shù)修改相應(yīng)參數(shù)結(jié)束該進(jìn)程,即釋放節(jié)點(diǎn)空間將該進(jìn)程插入就緒隊(duì)列中就緒隊(duì)列為空嗎?產(chǎn)生一次調(diào)度,即按時(shí)間先后順序從頭節(jié)點(diǎn)刪除一個(gè)節(jié)點(diǎn)插入運(yùn)行隊(duì)列中結(jié)束程序是圖3.2模擬進(jìn)程調(diào)度的流程圖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) 運(yùn)行結(jié)果,包括各個(gè)進(jìn)程的運(yùn)行順序,每次占用處理機(jī)的運(yùn)行時(shí)間,可以參考下列輸出如圖4.3。圖4.3輸出結(jié)果示意圖七、 實(shí)驗(yàn)步驟1) 進(jìn)入vi編輯器2) 在編譯器中輸入所要運(yùn)行的程序代碼3) 退出編輯器,返回命令行輸入方式,使用gcc編譯器編譯程序,獲得能運(yùn)行的目標(biāo)程序。4) 運(yùn)行目標(biāo)程序,查看運(yùn)行結(jié)果。八、 注意事項(xiàng)1) 修改時(shí)間片大小,查看對(duì)實(shí)驗(yàn)結(jié)果的影響。2) 隨機(jī)數(shù)的產(chǎn)生由rand(
34、)函數(shù)實(shí)現(xiàn),rand()的輸出隨機(jī)數(shù)范圍在0215之間,需要轉(zhuǎn)換到020范圍。3) 注意鏈表節(jié)點(diǎn)的插入,刪除方法。九、 實(shí)驗(yàn)報(bào)告要求需要列出運(yùn)行了的程序清單及相應(yīng)結(jié)果,并對(duì)結(jié)果進(jìn)行分析和討論。對(duì)結(jié)果的分析主要討論時(shí)間片大小對(duì)程序執(zhí)行的影響?實(shí)驗(yàn)四 進(jìn)程間通信 一、 實(shí)驗(yàn)類型 本實(shí)驗(yàn)為設(shè)計(jì)性實(shí)驗(yàn)二、 實(shí)驗(yàn)?zāi)康呐c任務(wù)了解Linux系統(tǒng)中的進(jìn)程管道通信的基本原理,并能編寫簡單的管道通信的程序。三、 預(yù)習(xí)要求1) 熟悉進(jìn)程通信的概念2) 熟悉管道通信的基本原理3) 用到的系統(tǒng)調(diào)用有pipe()四、 實(shí)驗(yàn)基本原理 實(shí)驗(yàn)利用Linux操作系統(tǒng)提供的系統(tǒng)調(diào)用pipe()來實(shí)現(xiàn)兩個(gè)進(jìn)程之間的通信。輸入進(jìn)程從管
35、道的一端輸入數(shù)據(jù),另一個(gè)進(jìn)程從管道的另一端讀數(shù)據(jù),通過這種方式來實(shí)現(xiàn)進(jìn)程間的通信。五、 實(shí)驗(yàn)儀器與設(shè)備(或工具軟件)實(shí)驗(yàn)設(shè)備:計(jì)算機(jī)一臺(tái),軟件環(huán)境要求:安裝Red Hat Linux操作系統(tǒng)和gcc編譯器。六、 實(shí)驗(yàn)內(nèi)容編制一段程序,實(shí)現(xiàn)進(jìn)程管道通信。使用系統(tǒng)調(diào)用pipe()建立一條管道。兩個(gè)子進(jìn)程P1和P2分別向管道各寫一句話:Child process 1 is sending message!Child process 2 is sending message!而父進(jìn)程則從管道中讀出來自兩個(gè)子進(jìn)程的信息,顯示在屏幕上。參考程序程序如下#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);七、 實(shí)驗(yàn)步驟1) 進(jìn)入vi編輯器2) 在
38、編譯器中輸入所要運(yùn)行的程序代碼3) 退出編輯器,返回命令行輸入方式,使用gcc編譯器編譯程序,獲得能運(yùn)行的目標(biāo)程序。4) 運(yùn)行目標(biāo)程序,查看運(yùn)行結(jié)果。八、 注意事項(xiàng)1) 管道按怎樣的方式傳送消息?是否能夠雙向傳送消息?2) 在管道通信方式中,如何來實(shí)現(xiàn)進(jìn)程同步與互斥的?3) pipe()函數(shù)的使用可參看第一部分的介紹。九、 實(shí)驗(yàn)報(bào)告要求需要列出運(yùn)行了的程序清單及相應(yīng)結(jié)果,并對(duì)結(jié)果進(jìn)行分析和討論。對(duì)結(jié)果的分析主要討論管道通信方式的特點(diǎn),實(shí)驗(yàn)結(jié)果是否體現(xiàn)該特點(diǎn)。實(shí)驗(yàn)五 存儲(chǔ)管理實(shí)驗(yàn)一、 實(shí)驗(yàn)類型 本實(shí)驗(yàn)為綜合性實(shí)驗(yàn)。二、 實(shí)驗(yàn)?zāi)康呐c任務(wù)1) 理解動(dòng)態(tài)異長存儲(chǔ)分區(qū)資源管理2) 掌握所需數(shù)據(jù)結(jié)構(gòu)和管理
39、程序3) 了解各種存儲(chǔ)分配算法的優(yōu)點(diǎn)和缺點(diǎn)。4) 編程實(shí)現(xiàn)動(dòng)態(tài)不等長存儲(chǔ)管理的模擬程序。三、 預(yù)習(xí)要求1) 進(jìn)程控制的概念及內(nèi)容2) 熟悉存儲(chǔ)管理的概念3) 了解動(dòng)態(tài)分區(qū)管理的思想,熟悉分配算法和回收算法4) 熟悉c語言編程,指針及結(jié)構(gòu)體等知識(shí)5) 數(shù)據(jù)結(jié)構(gòu)中的鏈表的建立及基本操作四、 實(shí)驗(yàn)基本原理 使用一個(gè)一維數(shù)組來模擬內(nèi)存儲(chǔ)空間,建立內(nèi)存塊來記錄內(nèi)存分配使用情況,通過隨機(jī)產(chǎn)生進(jìn)程及其所需要的內(nèi)存來模擬真實(shí)的進(jìn)程。通過給進(jìn)程分配內(nèi)存及回收來實(shí)現(xiàn)對(duì)動(dòng)態(tài)不等長存儲(chǔ)管理方法。五、 實(shí)驗(yàn)儀器與設(shè)備(或工具軟件)實(shí)驗(yàn)設(shè)備:計(jì)算機(jī)一臺(tái),軟件環(huán)境要求:安裝Red Hat Linux操作系統(tǒng)和gcc編譯器。
40、六、 實(shí)驗(yàn)內(nèi)容1) 實(shí)驗(yàn)中使用的數(shù)據(jù)結(jié)構(gòu)(1) 內(nèi)存塊表,包括參數(shù)進(jìn)程名name;起始地址 address;長度 length;標(biāo)志 flag,表示該塊是否被分配。(2) 為簡單起見,只設(shè)內(nèi)存分配記錄鏈表數(shù)據(jù)結(jié)構(gòu),用來記錄內(nèi)存分配與空閑情況。2) 實(shí)驗(yàn)中假設(shè)有若干個(gè)進(jìn)程,如5個(gè),每個(gè)需要空間隨機(jī)產(chǎn)生,為020之間的整數(shù),進(jìn)程名字實(shí)驗(yàn)者自己定義,可以是一個(gè)整數(shù)。3) 其他一些參數(shù),如內(nèi)存空間的大小實(shí)驗(yàn)者自己定義,建議為100;4) 為了得到清晰的實(shí)驗(yàn)結(jié)果,建議先給每個(gè)進(jìn)程分配存儲(chǔ)空間,后進(jìn)行回收。5) 程序的流程圖如圖5.1, 圖5.2, 圖5.3建立鏈表初始化鏈表,表示整個(gè)存儲(chǔ)空間對(duì)5個(gè)進(jìn)程分
41、別分配空間回收1個(gè)進(jìn)程結(jié)束程序圖5.1總的流程圖否是查找鏈表,找到一個(gè)大于或等于進(jìn)程所需空間的空閑節(jié)點(diǎn)|節(jié)點(diǎn)空間-進(jìn)程空間|<minsize將節(jié)點(diǎn)分配給該進(jìn)程,即修改相應(yīng)參數(shù)將該節(jié)點(diǎn)空間分割成兩部分,分別修改其參數(shù),插入鏈表分配結(jié)束圖5.2分配流程圖僅右都為空閑節(jié)點(diǎn)僅左都為空閑節(jié)點(diǎn)查找鏈表,找到相應(yīng)記錄進(jìn)程使用內(nèi)存的節(jié)點(diǎn)分四種情況回收空間與合并左右節(jié)點(diǎn),即修改相應(yīng)參數(shù),刪除多余節(jié)點(diǎn)與左節(jié)點(diǎn)合并,即修改相應(yīng)參數(shù),刪除多余節(jié)點(diǎn)與右節(jié)點(diǎn)合并,即修改相應(yīng)參數(shù),刪除多余節(jié)點(diǎn)回收該節(jié)點(diǎn),即修改有關(guān)參數(shù)回收結(jié)束左右都為空閑節(jié)點(diǎn)直接修改該節(jié)點(diǎn)的參數(shù)左右都不為空閑節(jié)點(diǎn)圖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; /初始化存儲(chǔ)空間 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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國腫瘤醫(yī)院行業(yè)市場深度調(diào)研及競爭格局與投資報(bào)告
- 2025至2030中國肉鴨行業(yè)市場發(fā)展分析及競爭格局與投資前景報(bào)告
- 2025至2030中國聚氯乙烯安全門行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國職業(yè)裝行業(yè)市場深度研究及發(fā)展前景投資可行性分析報(bào)告
- 2025至2030中國羽絨市場前景經(jīng)營狀況及運(yùn)行態(tài)勢研究報(bào)告
- 智能排期系統(tǒng)行業(yè)供應(yīng)鏈優(yōu)化策略研究
- 2025至2030中國網(wǎng)球拍行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國維卡軟化溫度測試儀行業(yè)深度研究及發(fā)展前景投資評(píng)估分析
- 2025至2030中國經(jīng)濟(jì)金融行業(yè)市場深度調(diào)研報(bào)告
- 影視制作招商組織架構(gòu)及職責(zé)
- 熱射病的診斷與治療
- 期末考試成績分析表
- JJF 1076-2020數(shù)字式溫濕度計(jì)校準(zhǔn)規(guī)范
- GB/T 9074.18-2017自攻螺釘和平墊圈組合件
- 長沙梅溪湖國際新城產(chǎn)業(yè)組織與西區(qū)土地一級(jí)開發(fā)
- GB/T 3768-2017聲學(xué)聲壓法測定噪聲源聲功率級(jí)和聲能量級(jí)采用反射面上方包絡(luò)測量面的簡易法
- 臨床診療指南(急診醫(yī)學(xué))
- GB 2811-2007安全帽
- 胸腔積液PPT.ppt 課件
- 斷指再植術(shù)后的切口
- 曾國藩為官之道
評(píng)論
0/150
提交評(píng)論