操作系統(tǒng)實驗報告(通用5篇)
在生活中,大家逐漸認識到報告的重要性,我們在寫報告的時候要注意語言要準確、簡潔。其實寫報告并沒有想象中那么難,以下是小編精心整理的操作系統(tǒng)實驗報告,僅供參考,希望能夠幫助到大家。
操作系統(tǒng)實驗報告 1
一、實驗目的
用高級語言編寫和調試一個進程調度程序,以加深對進程的概念及進程調度算法的理解。
二、實驗內容和要求
編寫并調試一個模擬的進程調度程序,采用“簡單時間片輪轉法”調度算法對五個進程進行調度。
每個進程有一個進程控制塊( PCB)表示。進程控制塊可以包含如下信息:進程名、到達時間、需要運行時間、已運行時間、進程狀態(tài)等等。
進程的到達時間及需要的運行時間可以事先人為地指定(也可以由隨機數產生)。進程的到達時間為進程輸入的時間。 進程的運行時間以時間片為單位進行計算。 每個進程的狀態(tài)可以是就緒 W(Wait)、運行R(Run)兩種狀態(tài)之一。
就緒進程獲得 CPU后都只能運行一個時間片。用運行時間加1來表示。
如果運行一個時間片后,進程的已占用 CPU時間已達到所需要的運行時間,則撤消該進程,如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續(xù)運行,此時應分配時間片給就緒隊列中排在該進程之后的進程,并將它插入就緒隊列隊尾。 每進行一次調度程序都打印一次運行進程、就緒隊列、以及各個進程的 PCB,以便進行檢查。
重復以上過程,直到所要進程都完成為止。
三、實驗主要儀器設備和材料
硬件環(huán)境:IBM-PC或兼容機
軟件環(huán)境:C語言編程環(huán)境
四、實驗原理及設計方案
1、進程調度算法:采用多級反饋隊列調度算法。其基本思想是:當一個新進程進入內在后,首先將它放入第一個隊列的末尾,按FCFS原則排隊等待高度。當輪到該進程執(zhí)行時,如能在該時間片內完成,便可準備撤離系統(tǒng);如果它在一個時間片結束時尚為完成,調度程序便將該進程轉入第二隊列的`末尾,再同樣地按FCFS原則等待調度執(zhí)行,以此類推。
2、實驗步驟:
。1)按先來先服務算法將進程排成就緒隊列。
。2)檢查所有隊列是否為空,若空則退出,否則將隊首進程調入執(zhí)行。
。3)檢查該運行進程是否運行完畢,若運行完畢,則撤消進程,否則,將該進程插入到下一個邏輯隊列的隊尾。
(4)是否再插入新的進程,若是則把它放到第一邏輯隊列的列尾。
。5)重復步驟(2)、(3)、(4),直到就緒隊列為空。
五、流程圖
六、結果過程及截圖 初始化隊列
按Y鍵繼續(xù)運行進程:
按Y鍵繼續(xù)運行進程:
運行若干次后的狀態(tài):
添加新的進程:
七、所遇困難的解決以及心得體會
在這個多級反饋的實驗中,我采取了用一條實際上的鏈表隊列來模擬多個邏輯上的隊列,通過維護幾個鏈表的狀態(tài)信息來找到每個進程運行完后應該插入的地方,還有一個標志位Fend用來表明新插入的隊列的位置。雖然實驗原理很簡單,但是在編寫代碼的過程中遇到了不少的問題,在兩個小時之內已經完成的大體代碼的編寫,但是之中存在不少的問題,導致了用了差不多四個小時的時間去調試才把它弄好,這主要歸咎于在開始設計代碼的不太合理,在后期使得代碼結構有些混亂,使得調試更加的麻煩,以及對編程的不熟悉。通過這個實驗不僅使我對進程的調度算法有了更深的認識,使得理論知識得到的實踐,也使我的編程能力得到了進一步提高。
七、思考題
分析不同調度算法的調度策略,比較不同調度算法的優(yōu)缺點,總結它們的適用范圍。
答:動態(tài)有限權算法:動態(tài)優(yōu)先權是指在創(chuàng)建進程時所創(chuàng)建的優(yōu)先權,會隨進程的推進或者等待時間的增加而改變,以便獲得更好的調度性能。處理機為每個進程分配一定的時間片,在就緒隊列中,優(yōu)先權高的進程將優(yōu)先獲得處理機,進程在進去運行完響應的時間片后,如沒完成,優(yōu)先權減1,從新回到就緒隊列等待分配處理機。
時間片的輪轉法:系統(tǒng)將所有進程排成一個隊列,按照先來先服務的原則,對隊列首的進程進行處理,每個進程在用完自己的時間片后,從新回到隊尾進行排隊。每運行一次,進程的需要時間減1,直到就緒隊列為空!
八、源代碼
#include #include
#include
#define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0
#define TIME 2//時間片長度
typedef struct pcb{//進程管理塊 char name[10];//進程名字 char state; //進程狀態(tài)
int queue; int ntime; int rtime; int etime;
//進程所在的隊列
//進程需要運行的時間
//進程已經運行的時間
//進程在本隊列可運行的時間片
struct pcb *link;
}PCB;
PCB *ready = NULL, *p = NULL, *pfend = NULL,*p =NULL; 位置的變量
int geti() //使用戶僅能輸入整數 {
char ch; int i = 0; fflush(stdin); ch = get); while(ch == ){
//就緒隊列,進程插入
printf(
fflush(stdin); ch = get); }
while(ch != ){
if(ch > 9 || ch
fflush(stdin); i = 0; ch = get);
}else{ i = i*10 + (ch - 0); }
ch = get);
}
return i;
}
void findpos()//更新狀態(tài)量 {
PCB *ps = pfend;
if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1) p = ps; else{ while (ps->link && ps ->link->queue != (pfend ->queue +2)) }
ps = ps->link; p = ps;
}
void ()//插入進程 {
if(!ready ){
ready = p;
pfend = p; p = p;
}else if(ready ->queue == 1){//第一隊列存在
p->link = pfend->link; pfend->link = p; pfend = p; findpos();
}
void input()/*建立進程控制塊函數*/ {
int i,num;
printf(
for(i=0; i
p=getpch(PCB);
printf(
printf(
p->queue =1;
p->etime = TIME; p->link=NULL;
();/*調用函數*/ } else{ p->link = ready; ready = p; }
findpos();
}
void disp(PCB *pr)/*建立進程現實函數,用于顯示當前進程*/ {
printf(
}
void check()/*建立進程查看函數*/
{
}
void sort()//調整進程隊列
{
} if(!ready->link ||ready->queue link->queue) return; p = ready ->link; ready ->link = p ->link; p ->link = ready; p = ready; ready = p; if (ready && ready -> queue == p ->queue){ findpos(); } PCB *pr; printf(
void addnew()//添加新的進程
{
if(ready ->queue != 1){ (ready -> queue)++; ready->etime *= 2; ready -> state=w; sort();/*調用sort函數*/ input(); } else{ input();
}
}
void destroy()/*建立進程撤銷函數(進程運行結束,撤銷進程)*/
{
}
void running()/*建立進程就緒函數(進程運行時間到,置就緒狀態(tài))*/
{
}
void main()
{
char ch; input(); while(ready != NULL) { printf(
}
ready ->state = R; check(); running(); printf(
操作系統(tǒng)實驗報告 2
一、實驗目的
本實驗要求學生模擬作業(yè)調度的實現,用高級語言編寫和調試一個或多個作業(yè)調度的模擬程序,了解作業(yè)調度在操作系統(tǒng)中的作用,以加深對作業(yè)調度算法的理解。
二、實驗內容和要求
1、編寫并調度一個多道程序系統(tǒng)的作業(yè)調度模擬程序。
作業(yè)調度算法:采用基于先來先服務的調度算法?梢詤⒖颊n本中的方法進行設計。 對于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數量、調度作業(yè)時必須考慮到每個作業(yè)的資源要求。
三、實驗主要儀器設備和材料
硬件環(huán)境:IBM-PC或兼容機
軟件環(huán)境:C語言編程環(huán)境
四、實驗原理及設計方案
采用多道程序設計方法的操作系統(tǒng),在系統(tǒng)中要經常保留多個運行的作業(yè),以提高系統(tǒng)效率。作業(yè)調度從系統(tǒng)已接納的暫存在輸入井中的一批作業(yè)中挑選出若干個可運行的作業(yè),并為這些被選中的作業(yè)分配所需的系統(tǒng)資源。對被選中運行的作業(yè)必須按照它們各自的作業(yè)說明書規(guī)定的步驟進行控制。
采用先來先服務算法算法模擬設計作業(yè)調度程序。
。1)作業(yè)調度程序負責從輸入井選擇若干個作業(yè)進入主存,為它們分配必要的資源,當它們能夠被進程調度選中時,就可占用處理器運行。作業(yè)調度選擇一個作業(yè)的必要條件是系統(tǒng)中現有的尚未分配的資源可滿足該作業(yè)的資源要求。但有時系統(tǒng)中現有的尚未分配的資源既可滿足某個作業(yè)的要求也可滿足其它一些作業(yè)的要求,那么,作業(yè)調度必須按一定的算法在這些作業(yè)中作出選擇。先來先服務算法是按照作業(yè)進入輸入井的先后次序來挑選作業(yè),先進入輸入井的作業(yè)優(yōu)先被挑選,當系統(tǒng)中現有的尚未分配的資源不能滿足先進入輸入井的.作業(yè)時,那么順序挑選后面的作業(yè)。
(2) 假定某系統(tǒng)可供用戶使用的主存空間共100k,并有5臺磁帶機。
。3)流程圖:
五、結果過程及截圖
讀取文件jobs.txt來初始化主存,磁帶機的個數,并打印出來。
初始時間是9:00:
按Y運行5分鐘:
按Y運行5分鐘:
按Y運行5分鐘:
多次運行后最后狀態(tài):
六、所遇困難的解決以及心得體會
這個實驗是花的時間最多的一個實驗,第一次做的時候由于理解有些問題,所以做錯了。之后重新做了一遍,收獲還是很多的,遇到了很多的細節(jié)問題,例如像是時間化成浮點數和浮點數化成時間等一些問題,從中也暴露了自己的編程能力欠缺,之后要多多的寫程序。
七、思考題
1、 寫出每種算法的調度策略,最后比較各種算法的優(yōu)缺點。
答:先來先服務算法是根據作業(yè)的進入時間來排序,到達時間短的先運行,優(yōu)點是實現簡單,缺點是運行時間慢。
短作業(yè)優(yōu)先算法是根椐作業(yè)的估計運行時間來排序,估計運行時間短的先運行,優(yōu)點是運行時間快,缺點是實現起來比較復雜。
2、 選擇調度算法的依據是什么?
答:如果作業(yè)要求的速度不高,而且作業(yè)比較小型,那就最好用先來先服務算法。
如果作業(yè)要求的速度高,作業(yè)流程復雜,那就最好用短作業(yè)優(yōu)先算法。
八、源代碼
#include
#include
#include
#include
#define getjcb() (JCB*)malloc(sizeof(JCB))
typedef struct {//資源的總量
int memory; int tape;
}RESOURCE;
typedef struct JCB {//作業(yè)控制塊
char username[20];//用戶名
char jobname[10];//作業(yè)名
char state;//作業(yè)狀態(tài) char atime[5];//到達時間 float rtime;//運行時間 RESOURCE resource;//資源數量 struct JCB*link; }JCB;
RESOURCE source = {100,5};
JCB *pjcb =getjcb();//作業(yè)鏈表頭
char nowtime[5];//現在時間,初始時間為9:00
FILE* ignore(FILE *fp)//忽略文件中的空白符
{
if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch == || ch == )){ ch = fgetc(fp); } //if(!feof(fp)) return fp; fseek(fp, -1, SEEK_CUR);
return fp;
}
FILE* findFILE *fp,char c)//在文件中找到一個字符的位置(讀取文件時用) {
if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch != c)){ } ch = fgetc(fp); fseek(fp, -1, SEEK_CUR); return fp;
}
void destory()//釋放鏈表所占的內存
{
JCB *p = pjcb->link; while(pjcb){ free(pjcb); pjcb = p; if(p) p = p->link;
}
}
float stof(char *time)//把時間轉化為浮點型數
{
float h = 0, m = 0; int i = 0; while(time[i] != :){ h = h*10 + time[i] - 0; } i++; while(time[i] != ){ m = m*10 + time[i] - 0; } i++; i++;
return (h + m/60);
}
char* ftos(double ftime)//把浮點型數值轉化為時間
{
}
float timesub(char *time1, char *time2)//兩個時間相減,得到時間差
{
}
void print()//打印輸出
{
JCB *p = pjcb->link; printf(
p->atime, p->rtime, p->resource.memory,p->resource.tape);
}
void sendsource()//為作業(yè)分配資源
{
JCB *p; p = pjcb->link; while(p){//為到達的作業(yè)調度 p = p->link; }
if(p->state == W && source.memory - p->resource.memory >=0 && source.tape - p->resource.tape >=0){
} } p = p->link; p->state = R; source.memory -= p->resource.memory; source.tape -= p->resource.tape; printf(
}
void init()//初始化,讀取文件中的作業(yè)信息
{
FILE *fp; JCB *p= NULL,*q = pjcb ; if((fp = fopen(
} } fp = ignore(fp); p->rtime = 0;//不初始化則會發(fā)生錯誤,? fscanf(fp,
int checkend() //檢查是否所有的作業(yè)都已經運行完了
{
JCB *p = pjcb ->link; while(p){ if(p ->state != F){ return 0; } p = p->link; } return 1;
}
void run()//運行作業(yè)
{
if(checkend()){//檢查是否所有的作業(yè)都已經運行完了 printf(
}
} p = p->link; } p = pjcb ->link; while(p){//計算到達的作業(yè) if( strcmp(nowtime, p->atime) ==0 && p->state == N){ p->state = W; printf(
int main()
{
char ch;
double time =9.00;
}
double step = float(5)/60+0.00001; ftos(9.0); init(); do{ run(); puts(
操作系統(tǒng)實驗報告 3
一、實驗目的
模擬文件系統(tǒng)實現的基本功能,了解文件系統(tǒng)的基本結構和文件的各種管理方法,加深理解文件系統(tǒng)的內部功能及內部實現。通過用高級語言編寫和調試一個簡單的文件系統(tǒng),模擬文件管理的工作過程,從而對各種文件操作命令的.實質內容和執(zhí)行過程有比較深入的了解。
二、實驗內容和要求
編程模擬一個簡單的文件系統(tǒng),實現文件系統(tǒng)的管理和控制功能。要求本文件系統(tǒng)采用兩級目錄,即設置主文件目錄[MFD]和用戶文件目錄[UED]。另外,為打開文件設置運行文件目錄[AFD]。設計一個10個用戶的文件系統(tǒng),每次用戶可保存10個文件,一次運行用戶可以打開5個文件,并對文件必須設置保護措施。在用戶程序中通過使用文件系統(tǒng)提供的Create、open、read、write、close、等文件命令,對文件進行操作
三、實驗主要儀器設備和材料
硬件環(huán)境:IBM-PC或兼容機
軟件環(huán)境:C語言編程環(huán)境
四、實驗原理及設計方案
1、實驗原理
運用二級目錄思想來模擬文件系統(tǒng)。
為每個用戶建立一個單獨的用戶文件目錄UFD。這些文件目錄具有相似的結構,它由用戶文件的文件塊組成。此外,在系統(tǒng)再建立一個主文件目錄MFD;在主文件目錄中,每個用戶目錄都占有一個目錄項,其目錄項中包含文件名和指向該文件目錄文件的指針。
3、程序流程圖
五、結果過程及截圖
系統(tǒng)的使用簡要說明:
登陸:
create命令新建文件
file5
Create失敗
命令刪除文件
Delete失。
open打開命令,及write命令來追加文件
Read命令和close命令關閉
對沒打開的文件讀寫:
六、所遇困難的解決以及心得體會
本實驗的代碼長度的最常的,但是原理很簡單,并且實驗要求的是模擬,所以大大降低了實驗的難度,在操作系統(tǒng)課中我們還有一個課程設計,也是文件管理系統(tǒng),但是要比這個難很多,通過這個實驗,我對文件管理系統(tǒng)的運行機制有了深入的了解,因為要做好這個實驗必須要懂得文件管理系統(tǒng)的架構,這也迫使我認認真真的研究了操作系統(tǒng)中關于文件管理這一章的內容。同時這個程序也為以后的課程設計奠定了基礎,并且很多的代碼也是可以重用的。
七、思考題
1、文件系統(tǒng)要解決哪些問題?
答:要解決文件和用戶是否同名,文件創(chuàng)建數是否超額,所要求文件是否存在等問題。
2、什么是文件目錄?什么是文件目錄中包含哪些信息?目前廣泛采用的目錄結構形式是哪種?
答:文件目錄就是用來展示一個用戶的所有文件的一個表格,文件目錄應包含文件名,保密碼,文件大小,目前廣泛采用的目錄結構形式是多級目錄形式。
八、源代碼
#include
#include
#include
#include
#define NULL 0
typedef struct mdf{//MDF結構體
char username[20];//用戶名 char filename[20];//文件名
struct mdf *next;
}MDF;
typedef struct ufd{//UFD結構體
char filename[20];//文件名
int protect;//文件保護碼 unsigned int length;//文件長度
struct ufd *next;
}UFD;
typedef struct afd{//AFD結構體
char filename[20];//文件名 int protect;//文件保護碼 unsigned int point;//文件讀寫指針
struct afd *next;
}AFD;
MDF *pmdf;//全局鏈表頭指針
UFD *pufd;
AFD *pafd;
char UserUFD[20];//已經登陸成功的用戶名
void initM DF()//初始化MDF表
{
FILE *fp; pmdf= (MDF*)malloc(sizeof(MDF)); MDF *p = pmdf; if((fp = fopen(
} exit(1); } while (!feof(fp)){//把MDF文件中的內容裝入鏈表 } p->next = (MDF*)malloc(sizeof(MDF)); p = p->next; fscanf(fp,
void printUFD()//打印MDF表 {
UFD *p = pufd->next; puts(
}
void initUFD(char *name)//初始化UFD表 {
FILE *fp; pufd= (UFD*)malloc(sizeof(UFD)); UFD *p = pufd; if((fp = fopen(name,
} p->next = NULL; fclose(fp);
int checkuser()//檢測登陸的用戶名 {
} char username[20]; while(1){ puts(
void initAFD()//初始化AFD {
pafd = (AFD*)malloc(sizeof(AFD)); pafd->next = NULL; }
bool create()//創(chuàng)建文件命令 {
char filename[20]; UFD *p = pufd->next; AFD *pa = pafd; puts(
} } if(!p->next) break; p= p->next; p->next = (UFD*)malloc(sizeof(UFD)); p=p->next; strcpy(p->filename, filename); p->protect = 2; p->length = 0; p->next = NULL; while(pa->next){//創(chuàng)建文件后加入到AFD } pa=pa->next; pa->next = (AFD*)malloc(sizeof(AFD)); pa = pa->next; strcpy(pa->filename ,filename); pa->protect = 2; pa->point = 0; pa->next = NULL; return 1;
}
bool _()//刪除文件命令 {
char filename[20]; puts(
puts(
return 0;
}
bool open()//打開文件命令
{
char filename[20]; unsigned int protect; puts(
} } puts(
void close()//關閉文件命令
{
char filename[20]; UFD *pu = pufd->next; puts(
int read()//讀文件命令
{
char filename[20]; unsigned int length; AFD *p = pafd->next;
} puts(
int write()//寫文件命令
{
}
char filename[20]; unsigned int length; AFD *p = pafd->next; puts(
void destroy()//釋放內存
{
}
void saveUFD()//保存UFD文件
{
}
void bye()//推出系統(tǒng)
{ FILE *fp; UFD *p = pufd->next; if((fp = fopen(UserUFD,
UFD *pu = pufd->next; while(pa){ if(pa->protect == 2){ while(pu){ } saveUFD(); printUFD(); destroy(); } } if(strcmp(pa->filename, pu->filename) == 0){ } pu->length = pa->point; break; pu = pu->next; pa =pa->next;
}
void operate()//命令識別
{
while(1){ char command[20]; char name[][8] = {
}
} return; }else puts(
void print()
{
puts(
int main()
{
}
print(); initM DF(); checkuser(); initAFD(); operate();)//命令識別 return 0;
操作系統(tǒng)實驗報告 4
1.實習目的
(一).通過綜合實訓進一步鞏固、深化和擴展學生的專業(yè)技能。
1.熟練掌握Linux操作系統(tǒng)的安裝及基本配置。
2.熟練掌握Linux系統(tǒng)管理。
3.掌握Linux下用戶和組的管理。
4.掌握Linux下FTP服務器的管理。
(二)訓練和培養(yǎng)學生獲取信息和處理信息的能力,充分培養(yǎng)和提高學生的動手能力,學會通過網站、書籍等方式收集所需的資料。
(三)培養(yǎng)學生運用所學的知識和技能解決Linux使用、管理過程中所遇到的實際問題的能力及其基本工作素質。
(四)培養(yǎng)學生理論聯系實際的工作作風、嚴肅認真的科學態(tài)度以及獨立工作的能力,樹立自信心。
(五)訓練和培養(yǎng)學上的團隊協(xié)作精神與合作能力。
2 實習概況
2.1 實習要求
具體來講,《linux操作系統(tǒng)》課程包括以下實習內容:
(一)獨立完成實訓。
(二)要求熟練掌握Linux操作系統(tǒng)的安裝與基本配置。
(三)熟練掌握Linux系統(tǒng)管理基本方法。
(四)掌握Linux下用戶和組的管理。
(五)掌握Linux下的FTP服務器的管理。
2.2 實習時間
20XX年12月16日至20XX年12月20日
2.3 實習基本情況
實習地點:四教學樓 4112、4212、4312、4412
實習環(huán)境 :RedHat9軟件
實習內容:掌握linux操作系統(tǒng)
2.4 硬件環(huán)境
3 實習內容
3.1 linux安裝 Linux是一類Unix計算機操作系統(tǒng)的統(tǒng)稱。Linux 是以Unix 操作系統(tǒng)為原型的多任務、多用戶的`系統(tǒng)?蛇\行于多種硬件平臺:PC、Alpha、SPARC、
POWER PC。 今天實習的主要內容是學習了解Linux的安裝過程;Linux登錄和退出 ,熟悉Linux操作系統(tǒng)的圖形界面
(一)Linux的安裝過程
1)VMware軟件的安裝
因為我用的是機房的電腦,所以不用安裝VMware軟件。如果要安裝,過程十分簡單,下載完畢,直接“Next”即可完成安裝。
2)虛擬機的安裝。打開VMware軟件,單擊“新建虛擬機”命令根據提示選擇一種要安裝的操作系統(tǒng),一般選擇典型設置,然后直接按“下一步”即可。需要注意的就是在分區(qū)的時候需按要求建立合適的分區(qū),如下圖所示。
圖3-1-1 選擇分區(qū)
3)Red Hat Linux 9.0安裝
首先單擊“編輯虛擬機設置”,改寫鏡像為“l(fā)inux9cd1”,然后返回初始界面。點擊“啟動該虛擬機”,便進入到軟件的安裝過程。開始是“歡迎使Red Hat Linux”界面,然后經歷語言選擇、鍵盤配置、鼠標配置、磁盤分區(qū)設置、選擇軟件包組、安裝軟件包等操作后,然后是虛擬機安裝完第一張盤后要進行第二張盤的安裝,如圖3-2經過老師的指點,按住“Ctrl+Alt”,將鼠標調出,雙擊右下方任務欄第一個按鈕,依次選擇第二、三鏡像,繼續(xù)安裝,便安裝成功了。
操作系統(tǒng)實驗報告 5
一、課程設計任務劃分
二、基本原理
。ㄒ唬╉撁嬷脫Q算法定義
在地址映射過程中,若在頁面中發(fā)現所要訪問的頁面不再內存中,則產生缺頁中斷。當發(fā)生缺頁中斷時操作系統(tǒng)必須在內存選擇一個頁面將其移出內 存,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規(guī)則叫做頁面置換算法。
。ǘ┧褂玫乃惴
1) 最佳置換算法(OPT):將以后永不使用的或許是在最長(未來)時間內 不再被訪問的頁面換出。
2) 先進先出算法(FIFO):淘汰最先進入內存的頁面,即 選擇在內存中駐留時間最久的頁面予以淘汰。
3) 最近最久未使用算法(LRU):淘汰最近最久未被使用 的頁面。
(三)設計思想
選擇置換算法,先輸入所有頁面號,為系統(tǒng)分配物理塊,依次進行置換:
OPT基本思想:
是用一維數組page[pSIZE]存儲頁面號序列,memery[mSIZE]是存儲裝入物理塊中的頁面。數組next[mSIZE]記錄物理塊中對應頁面的最后訪問時間。每當發(fā)生缺頁時,就從物理塊中找出最后訪問時間最大的頁面,調出該頁,換入所缺的頁面。
FIFO基本思想:
是用隊列存儲內存中的頁面,隊列的特點是先進先出,與該算法是一致的,所以每當發(fā)生缺頁時,就從隊頭刪除一頁,而從隊尾加入缺頁。或者借助輔助數組time[mSIZE]記錄物理塊中對應頁面的進入時間,每次需要置換時換出進入時間最小的頁面。
LRU基本思想:
是用一維數組page[pSIZE]存儲頁面號序列,memery[mSIZE]是存儲裝入物理塊中的頁面。數組flag[10]標記頁面的訪問時間。每當使用頁面時,刷新訪問時間。發(fā)生缺頁時,就從物理塊中頁面標記最小的一頁,調出該頁,換入所缺的頁面。
三、基本思路
實驗環(huán)境:vc++,編程語言:c語言 #include #include /*全局變量*/
int mSIZE; /*物理塊數*/
int pSIZE; /*頁面號引用串個數*/
static int memery[10]={0}; /*物理塊中的頁號*/ static int page[100]={0}; /*頁面號引用串*/ static int temp[100][10]={0}; /*輔助數組*/ /*置換算法函數*/ void FIFO(); void LRU(); void OPT(); /*輔助函數*/
void print(unsigned int t); void designBy(); void download();
void mDelay(unsigned int Delay); /*主函數*/ void main() {
int i,k,code; system("color 0A"); designBy(); printf("┃請按任意鍵進行初始化操作... ┃ "); printf("┗━━━━━━━━━━━━━━━━━━━━━┛ "); printf(" >>>"); getch(); system("cls"); system("color 0B"); printf("請輸入物理塊的個數(M<=10):"); scanf("%d",&mSIZE); printf("請輸入頁面號引用串的個數(P<=100):"); scanf("%d",&pSIZE); puts("請依次輸入頁面號引用串(連續(xù)輸入,無需隔開):"); for(i=0;i
scanf("%1d",&page[i]); download(); system("cls"); system("color 0E"); do{ puts("輸入的頁面號引用串為:"); for(k=0;k<=(pSIZE-1)/20;k++)
{ for(i=20*k;(i
(i==pSIZE-1))) printf("%d ",page[i]); else printf("%d ",page[i]); } } printf("* * * * * * * * * * * * * * * * * * * * * * *"); printf("* 請選擇頁面置換算法: *"); printf("* ----------------------------------------- *");
printf("* 1.先進先出(FIFO) 2.最近最久未使用(LRU) *"); printf("* 3.最佳(OPT) 4.退出 *"); printf("* * * * * * * * * * * * * * * * * * * * * * *"); printf("請選擇操作:[ ]"); scanf("%d",&code); switch(code) {
case 1:
FIFO(); break; case 2:
LRU(); break; case 3:
OPT(); break; case 4: system("cls"); system("color 0A"); designBy(); /*顯示設計者信息后退出*/ printf("┃謝謝使用頁面置換算法演示器!
┃ "); printf("┗━━━━━━━━━━━━━━━━━━┛ "); exit(0); default: printf("輸入錯誤,請重新輸入:"); } printf("按任意鍵重新選擇置換算法:>>>"); getch();
system("cls"); }while (code!=4); getch(); }
/*載入數據*/ void download() { int i; system("color 0D"); printf("╔════════════╗ "); printf("║正在載入數據,請稍候 !!!║ "); printf("╚════════════╝ "); printf("Loading... "); printf(" for(i=0;i<51;i++) printf(""); for(i=0;i<50;i++) { mDelay((pSIZE+mSIZE)/2); printf(">"); } printf(" Finish. 載入成功,按任意鍵進入置換算法選擇界面:
>>>"); getch(); }
/*設置延遲*/
void mDelay(unsigned int Delay) {
unsigned int i;
for(;Delay>0;Delay--) { for(i=0;i<124;i++) { printf(" "); } } }
/*顯示設計者信息*/ void designBy() { printf("┏━━━━━━━━━━━━━━━━━━━━┓ "); printf("┃ 頁面置換算法 ┃ "); printf("┃ 12級1班 ┃ ");
O");
printf("┃ 姓名:張海洋,李奔 ┃ "); printf("┣━━━━━━━━━━━━━━━━━━━━┫ "); }
void print(unsigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i
printf("置換次數:%d ",t); printf("訪問命中率:%d%% ",(pSIZE-(t+mSIZE))*100/pSIZE); printf("---------------------------------------- "); }
/*計算過程延遲*/ void compute() { int i; printf("正在進行相關計算,請稍候"); for(i=1;i<20;i++) { mDelay(15); if(i%4==0) printf(" "); else printf("Θ"); } for(i=0;i++<30;printf("")); for(i=0;i++<30;printf(" ")); for(i=0;i++<30;printf("")); }
/*先進先出頁面置換算法*/ void FIFO() {
int memery[10]={0};
int time[10]={0}; /*記錄進入物理塊的時間*/ int i,j,k,m;
int max=0; /*記錄換出頁*/ int count=0; /*記錄置換次數*/ /*前mSIZE個數直接放入*/ for(i=0;i
memery[i]=page[i]; time[i]=i;
for(j=0;j
for(i=mSIZE;i
if(memery[j]!=page[i]) k++;
}
if(k==mSIZE) /*如果不在物理塊中*/ {
count++; /*計算換出頁*/
max=time[0]
time[max]=i; /*記錄該頁進入物理塊的時間*/ for(j=0;j
for(j=0;j
/*最近最久未使用置換算法*/ void LRU() {
int memery[10]={0};
int flag[10]={0}; /*記錄頁面的訪問時間*/ int i,j,k,m;
int max=0; /*記錄換出頁*/ int count=0; /*記錄置換次數*/ /*前mSIZE個數直接放入*/ for(i=0;i
memery[i]=page[i]; flag[i]=i;
for(j=0;j
for(i=mSIZE;i
if(memery[j]!=page[i]) k++; else flag[j]=i; /*刷新該頁的訪問時間*/ }
if(k==mSIZE) /*如果不在物理塊中*/ {
count++; /*計算換出頁*/
max=flag[0]
flag[max]=i; /*記錄該頁的訪問時間*/ for(j=0;j
for(j=0;j
/*最佳置換算法*/ void OPT() {
int memery[10]={0};
int next[10]={0}; /*記錄下一次訪問時間*/ int i,j,k,l,m;
int max; /*記錄換出頁*/
int count=0; /*記錄置換次數*/ /*前mSIZE個數直接放入*/ for(i=0;i
memery[i]=page[i]; for(j=0;j
for(i=mSIZE;i
/*判斷新頁面號是否在物理塊中*/ for(j=0,k=0;j
if(memery[j]!=page[i]) k++; }
if(k==mSIZE) /*如果不在物理塊中*/ { count++; /*得到物理快中各頁下一次訪問時間*/ for(m=0;m=next[1]?0:1; for(m=2;mnext[max]) max=m; /*下一次訪問時間都為pSIZE,則置換物理塊中第一個 */ memery[max]=page[i]; for(j=0;j
for(j=0;j
四、調試及實驗結果
第一組數據:
1.運行結果
2. 按任意鍵進行初始化:
3. 載入數據:
4. 進入置換算法選擇界面:
5.運算中延遲操作:
6.三種算法演示結果
7.退出算法
第二組數據:
1.運行結果
2.按任意鍵進行初始化:
3.載入數據:
4.進入置換算法選擇界面:
5.運算中延遲操作:
6. 三種算法演示結果
7.退出算法
五、個人體會
由于時間有限,本次設計完成的并不是很完美,下面從以下幾點來說明本次課程設計的個人體會:
1.本次課程設計中做的比較好的地方:
做的好的'地方就是在于對題目意思的正確理解,以及在此基礎上的模型設計。最開始一看題目的時候感覺很迷茫,有點不知道如何著手,等靜下心來仔細分析了程序,明確了目標,明確了思路,才對程序有了一個較為完整的實現。
2.做得不太好的地方,以及以后如何改正:
做得不太好的地方就是不能把自己所學的C知識和本次課程設計的相關知識很好的結合起來,以至于沒有很好的表達出本次課程設計的細節(jié)。在以后的過程中,我會運用本次課程設計中所學的知識,以及思考問題的方式和方法,爭取能夠發(fā)揚優(yōu)點,盡量克服不細心,不嚴謹等缺點。
3.從本次設計中得到的收獲:
通過本次課程設計,我學會了綜合運用所學相關知識的能力,動手能力以及獨立思考問題的能力。下面具體的收一個邊學程序是遇到的困難,首先就是如何把想法變?yōu)樽龇ǖ膯栴},最開始一拿到題目,我就覺得無從下手,因為我的閱歷,不知道如何把這樣一個問題變成程序,變成能夠讓人一目了然的東西,于是,我就先寫下了p,v操作的實現過程,因為這個對我來說簡單一些,然后,在此基礎之上,就好辦了,結果最后用了2個函數就解決問題了,所以,我覺得有時候思考問題不要太死腦筋,換一個角度的話,也許會更好,說不定就能達到事半功倍的效果。
【操作系統(tǒng)實驗報告】相關文章:
科技實驗報告實驗報告08-10
什么是操作系統(tǒng)04-26
什么是操作系統(tǒng)04-26
什么是操作系統(tǒng)04-26
什么是操作系統(tǒng)04-26
什么是操作系統(tǒng)04-26
什么是實驗報告及實驗報告怎么寫05-04
什么是兼容操作系統(tǒng)04-26
什么是網絡操作系統(tǒng)04-26