第一篇:計(jì)算機(jī)操作系統(tǒng) 課程設(shè)計(jì)報(bào)告(推薦)
操作系統(tǒng)課程設(shè)計(jì)報(bào)告
時(shí)間:2010-12-20~2010-12-31 地點(diǎn):信息技術(shù)實(shí)驗(yàn)中心
計(jì)算機(jī)科學(xué)與技術(shù)專(zhuān)業(yè) 2008級(jí)2班15號(hào)
楊 燁
2010-12-31
信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班
目錄
一、課程設(shè)計(jì)的目的和意義...........................................................................................................2
二、進(jìn)程調(diào)度算法模擬...................................................................................................................2
1、設(shè)計(jì)目的.............................................................................................................................2
2、設(shè)計(jì)要求.............................................................................................................................2
3、時(shí)間片輪轉(zhuǎn)算法模擬.........................................................................................................3
實(shí)現(xiàn)思想:.......................................................................................................................3(1)流程圖.....................................................................................................................3(2)程序代碼.................................................................................................................3(3)運(yùn)行結(jié)果.................................................................................................................5
4、先來(lái)先服務(wù)算法模擬.........................................................................................................6 算法思想...................................................................................................................................6
(1)流程圖.....................................................................................................................7(2)程序代碼.................................................................................................................7(3)運(yùn)行結(jié)果...............................................................................................................11
三、主存空間的回收與分配.........................................................................................................11
1、設(shè)計(jì)目的...........................................................................................................................11
2、設(shè)計(jì)要求...........................................................................................................................12
3、模擬算法的實(shí)現(xiàn)...............................................................................................................13(1)流程圖...................................................................................................................13(2)程序代碼...............................................................................................................13(3)運(yùn)行結(jié)果...............................................................................................................28
四、模擬DOS文件的建立和使用...............................................................................................28 設(shè)計(jì)目的.............................................................................................................................28 2 設(shè)計(jì)要求.............................................................................................................................28
3、模擬算法實(shí)現(xiàn)...................................................................................................................31(1)流程圖...................................................................................................................31(2)程序代碼...............................................................................................................31(3)運(yùn)行結(jié)果...............................................................................................................36
五、磁盤(pán)調(diào)度算法模擬.................................................................................................................36
1.設(shè)計(jì)目的..............................................................................................................................36 2.實(shí)驗(yàn)原理..............................................................................................................................37 3.設(shè)計(jì)要求...........................................................................................................................37
4、模擬算法的實(shí)現(xiàn)...............................................................................................................38(1)各算法流程圖.......................................................................................................38(2)程序代碼...............................................................................................................39(3)運(yùn)行結(jié)果...............................................................................................................45
六、總結(jié).........................................................................................................................................45
信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班
一、課程設(shè)計(jì)的目的和意義
本次操作系統(tǒng)課程設(shè)計(jì)的主要任務(wù)是進(jìn)行系統(tǒng)級(jí)的程序設(shè)計(jì)。本課程設(shè)計(jì)是操作系統(tǒng)原理課程的延伸。通過(guò)該課程設(shè)計(jì),使學(xué)生更好地掌握操作系統(tǒng)各部分結(jié)構(gòu)、實(shí)現(xiàn)機(jī)理和各種典型算法,加深對(duì)操作系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)思路的理解,培養(yǎng)學(xué)生的系統(tǒng)設(shè)計(jì)和動(dòng)手能力,學(xué)會(huì)分析和編寫(xiě)程序。課程設(shè)計(jì)的實(shí)施將使學(xué)生在以下幾個(gè)方面有所收獲:
(1)加深對(duì)操作系統(tǒng)原理的理解,提高綜合運(yùn)用所學(xué)知識(shí)的能力;
(2)培養(yǎng)學(xué)生自主查閱參考資料的習(xí)慣,增強(qiáng)獨(dú)立思考和解決問(wèn)題的能力;(3)通過(guò)課程設(shè)計(jì),培養(yǎng)嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度和協(xié)作精神。
二、進(jìn)程調(diào)度算法模擬
1、設(shè)計(jì)目的
(1)要求學(xué)生設(shè)計(jì)并實(shí)現(xiàn)模擬進(jìn)程調(diào)度的算法:時(shí)間片輪轉(zhuǎn)及先來(lái)先服務(wù)。(2)理解進(jìn)程控制塊的結(jié)構(gòu)。(3)理解進(jìn)程運(yùn)行的并發(fā)性。(4)掌握進(jìn)程調(diào)度算法。
2、設(shè)計(jì)要求
在多道程序運(yùn)行環(huán)境下,進(jìn)程數(shù)目一般多于處理機(jī)數(shù)目,使得進(jìn)程要通過(guò)競(jìng)爭(zhēng)來(lái)使用處理機(jī)。這就要求系統(tǒng)能按某種算法,動(dòng)態(tài)地把處理機(jī)分配給就緒隊(duì)列中的一個(gè)進(jìn)程,使之運(yùn)行,分配處理機(jī)的任務(wù)是由進(jìn)程調(diào)度程序完成的。一個(gè)進(jìn)程被創(chuàng)建后,系統(tǒng)為了便于對(duì)進(jìn)程進(jìn)行管理,將系統(tǒng)中的所有進(jìn)程按其狀態(tài),將其組織成不同的進(jìn)程隊(duì)列。于是系統(tǒng)中有運(yùn)行進(jìn)程隊(duì)列、就緒隊(duì)列和各種事件的進(jìn)程等待隊(duì)列。進(jìn)程調(diào)度的功能就是從就緒隊(duì)列中挑選一個(gè)進(jìn)程到處理機(jī)上運(yùn)行。進(jìn)程調(diào)度的算法有多種,常用的有優(yōu)先級(jí)調(diào)度算法、先來(lái)先服務(wù)算法、時(shí)間片輪轉(zhuǎn)算法。
進(jìn)程是程序在處理機(jī)上的執(zhí)行過(guò)程。進(jìn)程存在的標(biāo)識(shí)是進(jìn)程控制塊(PCB),進(jìn)程控制塊結(jié)構(gòu)如下:
typedef struct node { char name[10];/* 進(jìn)程標(biāo)識(shí)符 */ int prio;/* 進(jìn)程優(yōu)先數(shù) */ int round;/* 進(jìn)程時(shí)間輪轉(zhuǎn)時(shí)間片 */ int cputime;/* 進(jìn)程占用 CPU 時(shí)間*/ int needtime;/* 進(jìn)程到完成還需要的時(shí)間*/ int count;/* 計(jì)數(shù)器*/ char state;/* 進(jìn)程的狀態(tài)*/ struct node *next /*鏈指針*/ }PCB;系統(tǒng)創(chuàng)建一個(gè)進(jìn)程,就是由系統(tǒng)為某個(gè)程序設(shè)置一個(gè)PCB,用于對(duì)該進(jìn)程進(jìn)行控制和管
信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班
理,進(jìn)程任務(wù)完成,由系統(tǒng)收回其PCB,該進(jìn)程便消亡。每個(gè)進(jìn)程可以有三個(gè)狀態(tài):運(yùn)行狀態(tài)、就緒狀態(tài)和完成狀態(tài)。
用C語(yǔ)言、C++或者Java語(yǔ)言編寫(xiě)一個(gè)程序?qū)崿F(xiàn)進(jìn)程調(diào)度的算法,模擬進(jìn)程調(diào)度的過(guò)程,加深對(duì)進(jìn)程控制塊概念和進(jìn)程調(diào)度算法的理解。
本任務(wù)要求完成時(shí)間片輪轉(zhuǎn)及先來(lái)先服務(wù)兩個(gè)算法。
3、時(shí)間片輪轉(zhuǎn)算法模擬
實(shí)現(xiàn)思想:
每次調(diào)度時(shí),系統(tǒng)吧處理機(jī)分配給隊(duì)列首進(jìn)程讓器執(zhí)行一個(gè)時(shí)間片,當(dāng)執(zhí)行的時(shí)間片用完時(shí),由一個(gè)計(jì)時(shí)器發(fā)出時(shí)鐘中斷請(qǐng)求,調(diào)度根據(jù)這個(gè)請(qǐng)求停止該進(jìn)程的運(yùn)行將其送到就緒隊(duì)列的末尾,再把處理機(jī)分給就緒隊(duì)列中新的隊(duì)首進(jìn)程,同時(shí)讓它執(zhí)行一個(gè)時(shí)間片。(1)流程圖
進(jìn)程調(diào)度—時(shí)間片輪轉(zhuǎn)開(kāi)始輸入進(jìn)程總數(shù)輸入各進(jìn)程信息更新在運(yùn)行的進(jìn)程的已運(yùn)行時(shí)間輸出為就緒狀態(tài)的進(jìn)程信息N輸出此時(shí)為就緒狀態(tài)的進(jìn)程信息當(dāng)前進(jìn)程是否運(yùn)行結(jié)束是否存在下個(gè)進(jìn)程Y指向下一個(gè)進(jìn)程YN結(jié)束跳過(guò)
(2)程序代碼
#include
// PCB
struct PNode *next;// 定義指向下一個(gè)節(jié)點(diǎn)的指針
char name[10];
// 定義進(jìn)程名,并分配空間
信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班
int All_Time;
// 定義總運(yùn)行時(shí)間
int Runed_Time;
// 定義已運(yùn)行時(shí)間
char state;
// 定義進(jìn)程狀態(tài) Ready / End } * Proc;// 指向該P(yáng)CB的指針 int ProcNum;// 總進(jìn)程個(gè)數(shù)
void InitPCB(Proc &H)// 初始化就緒隊(duì)列
{
cout<<“請(qǐng)輸入總進(jìn)程個(gè)數(shù): ”;
cin>>ProcNum;// 進(jìn)程總個(gè)數(shù)
int Num=ProcNum;
H=(Proc)malloc(sizeof(PNode));// 建立頭節(jié)點(diǎn)
H->next=NULL;
Proc p=H;//定義一個(gè)指針
cout<<“總進(jìn)程個(gè)數(shù)為 ”<
while(Num--){
p=p->next=(Proc)malloc(sizeof(PNode));
cout<<“進(jìn)程名 總運(yùn)行時(shí)間 已運(yùn)行時(shí)間 :”;
cin>>p->name>>p->All_Time>>p->Runed_Time;
p->state='R';
p->next=NULL;}
p->next=H->next;
} void DispInfo(Proc H)//輸出運(yùn)行中的進(jìn)程信息 {
Proc p=H->next;
do {
if(p->state!= 'E')
//如果該進(jìn)程的狀態(tài)不是End的話
{
cout<<“進(jìn)程名:”<
name<<“t總運(yùn)行時(shí)間:”<
All_Time
<<“t已運(yùn)行時(shí)間:”<
Runed_Time
<<“t狀態(tài):”<
state< p=p->next; } else p=p->next; } } void SJP_Simulator(Proc &H)// 時(shí)間片輪轉(zhuǎn)法 { while(p!= H->next);// 整個(gè)進(jìn)程鏈條始終完整,只是狀態(tài)位有差異 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 cout< int flag=ProcNum;// 記錄剩余進(jìn)程數(shù) int round=0;// 記錄輪轉(zhuǎn)數(shù) Proc p=H->next; while(p->All_Time > p->Runed_Time) { // 即未結(jié)束的進(jìn)程 round++; cout< p->Runed_Time++; // 更改正在運(yùn)行的進(jìn)程的已運(yùn)行時(shí)間 DispInfo(H); // 輸出此時(shí)為就緒狀態(tài)的進(jìn)程的信息 if(p->All_Time == p->Runed_Time){ // 并判斷該進(jìn)程是否結(jié)束 p->state='E'; flag--; cout< name<<“ 進(jìn)程已運(yùn)行結(jié)束,進(jìn)程被刪除!n”; } p=p->next; while(flag && p->All_Time == p->Runed_Time) p=p->next;// 跳過(guò)先前已結(jié)束的進(jìn)程 } cout< Proc H; InitPCB(H);// 數(shù)據(jù)初始化 DispInfo(H);// 輸出此刻的進(jìn)程狀態(tài) SJP_Simulator(H);// 時(shí)間片輪轉(zhuǎn)法 system(“pause”);}(3)運(yùn)行結(jié)果 輸入相關(guān)進(jìn)程信息: 輸出相關(guān)運(yùn)行結(jié)果: 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 4、先來(lái)先服務(wù)算法模擬 算法思想 按照進(jìn)程的某種順序進(jìn)行排序,然后按照這個(gè)順序進(jìn)行調(diào)度。例如:可以按照作業(yè)提交時(shí)間或進(jìn)程變?yōu)榫途w狀態(tài)的先后次序來(lái)分派處理器,讓排在后面的進(jìn)程占用處理器,知道該進(jìn)程執(zhí)行完或者由于某種原因被阻塞才讓出處理器。 在該調(diào)度策略中還規(guī)定,當(dāng)有一個(gè)事件發(fā)生(如一個(gè)I/O操作完成)時(shí),會(huì)有一些進(jìn)程被喚醒,這些被喚醒的進(jìn)程并不能立即恢復(fù)執(zhí)行,而是要等到當(dāng)前運(yùn)行的進(jìn)程出讓處理器后才可以被調(diào)度執(zhí)行。采用此算法存在以下幾個(gè)特點(diǎn): 周轉(zhuǎn)時(shí)間:對(duì)進(jìn)程i來(lái)說(shuō),假設(shè)Tei是進(jìn)程的完成時(shí)間,Tsi是進(jìn)程的提交時(shí)間,那么進(jìn)程i的周轉(zhuǎn)時(shí)間Ti=進(jìn)程完成時(shí)間-進(jìn)程提交時(shí)間; 進(jìn)程平均周轉(zhuǎn)時(shí)間:T=1/nETi; 進(jìn)程帶權(quán)周轉(zhuǎn)時(shí)間=進(jìn)程等待時(shí)間+進(jìn)程運(yùn)行時(shí)間。 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 (1)流程圖 Begin輸入當(dāng)前磁道號(hào)now磁頭移動(dòng)距離sum=abs(now-array[0])磁頭移動(dòng)總距離sum+=abs(array[j]-array[i])輸出磁盤(pán)調(diào)度序列array[j]目前位置編程當(dāng)前的位置i++j (2)程序代碼 #include “stdio.h” #include #define getpch(type)(type*)malloc(sizeof(type))#define NULL 0 struct pcb { /* 定義進(jìn)程控制塊PCB */ char name[10];char state;int super; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB; void sort()/* 建立對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)排列函數(shù)*/ { PCB *first, *second;int insert=0; if((ready==NULL)||((p->super)>(ready->super)))/*優(yōu)先級(jí)最大者,插入隊(duì)首*/ { p->link=ready;ready=p;} else /* 進(jìn)程比較優(yōu)先級(jí),插入適當(dāng)?shù)奈恢弥?/ { first=ready;second=first->link;while(second!=NULL){ if((p->super)>(second->super))/*若插入進(jìn)程比當(dāng)前進(jìn)程優(yōu)先數(shù)大,*/ { /*插入到當(dāng)前進(jìn)程前面*/ p->link=second;first->link=p;second=NULL;insert=1;} else /* 插入進(jìn)程優(yōu)先數(shù)最低,則插入到隊(duì)尾*/ { first=first->link;second=second->link;} } if(insert==0)first->link=p;} } void input()/* 建立進(jìn)程控制塊函數(shù)*/ { int i,num; printf(“n 請(qǐng)輸入進(jìn)程數(shù):”);scanf(“%d”,&num);for(i=0;i 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 printf(“n 進(jìn)程號(hào)No.%d:n”,i+1);p=getpch(PCB);printf(“n 輸入進(jìn)程名:”);scanf(“%s”,p->name);printf(“n 輸入進(jìn)程優(yōu)先數(shù):”);scanf(“%d”,&p->super);printf(“n 輸入進(jìn)程運(yùn)行時(shí)間:”);scanf(“%d”,&p->ntime);printf(“n”); p->rtime=0;p->state='w';p->link=NULL; sort();/* 調(diào)用sort函數(shù)*/ } } int space(){ int l=0;PCB* pr=ready;while(pr!=NULL){ l++;pr=pr->link;} return(l);} void disp(PCB * pr)/*建立進(jìn)程顯示函數(shù),用于顯示當(dāng)前進(jìn)程*/ { printf(“n qname t state t super t ndtime t runtime n”);printf(“|%st”,pr->name);printf(“|%ct”,pr->state);printf(“|%dt”,pr->super);printf(“|%dt”,pr->ntime);printf(“|%dt”,pr->rtime);printf(“n”);} void check()/* 建立進(jìn)程查看函數(shù) */ { PCB* pr; printf(“n **** 當(dāng)前正在運(yùn)行的進(jìn)程是:%s”,p->name);/*顯示當(dāng)前運(yùn)行進(jìn)程*/ disp(p);pr=ready; printf(“n ****當(dāng)前就緒隊(duì)列狀態(tài)為:n”);/*顯示就緒隊(duì)列狀態(tài)*/ while(pr!=NULL){ 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 disp(pr);pr=pr->link;} } void destroy()/*建立進(jìn)程撤消函數(shù)(進(jìn)程運(yùn)行結(jié)束,撤消進(jìn)程)*/ { printf(“n 進(jìn)程 [%s] 已完成.n”,p->name);free(p);} void running()/* 建立進(jìn)程就緒函數(shù)(進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)*/ { (p->rtime)++; if(p->rtime==p->ntime) destroy();/* 調(diào)用destroy函數(shù)*/ else { (p->super)--;p->state='w'; sort();/*調(diào)用sort函數(shù)*/ } } int main()/*主函數(shù)*/ { int len,h=0;char ch;input();len=space(); while((len!=0)&&(ready!=NULL)){ ch=getchar();h++; printf(“n The execute number:%d n”,h);p=ready;ready=p->link;p->link=NULL;p->state='R';check();running(); printf(“n 按任一鍵繼續(xù)......”);ch=getchar();} printf(“nn 進(jìn)程已經(jīng)完成.n”); 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 ch=getchar();}(3)運(yùn)行結(jié)果 輸入相關(guān)進(jìn)程信息: 輸出相關(guān)運(yùn)行結(jié)果: 三、主存空間的回收與分配 1、設(shè)計(jì)目的 主存是中央處理器能直接存取指令和數(shù)據(jù)的存儲(chǔ)器,能否合理地利用主存,在很大程度 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 上將影響到整個(gè)計(jì)算機(jī)系統(tǒng)的性能。主存分配是指在多道作業(yè)和多進(jìn)程環(huán)境下,如何共享主存空間。主存回收是指當(dāng)作業(yè)執(zhí)行完畢或進(jìn)程運(yùn)行結(jié)束后將主存空間歸還給系統(tǒng)。主存分配與回收的實(shí)現(xiàn)是與主存儲(chǔ)器的管理方式有關(guān)。本次設(shè)計(jì)主要是為了幫助學(xué)生深入理解主存空間的分配與回收的幾種算法。 (1)掌握最先適應(yīng)分配算法(2)掌握最優(yōu)適應(yīng)分配算法(3)掌握最壞適應(yīng)分配算法 2、設(shè)計(jì)要求 用戶(hù)提出內(nèi)存空間請(qǐng)求,系統(tǒng)根據(jù)申請(qǐng)者要求,按照最先適應(yīng)分配算法的分配策略分析內(nèi)存空間的使用情況,找出能滿足請(qǐng)求的空閑區(qū),分給申請(qǐng)者,當(dāng)程序執(zhí)行完畢時(shí),系統(tǒng)要收回它所占用的內(nèi)存空間。建立空閑數(shù)據(jù)文件,空閑區(qū)數(shù)據(jù)文件包括若干行,每行有兩個(gè)字段:起始地址、內(nèi)存塊大小(均為整數(shù)),各字段以逗號(hào)隔開(kāi)。下面是一個(gè)空閑區(qū)數(shù)據(jù)文件的示例: 0,10 10,08 18,10 28,06 34,10 44,09 讀取空閑區(qū)數(shù)據(jù)文件,建立空閑區(qū)表并在屏幕上顯示空閑內(nèi)存狀態(tài),空閑區(qū)表記錄了可供分配的空閑內(nèi)存的起始地址和大小,用標(biāo)志位指出該分區(qū)是否是未分配的空閑區(qū)。 接收用戶(hù)的內(nèi)存申請(qǐng),格式為:作業(yè)名、申請(qǐng)空間的大小。 按照內(nèi)存分配算法中的一種方法選擇一個(gè)空閑區(qū),分割并分配,修改空閑區(qū)表,填寫(xiě)內(nèi)存已分配區(qū)表(起始地址、長(zhǎng)度、標(biāo)志位),其中標(biāo)志位的一個(gè)作用是指出該區(qū)域分配給哪個(gè)作業(yè)。 進(jìn)程結(jié)束后回收內(nèi)存。空閑區(qū)表的結(jié)構(gòu)如下: typedef struct node{ int start;int length;char tag[20];}job;本次設(shè)計(jì)要求完成如下算法: (1)設(shè)計(jì)一個(gè)內(nèi)存分配回收的程序使用最先適應(yīng)分配算法(2)設(shè)計(jì)一個(gè)內(nèi)存分配回收的程序使用最優(yōu)適應(yīng)分配算法(3)設(shè)計(jì)一個(gè)內(nèi)存分配回收的程序使用最壞適應(yīng)分配算法 用戶(hù)提出內(nèi)存空間請(qǐng)求,系統(tǒng)根據(jù)申請(qǐng)者要求,選擇上述算法的一種分配策略分析內(nèi)存空間的使用情況,找出合適的空閑區(qū),分給申請(qǐng)者,當(dāng)進(jìn)程執(zhí)行完畢時(shí),系統(tǒng)收回它所占用的內(nèi)存空間。 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 3、模擬算法的實(shí)現(xiàn) (1)流程圖 內(nèi)存分配開(kāi)始劃定內(nèi)存總量輸入進(jìn)程信息所需內(nèi)存<剩余內(nèi)存?Y在剩余空間中劃分出所需空間N剩余空間分配給請(qǐng)求者,修改有關(guān)數(shù)據(jù)輸出進(jìn)程信息結(jié)束 (2)程序代碼 #include };//分區(qū)指針的鏈表 //當(dāng)把空閑分區(qū)鏈表和占用分區(qū)鏈表按照地址先后順序合并 //以顯示整個(gè)內(nèi)存情況的時(shí)候使用 struct AreaPointer_list{ struct area * data;struct AreaPointer_list * next;int start;//分區(qū)的其始地址 int length;//分區(qū)的長(zhǎng)度 int job;//若被作業(yè)占用值為作業(yè)號(hào),若空閑值為0 struct area * next; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 };struct area * idle;struct area * used; //全局變量,空閑分區(qū)鏈表頭指針 //全局變量,占用分區(qū)鏈表頭指針 struct AreaPointer_list * whole = NULL;//全局變量,分區(qū)指針鏈表頭指針 //p(previcious)n(next)指出在鏈表中的何處插入新生成的元素 //p==NULL 在鏈表頭插入,返回頭指針 //p!=NULL 在鏈表中或鏈表尾插入,返回當(dāng)前插入的元素的指針 struct area * insert(int s,int l,int j,struct area * p,struct area * n){ } //此模塊居于次要地位,只被使用一次 //打印分區(qū)鏈表 void print(struct area * head){ if(head == NULL){ } else{ while(head!= NULL){ if(head->job == 0)else printf(“begin:%dKtlength:%dKtuse:Job%dt|n”,head->start,head->length,hea printf(“begin:%dKtlength:%dKt空閑tt|n”,head->start,head->length);printf(“Area list is null...n”);struct area * current =(struct area *)malloc(LEN);current->start = s;current->length = l;current->job = j;if(p == NULL){//在鏈表頭插入 } else{ } if(p->next == NULL){//在鏈表尾插入 } else{//在鏈表中插入 } return current;current->next = p->next;p->next = current;current->next = NULL;p->next = current;current->next = n;return current; d->job); 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } void file_print(struct area * head,FILE * file){ if(head == NULL){ } else{ while(head!= NULL){ if(head->job == 0)else fprintf(file,“begin:%dKtlength:%dKtuse:Job%dt|n”,head->start,head->length,fprintf(file,“begin:%dKtlength:%dKt空閑tt|n”,head->start,head->length);fprintf(file,“Area list is null...n”); } } head = head->next; head->job); } //打印分區(qū)鏈表 } } head = head->next;//釋放分區(qū)鏈表空間 void free_AreaList(struct area * head){ } //釋放分區(qū)鏈表空間 //在分區(qū)鏈表中搜索插入位置 //flag==0 表明分區(qū)鏈表按起始地址從小到大排列 //flag==1 表明分區(qū)鏈表按分區(qū)長(zhǎng)度從小到大排列 //輸入?yún)?shù) element 不能為NULL struct area * search_pos(struct area * element,struct area * head,int flag){ struct area * p = NULL;while(head!= NULL){ if(flag == 0){ if(element->start < head->start)struct area * temp;while(head!= NULL){ } temp = head;head = head->next;free(temp); 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } //返回值p==NULL表明插入位置在鏈表頭 //返回值p!=NULL表明插入位置在p 之后 //進(jìn)行分區(qū)鏈表的實(shí)際插入工作 //flag==0 表明分區(qū)鏈表按起始地址從小到大排列 //flag==1 表明分區(qū)鏈表按分區(qū)長(zhǎng)度從小到大排列 //輸入?yún)?shù) element->next 要為NULL struct area * insert_list(struct area * element,struct area * list,int flag){ if(list == NULL)else{ } return list;struct area * pos = search_pos(element,list,flag);if(pos == NULL){ } else{ } element->next = pos->next;pos->next = element;element->next = list;list = element;list = element; } return p;} else { } p = head;head = head->next;if(element->length < head->length) break; break;}//返回插入元素之后新鏈表的頭指針 //進(jìn)行查詢(xún)空閑分區(qū)鏈表動(dòng)態(tài)分配分區(qū)的實(shí)際工作,算法步驟: //1。查詢(xún)空閑分區(qū)鏈表中是否有長(zhǎng)度大于或等于申請(qǐng)長(zhǎng)度的分區(qū),若沒(méi)有返回FALSE //2。若查找到符合條件的分區(qū),把它從空閑鏈表中取出 //3。根據(jù)請(qǐng)求把取出的空閑分區(qū)分塊,把新的占用分區(qū)和剩余空閑分區(qū)分別插入鏈表 //注意:插入占用分區(qū)鏈表按照固定的地址先后順序,插入空閑分區(qū)鏈表的方式要根據(jù)flag的值 int memory_alloc(int length,int job,int flag){ struct area * used_element; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 struct area * free_element;struct area * head = idle;struct area * head_temp = used;struct area * p = NULL;//檢測(cè)輸入的作業(yè)號(hào)是否存在 while(head_temp!= NULL){ } //在空閑分區(qū)鏈表中查找 while(head!= NULL){ } if(head!= NULL){ } else return 0;//生成新的占用區(qū)鏈表元素并插入占用區(qū)鏈表 used_element =(struct area *)malloc(LEN);used_element->start = head->start;used_element->length = length;used_element->job = job;used_element->next = NULL;used = insert_list(used_element,used,0);//若空閑分區(qū)分塊后有剩余,生成新的空閑區(qū)鏈表元素并插入空閑區(qū)鏈表 if(head->length > length){ free_element =(struct area *)malloc(LEN);//從空閑區(qū)鏈表中取出 if(p == NULL)//鏈表中的第一個(gè)分區(qū)符合條件 { } else { } head->next = NULL;p->next = head->next;idle = idle->next;if(head->length >= length)break;p = head;head = head->next;if(head_temp->job == job)return 2;head_temp = head_temp->next; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } //進(jìn)行查詢(xún)占用分區(qū)鏈表動(dòng)態(tài)釋放分區(qū)的實(shí)際工作,算法步驟: //1。根據(jù)作業(yè)號(hào)查詢(xún)到占用分區(qū)鏈表中要釋放的分區(qū),若沒(méi)有返回FALSE //2。若查找到要釋放的分區(qū),把它從空閑鏈表中取出 //3。根據(jù)取出的分區(qū)的數(shù)據(jù)建立新的空閑分區(qū) //4。在空閑分區(qū)鏈表中查詢(xún)是否有和新空閑分區(qū)相鄰的空閑分區(qū),有則合并 //5。根據(jù)flag的取值按照特定方式插入空閑分區(qū)鏈表 int memory_free(int job,int flag){ struct area * used_element;struct area * free_element;struct area * head = used;struct area * p = NULL;struct area * previcious1 = NULL;struct area * current1 = NULL;struct area * previcious2 = NULL;struct area * current2 = NULL;//根據(jù)作業(yè)號(hào)在占用分區(qū)鏈表中查找 while(head!= NULL){ } if(head!= NULL){ //從占用區(qū)鏈表中取出 if(p == NULL)//鏈表中的第一個(gè)分區(qū)符合條件 { } else { used = used->next;if(head->job == job)break;p = head;head = head->next; } //釋放空間 free(head);return 1;free_element->start = head->start + length;free_element->length = head->length-length;free_element->job = 0;free_element->next = NULL;idle = insert_list(free_element,idle,flag); 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } else return 0;//建立新的空閑分區(qū) used_element = head;free_element =(struct area *)malloc(LEN);free_element->start = used_element->start;free_element->length = used_element->length;free_element->job = 0;free_element->next = NULL;//從空閑區(qū)鏈表查找和新的空閑分區(qū)相鄰分區(qū) head = idle;p = NULL;while(head!= NULL){ } //合并相鄰空閑分區(qū) if(current1!= NULL){ } //把和新分區(qū)相鄰的分區(qū)從空閑分區(qū)鏈表中取出 if(previcious1 == NULL)else previcious1->next = current1->next;current1->next = NULL;//修改新空閑分區(qū)的相關(guān)數(shù)據(jù) free_element->start = current1->start;free_element->length = free_element->length + current1->length;idle = idle->next;if(head->start + head->length == used_element->start){ } if(used_element->start + used_element->length == head->start){ } p = head;head = head->next;previcious2 = p;current2 = head;previcious1 = p;current1 = head;} head->next = NULL;p->next = head->next; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } //和分區(qū)指針鏈表相關(guān)的操作,用來(lái)合并空閑分區(qū)鏈表和占用分區(qū)鏈表,保存鏈表元素的指針 struct AreaPointer_list * search_position(int s,struct AreaPointer_list * head){ } struct AreaPointer_list * emerge(struct area * idle_temp,struct area * used_temp){ struct AreaPointer_list * previcious;struct AreaPointer_list * temp; if(used_temp!= NULL){ whole =(struct AreaPointer_list *)malloc(LEN_POINTER_LIST);whole->data = used_temp;whole->next = NULL;previcious = whole;used_temp = used_temp->next;while(used_temp!= NULL){ temp =(struct AreaPointer_list *)malloc(LEN_POINTER_LIST);struct AreaPointer_list * p = NULL;while(head!= NULL){ } return p;if(s <(head->data)->start)break;p = head;head = head->next;if(current2!= NULL){ } //根據(jù)flag的取值按照特定方式插入空閑分區(qū)鏈表 idle = insert_list(free_element,idle,flag);//釋放空間 free(used_element);return 1;//把和新分區(qū)相鄰的分區(qū)從空閑分區(qū)鏈表中取出 if(previcious2 == NULL)else previcious2->next = current2->next;current2->next = NULL;//修改新空閑分區(qū)的相關(guān)數(shù)據(jù) free_element->length = free_element->length + current2->length;idle = idle->next; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } void printall(struct AreaPointer_list * head){ struct area * data_temp;if(head == NULL)else{ while(head!= NULL){ data_temp = head->data;if(data_temp->job == 0)else printf(“begin:%dKtlength:%dKt空閑tt|n”,data_temp->start,data_temp->lenprintf(“Area pointer list is null...n”); } while(idle_temp!= NULL){ } return whole;struct area * idle_next = idle_temp->next;struct AreaPointer_list * pos = search_position(idle_temp->start,whole);if(pos == NULL){ } else { } idle_temp = idle_next;temp =(struct AreaPointer_list *)malloc(LEN_POINTER_LIST);temp->data = idle_temp;temp->next = pos->next;pos->next = temp;temp =(struct AreaPointer_list *)malloc(LEN_POINTER_LIST);temp->data = idle_temp;temp->next = whole;whole = temp; } temp->data = used_temp;temp->next = NULL;previcious->next = temp;previcious = temp;used_temp = used_temp->next; gth); printf(“begin:%dKtlength:%dKtuse:Job%dt|n”,data_temp->start,data_temp->length,data_temp->job);head = head->next; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } void file_printall(struct AreaPointer_list * head,FILE * file){ struct area * data_temp;if(head == NULL)else{ while(head!= NULL){ data_temp = head->data;if(data_temp->job == 0)else fprintf(file,“begin:%dKtlength:%dKt空閑tt|n”,data_temp->start,data_tempfprintf(file,“Area pointer list is null...n”);} } ->length); fprintf(file,“begin:%dKtlength:%dKtuse:Job%dt|n”,data_temp->start,data_temp->length,data_temp->job); } void free_PointerList(struct AreaPointer_list * head){ } //和分區(qū)指針鏈表相關(guān)的操作,用來(lái)合并空閑分區(qū)鏈表和占用分區(qū)鏈表,保存鏈表元素的指針 void input_by_hand(){ int job;int is_alloc;//1 申請(qǐng)分區(qū) 0 釋放分區(qū) int length;int flag;printf(“請(qǐng)選擇分區(qū)分配算法:輸入0---最先適配 輸入1---最優(yōu)適配n”);scanf(“%d”,&flag);while(flag!= 0 && flag!= 1){ printf(“數(shù)據(jù)輸入錯(cuò)誤,請(qǐng)參照提示重新輸入n”);scanf(“%d”,&flag);struct AreaPointer_list * temp;while(head!= NULL){ } temp = head;head = head->next;free(temp); } } head = head->next; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } if(flag == 0)printf(“選擇最先適配算法--->請(qǐng)輸入請(qǐng)求隊(duì)列數(shù)據(jù):(輸入 0 0 0 結(jié)束)n”);printf(“選擇最優(yōu)適配算法--->請(qǐng)輸入請(qǐng)求隊(duì)列數(shù)據(jù):(輸入 0 0 0 結(jié)束)n”);if(flag == 1)printf(“輸入數(shù)據(jù)格式:作業(yè)號(hào)(int>0)[輸入1--申請(qǐng)|輸入0--釋放] 分區(qū)長(zhǎng)度(int>0)n”);printf(“例如輸入 5 1 130 表示 作業(yè)5申請(qǐng)130Kn”);printf(“例如輸入 3 0 200 表示 作業(yè)3釋放200Kn”);while(1)//輸入 0 0 0 結(jié)束 { scanf(“%d%d%d”,&job,&is_alloc,&length);if(job == 0 && is_alloc == 0 && length == 0){ } if(is_alloc == 1){ } if(is_alloc == 0){ int r = memory_free(job,flag);if(!r){ int r = memory_alloc(length,job,flag);if(!r){ } if(r == 2){ } printf(“n”); printf(“輸入作業(yè)號(hào)已存在于占用分區(qū)鏈表,請(qǐng)重新輸入...n”);printf(“n”);continue;printf(“n”); printf(“沒(méi)有符合條件的空閑分區(qū)可供分配,請(qǐng)等待釋放...n”);printf(“n”);continue;printf(“數(shù)據(jù)輸入錯(cuò)誤,請(qǐng)參照提示重新輸入n”);scanf(“%d%d%d”,&job,&is_alloc,&length);if(job == 0 && is_alloc == 0 && length == 0) return;break;while(job<=0 ||(is_alloc!= 0 && is_alloc!= 1)|| length<=0) 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } /*void input_by_file(int flag){ int job;int is_alloc;//1 申請(qǐng)分區(qū) 0 釋放分區(qū) int length;char* result;int r;FILE * file1;FILE * file2;if(flag == 0)else result = “result_data_2.txt”;result = “result_data_1.txt”; } //釋放空間 free_AreaList(idle);free_AreaList(used);idle = NULL;used = NULL; } emerge(idle,used);printf(“n”);printf(“------------------n”);printf(“空閑分區(qū)鏈表:ttttt|n”);print(idle);printf(“tttttt|n”);printf(“占用分區(qū)鏈表:ttttt|n”);print(used);printf(“tttttt|n”);printf(“整個(gè)內(nèi)存情況:ttttt|n”);printf(“低地址tttttt|n”);printall(whole);printf(“高地址tttttt|n”);printf(“------------------n”);printf(“n”);free_PointerList(whole);whole = NULL; } printf(“n”); printf(“沒(méi)有與指定作業(yè)號(hào)符合的占用分區(qū),請(qǐng)重新輸入...n”);printf(“n”);continue; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 if((file1 = fopen(“source_data.txt”,“r”))== NULL){ } if((file2 = fopen(result,“w”))== NULL){ } if(flag == 0){ } else { } while(!feof(file1)){ fscanf(file1,“%d%d%d”,&job,&is_alloc,&length);if(job<=0 ||(is_alloc!= 0 && is_alloc!= 1)|| length<=0){ } if(is_alloc == 1){ printf(“JOB %d申請(qǐng)%dKnn”,job,length);fprintf(file2,“JOB %d申請(qǐng)%dKnn”,job,length);r = memory_alloc(length,job,flag);if(!r){ } if(r == 2){ printf(“輸入作業(yè)號(hào)已存在于占用分區(qū)鏈表,不于處理nn”); printf(“沒(méi)有符合條件的空閑分區(qū)可供分配,不于處理nn”);fprintf(file2,“沒(méi)有符合條件的空閑分區(qū)可供分配,不于處理nn”);continue;printf(“文件中數(shù)據(jù)%d %d %d輸入的格式錯(cuò)誤,不于處理nn”,job,is_alloc,lengtfprintf(file2,“文件中數(shù)據(jù)%d %d %d輸入的格式錯(cuò)誤,不于處理nn”,job,is_alloc,continue;printf(“按照最優(yōu)分配算法得出的結(jié)果:nn”);fprintf(file2,“按照最優(yōu)分配算法得出的結(jié)果:nn”);printf(“按照最先分配算法得出的結(jié)果:nn”);fprintf(file2,“按照最先分配算法得出的結(jié)果:nn”);printf(“不能打開(kāi)source_data.txt文件...n”);exit(0);printf(“不能打開(kāi)source_data.txt文件...n”);exit(0); h); length); 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } else { } emerge(idle,used);printf(“------------------n”);fprintf(file2,“------------------n”);printf(“空閑分區(qū)鏈表:ttttt|n”);fprintf(file2,“空閑分區(qū)鏈表:ttttt|n”);print(idle);file_print(idle,file2);printf(“tttttt|n”);fprintf(file2,“tttttt|n”);printf(“占用分區(qū)鏈表:ttttt|n”);fprintf(file2,“占用分區(qū)鏈表:ttttt|n”);print(used);file_print(used,file2);printf(“tttttt|n”);fprintf(file2,“tttttt|n”);printf(“整個(gè)內(nèi)存情況:ttttt|n”);fprintf(file2,“整個(gè)內(nèi)存情況:ttttt|n”);printf(“低地址tttttt|n”);fprintf(file2,“低地址tttttt|n”);printall(whole);file_printall(whole,file2);printf(“高地址tttttt|n”);fprintf(file2,“高地址tttttt|n”);printf(“------------------n”);fprintf(file2,“------------------n”);printf(“n”);fprintf(file2,“n”);printf(“JOB %d釋放%dKnn”,job,length);fprintf(file2,“JOB %d釋放%dKnn”,job,length);r = memory_free(job,flag);if(!r){ } printf(“沒(méi)有與指定作業(yè)號(hào)符合的占用分區(qū),不于處理nn”);fprintf(file2,“沒(méi)有與指定作業(yè)號(hào)符合的占用分區(qū),不于處理nn”);continue; } fprintf(file2,“輸入作業(yè)號(hào)已存在于占用分區(qū)鏈表,不于處理nn”);continue; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 }*/ int main() } { idle = insert(0,640,0,NULL,NULL);used = NULL;input_by_hand(); } printf(“========================================nn”);fprintf(file2,“========================================nn”);//釋放空間 free_AreaList(idle);free_AreaList(used);idle = NULL;used = NULL;fclose(file1);fclose(file2);free_PointerList(whole);whole = NULL; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 (3)運(yùn)行結(jié)果 四、模擬DOS文件的建立和使用 設(shè)計(jì)目的 磁盤(pán)文件是磁盤(pán)上存儲(chǔ)的重要信息,通過(guò)本實(shí)驗(yàn)?zāi)MDOS文件的建立和使用情況,理解磁盤(pán)文件的物理結(jié)構(gòu)。文件管理是操作系統(tǒng)中重要的內(nèi)容之一,不同的文件系統(tǒng)提供了不同的物理結(jié)構(gòu),通過(guò)實(shí)驗(yàn),深入理解文件的物理結(jié)構(gòu)與存取方法之間的關(guān)系,以便更好的掌握文件系統(tǒng)的概念。設(shè)計(jì)要求 <1> 模擬設(shè)計(jì)DOS操作系統(tǒng)中磁盤(pán)文件的存儲(chǔ)結(jié)構(gòu) DOS操作系統(tǒng)對(duì)磁盤(pán)文件的管理采用鏈接結(jié)構(gòu),將所有的鏈接指針集中在一起,存放在文件分配表(FAT)中。連接文件的第一個(gè)物理塊號(hào)登記在文件目錄中。其設(shè)計(jì)思想是:假定磁盤(pán)上共有N個(gè)物理塊可供使用,當(dāng)要存放文件時(shí),從FAT表中尋找其值為0的項(xiàng),用其對(duì)應(yīng)的物理塊存放文件信息,并把文件占有的各物理塊用鏈接指針登記在FAT表中,再把文 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 件的第一個(gè)物理塊號(hào)登記在文件目錄中。 文件目錄及FAT表如圖所示: 在DOS中FAT表的前兩項(xiàng)用來(lái)記錄磁盤(pán)的類(lèi)型。而從第2項(xiàng)開(kāi)始記錄磁盤(pán)的分配情況和文件各物理塊的鏈接情況。在FAT表中第三項(xiàng)的值如果為0,表示對(duì)應(yīng)的第三塊空閑。由圖還知道文件A的各記錄依次存放在第2、第4、第15、第16、第50等六個(gè)物理塊中。第50塊中的指針為FFF,表示文件A的結(jié)束。文件B的各記錄依次存放在第7、第10、第20等三個(gè)物理塊中。第20塊中的指針為FFF。 假定磁盤(pán)存儲(chǔ)空間共有100個(gè)物理塊,設(shè)計(jì)一個(gè)文件分配表。為了簡(jiǎn)單,文件分配表可用一個(gè)數(shù)組定義,其中每一個(gè)元素與一個(gè)物理塊對(duì)應(yīng)。當(dāng)?shù)?i 個(gè)元素為 0 時(shí),表示第 i 塊空閑;當(dāng)?shù)?i 個(gè)元素既不為 0 也不為 FFF 時(shí),其值表示該文件的下一個(gè)物理塊號(hào)。另外,再設(shè)一個(gè)空閑塊總數(shù)變量記錄系統(tǒng)還有的空閑塊數(shù)。為了簡(jiǎn)單,假定一個(gè)物理塊指存放一個(gè)邏輯記錄,要求設(shè)計(jì)一個(gè)程序,把文件的邏輯記錄結(jié)構(gòu)轉(zhuǎn)換成 DOS 的鏈接結(jié)構(gòu)。當(dāng)用戶(hù)要求將已在主存的文件保存在磁盤(pán)上時(shí),給出文件名及文件的記錄個(gè)數(shù),系統(tǒng)應(yīng)能在磁盤(pán)上正確地保存文件。或當(dāng)用戶(hù)要求給指定文件增加記錄時(shí),也應(yīng)正確的實(shí)現(xiàn),并插在指定記錄之后。 為了正確地執(zhí)行模擬程序,可用鍵盤(pán)模擬輸入用戶(hù)的要求。輸入格式為: write(文件名,記錄個(gè)數(shù))或 insert(文件名,邏輯記錄號(hào))<2> 模擬設(shè)計(jì)便于直接存取的索引文件結(jié)構(gòu) 為了便于用戶(hù)直接存取文件的各個(gè)邏輯記錄,在 MS-DOS 中通過(guò)文件目錄,再沿著鏈查找FAT表,便可直接找到指定邏輯記錄對(duì)應(yīng)的物理塊。在小型機(jī)或更高級(jí)的文件系統(tǒng)中,直接存取文件的方法是為每個(gè)文件建立一個(gè)索引表,指出各邏輯記錄與物理塊的對(duì)應(yīng)關(guān)系。最簡(jiǎn)單的形式是一個(gè)邏輯記錄對(duì)應(yīng)一個(gè)物理塊。文件目錄與索引表的關(guān)系如圖所示。 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 通常索引表按照邏輯記錄順序建立,這樣既有利于順序存儲(chǔ),又有利于直接存儲(chǔ)。為了標(biāo)識(shí)哪些記錄已經(jīng)建立,哪些記錄還沒(méi)建立,故在索引表中增設(shè)一個(gè)標(biāo)志位。寫(xiě)文件或插入一個(gè)記錄的過(guò)程是尋找一個(gè)空閑物理塊,然后將其填入索引表對(duì)應(yīng)項(xiàng)中。其建立過(guò)程同第一題,即 write(文件名,記錄號(hào))和 insert(文件名,記錄號(hào))。 要求用位示圖描繪出磁盤(pán)的使用情況,并要求模擬程序執(zhí)行過(guò)程的每一步都能顯示文件目錄、位示圖、索引表。 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 3、模擬算法實(shí)現(xiàn) (1)流程圖 創(chuàng)建文件流程開(kāi)始讀取文件流程開(kāi)始查詢(xún)未打開(kāi)的文件表查詢(xún)已打開(kāi)文件表在未打開(kāi)表中?N是否在已打開(kāi)的文件表里?YY是否在已打開(kāi)表中查詢(xún)剩余未打開(kāi)的文件表NYY顯示無(wú)文件是否在剩余表中?N輸出無(wú)文件讀取文件記錄讀取文件記錄返回Read參數(shù)合法?Nwrite參數(shù)是否合法?Y返回寫(xiě)入磁盤(pán)顯示參數(shù)非法顯示成功Y顯示參數(shù)非法根據(jù)參數(shù)讀取記錄并顯示END (2)程序代碼 #include }; char filename[10];int filestart;int filelength; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 FILEINFO file[10];int FAT[N],blankspace;//FAT表和剩余空間 void printfmenu(){ int i;cout< 文件名 起始?jí)K號(hào) 文件長(zhǎng)度”< } void write(char *tmpname,int tmplength){ int last,i,j;//復(fù)制文件名和文件塊個(gè)數(shù) strcpy(file[fnum].filename,tmpname);file[fnum].filelength=tmplength;//存文件 for(i=2;i } for(i=1;i for(j=2;j FAT[last]=j; if(FAT[i]==0){ } file[fnum].filestart=i;//首個(gè)空閑塊為文件開(kāi)始?jí)K last=i;FAT[last]=FFF;break;int i;cout<<“空閑塊數(shù):”< } cout<<“ No.”< 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } void insert(char *tmpname,int insertpoint){ int i;int last,brpoint;//尋找要執(zhí)行插入操作的文件,將其數(shù)組下標(biāo)存入last for(i=0;i } //brpoint記錄當(dāng)前文件掃描到的位置 brpoint=file[last].filestart; for(i=0;i } //改變空閑塊個(gè)數(shù)與文件長(zhǎng)度 if(FAT[i]==0){ } FAT[i]=FAT[brpoint];FAT[brpoint]=i;break;brpoint=FAT[brpoint];//掃描直到找到插入位置 if(strcmp(file[i].filename,tmpname)==0){ } else printf(“沒(méi)有指定文件!n”);last=i;break; } FAT[last]=FFF;//文件末存結(jié)束標(biāo)記 blankspace-=tmplength;//改變空閑塊個(gè)數(shù) fnum++;cout<<“name and size :”< } last=j;FAT[last]=FFF;break; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } void itol(int i){ //LPCTSTR yy;char zz[10];file[last].filelength++;blankspace--;cout<<“name and size :”< //sprintf(zz, “%d”, i); //itoa(i,zz,10); //yy = LPCTSTR(zz); } void ctol(char *c){ } void Graph(){ int i,x=200,y=50;//initgraph(640, 480);//setfillstyle(SOLID_FILL,WHITE);//floodfill(5,5,WHITE);//setcolor(BLACK);for(i=0;i } //getch();//closegraph(); //moveto(x+(i/20)*60-25,y+(i%20)*20);itol(i);//rectangle(x+(i/20)*60,y+(i%20)*20,x+(i/20)*60+30,y+(i%20)*20+20);//moveto(x+(i/20)*60,y+(i%20)*20);if(FAT[i]==FFF)ctol(“FFF”);ctol(“FDF”);else if(FAT[i]==FDF)else itol(FAT[i]);//LPCTSTR yy;//yy = LPCTSTR(c);//moverel(3,2);//outtext(yy);//moveto(x+i*2,y+20);//moverel(5,3);//outtext(yy);//return yy; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } void main(){ } int i;char tmpname[10];int tmplength;//要寫(xiě)入文件長(zhǎng)度 int o;//命令 fnum=0;for(i=0;i } FAT[0]=FDF;FAT[1]=FFF;FAT[3]=999;blankspace=98;while(1){ } printFAT();cin.get();cout<<“請(qǐng)選擇: 1.寫(xiě)入 2.插入 3.顯示文件目錄 4.顯示FAT表”< } case 1: cout<<“輸入文件名:”; cin>>tmpname; cout<<“輸入文件長(zhǎng)度:”;cin>>tmplength; write(tmpname,tmplength);break;cin>>tmpname;int insertpoint; cout<<“輸入插入點(diǎn):”< insert(tmpname,insertpoint);break;FAT[i]=0;case 2: cout<<“輸入文件名:”< 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 (3)運(yùn)行結(jié)果 五、磁盤(pán)調(diào)度算法模擬 1.設(shè)計(jì)目的 (1)要求學(xué)生設(shè)計(jì)一個(gè)模擬磁盤(pán)調(diào)度的程序(2)理解磁盤(pán)調(diào)度過(guò)程中的三個(gè)時(shí)間段(3)理解磁盤(pán)調(diào)度的三種算法 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 2.實(shí)驗(yàn)原理 共享設(shè)備的典型代表為磁盤(pán),磁盤(pán)的物理塊的地址由柱面號(hào)、磁道號(hào)、扇區(qū)號(hào)來(lái)指定,完成磁盤(pán)某一個(gè)物理塊的訪問(wèn)要經(jīng)過(guò)三個(gè)階段:尋道時(shí)間 Ts、旋轉(zhuǎn)延遲 Tw 和讀寫(xiě)時(shí)間 Trw。 尋道時(shí)間 Ts 是磁頭從當(dāng)前磁道移動(dòng)到目標(biāo)磁道所需要的時(shí)間;旋轉(zhuǎn)延遲 Tw 是當(dāng)磁頭停留在目標(biāo)磁道后,目標(biāo)物理塊從當(dāng)前位置旋轉(zhuǎn)到磁頭位置的時(shí)間;讀寫(xiě)時(shí)間 Trw 是目標(biāo)物理塊內(nèi)容與內(nèi)存中對(duì)應(yīng)交換的時(shí)間。磁盤(pán)調(diào)度的原則是公平和高吞吐量,衡量指標(biāo)有訪問(wèn)時(shí)間 T 和平均訪問(wèn)時(shí)間 Ta: T=Ts+Tw+Trw Ta=Tsa+Twa+Trwa 尋道時(shí)間和旋轉(zhuǎn)延遲成為調(diào)度算法的主要考慮因素。減少訪問(wèn)時(shí)間就是要減少尋道時(shí)間和旋轉(zhuǎn)延遲。 3.設(shè)計(jì)要求 (1)設(shè)計(jì)并實(shí)現(xiàn)一個(gè)函數(shù),完成先來(lái)先服務(wù)的磁盤(pán)調(diào)度功能 (2)設(shè)計(jì)并實(shí)現(xiàn)一個(gè)函數(shù)完成最短尋道時(shí)間優(yōu)先的磁盤(pán)調(diào)度功能。(3)設(shè)計(jì)并實(shí)現(xiàn)一個(gè)函數(shù)完成電梯算法的磁盤(pán)調(diào)度功能。 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 4、模擬算法的實(shí)現(xiàn) (1)各算法流程圖 先來(lái)先服務(wù)算法 Begin輸入當(dāng)前磁道號(hào)now磁頭移動(dòng)距離Sum=abs(now-array[0])磁頭總移動(dòng)距離Sum+=abs(array[j]-array[i])輸出磁盤(pán)調(diào)度序列Array[j]N目前的位置變?yōu)楫?dāng)前的位置j++J 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 最短尋道時(shí)間優(yōu)先算法流程圖 Begin獎(jiǎng)磁道從小到大排序輸入當(dāng)前磁道號(hào)nowArray[m-1]<=now?輸出磁盤(pán)調(diào)度序列array[j]Array[0]>=now?磁頭移動(dòng)總距離Sum=now-array[i]輸出磁盤(pán)調(diào)度序列array[j]確定當(dāng)前磁道在已排的序列中的位置目前的位置變?yōu)楫?dāng)前的位置now=array[i]磁頭移動(dòng)的總距離Now-array[l]<=array[r]-now?先向磁道號(hào)減小方向訪問(wèn),再向磁道號(hào)增加方向訪問(wèn)先向磁道號(hào)增加方向訪問(wèn),再向磁道號(hào)減小方向訪問(wèn)目前為止變?yōu)楫?dāng)前的位置now=array[i]i>=0i (2)程序代碼 #include int j,i,now;float sum = 0,avg; cout<<“輸入當(dāng)前的磁道號(hào):”;//輸入當(dāng)前磁道號(hào) 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 cin>>now;sum=abs(now-array[0]); cout<<“先來(lái)先服務(wù)算法調(diào)度后的序列為”< for(i=0,j=1;j sum=sum+abs(array[j]-array[i]); cout< //輸出磁盤(pán)調(diào)度序列 } avg=sum/(m); cout< int temp; int k=1; int now,l,r; int i,j; float sum=0,avg=0; for(i=0;i for(j=i+1;j { if(array[i]>array[j])//將磁道號(hào)從小到大排序 { temp=array[i]; array[i]=array[j]; array[j]=temp; } cout<<“請(qǐng)輸入當(dāng)前的磁道號(hào):”;//輸入當(dāng)前磁道號(hào) cin>>now; cout<<“最短尋道時(shí)間優(yōu)先算法調(diào)度后的序列為”;//輸出磁盤(pán)調(diào)度序列 if(array[m-1]<=now)//若被訪問(wèn)的下一最大的磁道號(hào)不大于當(dāng)前的磁道號(hào) { for(i=m-1;i>=0;i--) { cout< } else { if(array[0]>=now)//若被訪問(wèn)的下一最小的磁道號(hào)不小于當(dāng)前的磁道號(hào) { sum=now-array[i]; now=array[i];} } 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 for(i=0;i { cout< sum=array[i]-now; } } { { k++; } now=array[i]; else //當(dāng)前的磁道號(hào)的值在若所有被訪問(wèn)的下的磁道號(hào)之間 while(array[k] l=k-1; r=k; if((now-array[l])<=(array[r]-now)) { while(l>=0) //先向磁道號(hào)減小方向訪問(wèn) { cout< sum=sum+now-array[l]; now=array[l]; l=l-1; } else //先向磁道號(hào)增加方向訪問(wèn) { while(r } now=array[0]; for(j=r;j { cout< sum+=array[j]-now; } now=array[j]; { cout< sum+=array[r]-now; now=array[r]; r=r+1; } now=array[m-1]; for(j=l;j>=0;j--)//再向磁道號(hào)減小方向訪問(wèn) { cout< sum+=now-array[j]; } now=array[j]; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } avg=sum/(m); cout< int temp; int k=1; int now,d,l,r; int i,j; float sum=0,avg=0; for(i=0;i for(j=i+1;j { if(array[i]>array[j])//將磁道號(hào)從小到大排序 { temp=array[i]; array[i]=array[j]; array[j]=temp; } cout<<“請(qǐng)輸入當(dāng)前的磁道號(hào):”;//輸入當(dāng)前磁道號(hào) cin>>now; cout<<“請(qǐng)輸入當(dāng)前移動(dòng)臂的移動(dòng)的方向(1 表示向磁道號(hào)增加方向,0 表示向磁道號(hào)減小方向): ”; cin>>d; //先要給出當(dāng)前磁道號(hào)和移動(dòng)臂的移動(dòng)方向 cout<<“電梯算法調(diào)度后的序列為”; if(array[m-1]<=now) //若被訪問(wèn)的下一最大的磁道號(hào)不大于當(dāng)前的磁道號(hào) { for(i=m-1;i>=0;i--) { cout< } else { if(array[0]>=now)//若被訪問(wèn)的下一最小的磁道號(hào)不小于當(dāng)前的磁道號(hào) { sum=now-array[i]; now=array[i];} } } } for(i=0;i { cout< sum=array[i]-now; 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } } { { k++; } now=array[i]; else //當(dāng)前的磁道號(hào)的值在若所有被訪問(wèn)的下的磁道號(hào)之間 while(array[k] l=k-1; r=k; switch(d) { case 0: //先向磁道號(hào)減小方向訪問(wèn) { while(l>=0) { cout< sum=sum+now-array[l]; now=array[l]; l=l-1; { while(r } now=array[0]; for(j=r;j { cout< sum+=array[j]-now; } break;} now=array[j]; case 1: //先向磁道號(hào)增加方向訪問(wèn) { cout< sum+=array[r]-now; now=array[r]; r=r+1; } now=array[m-1]; for(j=l;j>=0;j--) { cout< sum+=now-array[j]; }break; now=array[j]; } 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 } avg=sum/(m); cout< int i,m,n,flag=1,array[100]; cout<<“輸入磁盤(pán)調(diào)度序列的個(gè)數(shù):”; cin>>m; cout<<“分別輸入磁盤(pán)調(diào)度序列:”;for(i=0;i cout<<“0 終止”< cout<<“1 先來(lái)先服務(wù)算法”< cout<<“2 最短尋道時(shí)間優(yōu)先算法”< cout<<“3 電梯算法算法”< cout<<“選擇以上的算法:”; } cin>>n;{ case 0: { flag=0;break;} //終止程序 case 1: } { FCFS(array,m);break;} //先來(lái)先服務(wù)算法 { SSTF(array,m);break;}//最短尋道時(shí)間優(yōu)先算法 { SCAN(array,m);break;}//電梯算法 case 2: switch(n) default: cout<<“輸入有誤”< } } case 3: default: cout<<“輸入有誤,請(qǐng)重新輸入:”< 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 (3)運(yùn)行結(jié)果 輸入相關(guān)調(diào)度信息: 先來(lái)先服務(wù)算法: 最短尋道時(shí)間優(yōu)先算法: 電梯算法: 六、總結(jié) 本人在劉發(fā)升老師的指導(dǎo)下,順利完成該課程設(shè)計(jì)。通過(guò)此次課程設(shè)計(jì),收獲頗多。 一、對(duì)實(shí)驗(yàn)原理有更深的理解 通過(guò)模擬DOS的課程設(shè)計(jì),掌握了DOS各項(xiàng)功能實(shí)現(xiàn)的根本原理。并通過(guò)把該算法的內(nèi)容,算法的執(zhí)行順序在計(jì)算機(jī)上實(shí)現(xiàn),把原來(lái)以為很深?yuàn)W的書(shū)本知識(shí)變的更為簡(jiǎn)單,對(duì)實(shí)驗(yàn)原理有更深的理解。 二、對(duì)該理論在實(shí)踐中的應(yīng)用有深刻的理解 通過(guò)把該算法的內(nèi)容,算法的執(zhí)行順序在計(jì)算機(jī)上實(shí)現(xiàn),知道和理解了該理論在計(jì)算機(jī)中是怎樣執(zhí)行的,對(duì)該理論在實(shí)踐中的應(yīng)用有深刻的理解。 三、激發(fā)了學(xué)習(xí)的積極性 信息工程學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)082班 通過(guò)此次課程設(shè)計(jì),全面系統(tǒng)的理解了計(jì)算機(jī)操作系統(tǒng)中各項(xiàng)功能的一般原理和基本實(shí)現(xiàn)方法。把死板的課本知識(shí)變得生動(dòng)有趣,激發(fā)了學(xué)習(xí)的積極性。把學(xué)過(guò)的計(jì)算機(jī)操作系統(tǒng)的知識(shí)強(qiáng)化,能夠把課堂上學(xué)的知識(shí)通過(guò)自己設(shè)計(jì)的程序表示出來(lái),加深了對(duì)理論知識(shí)的理解。以前對(duì)與計(jì)算機(jī)操作系統(tǒng)的認(rèn)識(shí)是模糊的,概念上的,現(xiàn)在通過(guò)自己動(dòng)手做實(shí)驗(yàn),從實(shí)踐上認(rèn)識(shí)了操作系統(tǒng)是如何處理命令的,如何協(xié)調(diào)計(jì)算機(jī)內(nèi)部各個(gè)部件運(yùn)行。課程設(shè)計(jì)中程序比較復(fù)雜,在調(diào)試時(shí)應(yīng)該仔細(xì),在程序調(diào)試時(shí),注意指針,將不必要的命令去除。在這次課程設(shè)計(jì)中,我就是按照實(shí)驗(yàn)指導(dǎo)的思想來(lái)完成。加深了理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn),培養(yǎng)實(shí)踐動(dòng)手能力和程序開(kāi)發(fā)能力的目的。 四、理解了該知識(shí)點(diǎn)以及學(xué)科之間的融合滲透 本次課程設(shè)計(jì)程序部分是用C語(yǔ)言編寫(xiě)的,把《計(jì)算機(jī)操作系統(tǒng)》和《C語(yǔ)言》兩門(mén)門(mén)學(xué)科聯(lián)系起來(lái),把各個(gè)學(xué)科之間的知識(shí)融合起來(lái),把各門(mén)課程的知識(shí)聯(lián)系起來(lái),對(duì)計(jì)算機(jī)整體的認(rèn)識(shí)更加深刻。使我加深了對(duì)《計(jì)算機(jī)操作系統(tǒng)》和《C語(yǔ)言》課程的認(rèn)識(shí)。同時(shí)對(duì)操作系統(tǒng)中各種功能的本質(zhì)有了充分地了解。 《計(jì)算機(jī)操作系統(tǒng)》課程設(shè)計(jì)教學(xué)大綱 課程編號(hào):08120070 課程名稱(chēng):計(jì)算機(jī)操作系統(tǒng)/Computer Operating System 課程總學(xué)時(shí)/學(xué)分:56/3.(其中理論46學(xué)時(shí),實(shí)驗(yàn)10學(xué)時(shí) 課程設(shè)計(jì)時(shí)間/學(xué)分:1周/1學(xué)分 適用專(zhuān)業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 一、設(shè)計(jì)任務(wù)及目的 《計(jì)算機(jī)操作系統(tǒng)》課程是計(jì)算機(jī)科學(xué)與技術(shù)專(zhuān)業(yè)的一門(mén)重要專(zhuān)業(yè)基礎(chǔ)課,“計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)”的目的是在學(xué)生學(xué)習(xí)了《計(jì)算機(jī)操作系統(tǒng)》課程之后理論聯(lián)系實(shí)踐,一方面延續(xù)《計(jì)算機(jī)操作系統(tǒng)》課程實(shí)驗(yàn)的要求,進(jìn)一步加深與鞏固學(xué)生對(duì)計(jì)算機(jī)操作系統(tǒng)中概念、基本原理、算法的理解和掌握,培養(yǎng)學(xué)生對(duì)計(jì)算機(jī)常用操作系統(tǒng)的操作能力;另一方面通過(guò)本環(huán)節(jié)加強(qiáng)培養(yǎng)學(xué)生分析、修改和設(shè)計(jì)操作系統(tǒng)的能力。期望達(dá)到學(xué)為所用,并且能進(jìn)一步提高使用計(jì)算機(jī)和編程能力。 二、課程設(shè)計(jì)的基本要求 1、了解所選擇開(kāi)發(fā)環(huán)境的調(diào)試功能,掌握跟蹤,修改錯(cuò)誤的技巧。 2、能根據(jù)實(shí)際問(wèn)題選擇數(shù)據(jù)結(jié)構(gòu),清淅的描述算法。 3、培養(yǎng)良好的編程風(fēng)格。 4、撰寫(xiě)課程設(shè)計(jì)報(bào)告,按格式要求寫(xiě)出完整的、規(guī)范的報(bào)告并打印,其中模塊圖、流程圖要清楚規(guī)范,特別要求學(xué)生獨(dú)立完成。 三、設(shè)計(jì)需運(yùn)用的基本理論 設(shè)計(jì)需運(yùn)用計(jì)算機(jī)系統(tǒng)知識(shí)、操作系統(tǒng)基本概念、進(jìn)程管理、存儲(chǔ)管理技術(shù)、I/O管理技術(shù)、文件管理、高級(jí)語(yǔ)言程序設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)等內(nèi)容。 四、課程設(shè)計(jì)內(nèi)容與時(shí)間安排 1、設(shè)計(jì)內(nèi)容:可以選擇下面提供的參考選題,也可以自選,如果自選,需要將自選題,目的詳細(xì)內(nèi)容以及實(shí)現(xiàn)要求提供給老師,老師批準(zhǔn)后方可采用。 課題一:進(jìn)程管理演示 設(shè)計(jì)目的:加深對(duì)進(jìn)程概念及進(jìn)程管理各部分內(nèi)容的理解;熟悉進(jìn)程管理中主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及進(jìn)程調(diào)度算法、進(jìn)程控制機(jī)構(gòu)、同步機(jī)構(gòu)及通訊機(jī)構(gòu)的實(shí)施。 設(shè)計(jì)內(nèi)容:設(shè)計(jì)一個(gè)允許n個(gè)進(jìn)程并發(fā)運(yùn)行的進(jìn)程管理模擬系統(tǒng)。該系統(tǒng)包括有簡(jiǎn)單的進(jìn)程控制、同步與通訊機(jī)構(gòu),其進(jìn)程調(diào)度算法可任意選擇(優(yōu)先級(jí)調(diào)度,時(shí)間片輪轉(zhuǎn),短進(jìn)程優(yōu)先中的一種)。每個(gè)進(jìn)程用一個(gè)PCB表示,其內(nèi)容根據(jù)具體情況設(shè)置。各進(jìn)程之間有一定的同步 關(guān)系(可選)。系統(tǒng)在運(yùn)行過(guò)程中應(yīng)能顯示或打印各進(jìn)程的狀態(tài)及有關(guān)參數(shù)的變化情況,以便觀察諸進(jìn)程的運(yùn)行過(guò)程及系統(tǒng)的管理過(guò)程。 課題二:存儲(chǔ)管理系統(tǒng)設(shè)計(jì) 設(shè)計(jì)目的:使學(xué)生熟悉存儲(chǔ)器管理系統(tǒng)的設(shè)計(jì)方法;加深對(duì)所學(xué)各種存儲(chǔ)器管理方案的了解。設(shè)計(jì)內(nèi)容:采用一些常用的存儲(chǔ)器分配算法,設(shè)計(jì)一個(gè)請(qǐng)求頁(yè)式存儲(chǔ)管理模擬系統(tǒng)并調(diào)試運(yùn)行。課題三:編程模擬銀行家算法 設(shè)計(jì)目的:通過(guò)設(shè)計(jì)和調(diào)試銀行家算法通用程序,加深對(duì)死鎖概念和死鎖避免方法的了解。設(shè)計(jì)內(nèi)容:編制銀行家算法程序,并檢測(cè)所給狀態(tài)的系統(tǒng)安全性。課題四:磁盤(pán)調(diào)度算法的實(shí)現(xiàn)與分析 設(shè)計(jì)目的:使學(xué)生熟悉磁盤(pán)管理系統(tǒng)的設(shè)計(jì)方法;加深對(duì)所學(xué)各種磁盤(pán)調(diào)度算法的了解及其算法的特點(diǎn)。 設(shè)計(jì)內(nèi)容:編程序?qū)崿F(xiàn)下述磁盤(pán)調(diào)度算法,并求出每種算法的平均移動(dòng)磁道數(shù),并分析結(jié)果: ①先來(lái)先服務(wù)算法(FCFS)②最短尋道時(shí)間優(yōu)先算法(SSTF)③掃描算法(SCAN)④循環(huán)掃描算法(C-SCAN) 課題五:文件系統(tǒng)演示 設(shè)計(jì)目的:使學(xué)生熟悉文件管理系統(tǒng)的設(shè)計(jì)方法;加深對(duì)所學(xué)各種文件操作的了解及其操作方法的特點(diǎn)。 設(shè)計(jì)內(nèi)容:設(shè)計(jì)一個(gè)簡(jiǎn)單的多用戶(hù)文件系統(tǒng)。即 ①在系統(tǒng)中用一個(gè)文件來(lái)模擬一個(gè)磁盤(pán); ②此系統(tǒng)至少有:Create、delete、open、close、read、write等和部分文件屬性的功能。③實(shí)現(xiàn)這個(gè)文件系統(tǒng)。④能實(shí)際演示這個(gè)文件系統(tǒng)。 基本上是進(jìn)入一個(gè)界面(此界面就是該文件系統(tǒng)的界面)后,可以實(shí)現(xiàn)設(shè)計(jì)的操作要求。 2、時(shí)間安排: 動(dòng)員,準(zhǔn)備及規(guī)則(0.5天) 具體內(nèi)容:動(dòng)員、選題、系統(tǒng)功能和需求的分析。 課程設(shè)計(jì)實(shí)施及檢查(0.5天) 具體內(nèi)容:任務(wù)規(guī)劃,設(shè)計(jì)出每個(gè)功能 課程設(shè)計(jì)實(shí)施(5天) 具體內(nèi)容:具體功能的實(shí)現(xiàn)、系統(tǒng)的完善、中期檢查和個(gè)人答辯 整理課程設(shè)計(jì)報(bào)告書(shū)(1天) 具體內(nèi)容:文檔的整理,設(shè)計(jì)報(bào)告的完成 五、考核方式與評(píng)分辦法 考核方式:課堂點(diǎn)名、設(shè)計(jì)報(bào)告及個(gè)人答辯的綜合評(píng)定 評(píng)分方式:課程設(shè)計(jì)成績(jī)=點(diǎn)名*10%+設(shè)計(jì)報(bào)告*60+答辯*30% 成績(jī)實(shí)行五級(jí)記分。其中,優(yōu)(90-100分),良(80-89),中(70-79),及格(60-69),不及格(59分及以下)。如果教師認(rèn)定為抄襲,則成績(jī)?yōu)?分。 六、使用教材及參考書(shū)(小4號(hào)黑體) [1]徐虹.操作系統(tǒng)實(shí)驗(yàn)指導(dǎo).清華大學(xué) 出版社,2009年3月 [2]孟慶昌.操作系統(tǒng)(第2版).電子工業(yè)出版社,2010年9月 [3]羅宇,鄒鵬等.操作系統(tǒng)(第2版).電子工業(yè)出版社,2007年 4月 [4]宗大華,宗濤等.操作系統(tǒng).人民郵電出版社,2009年1月 執(zhí)筆人:左新娥 2011年11月2日 審核人:文志強(qiáng) 2011年11月5日 批準(zhǔn)人: 朱艷輝 2011年11月6日 《計(jì)算機(jī)操作系統(tǒng)》 課 程 設(shè) 計(jì) 報(bào) 告 題 目: 銀行家算法 班 級(jí): XXXXXXXXXXXXXXXX 姓 名: XXM 學(xué) 號(hào): XXXXXXXXXXXX 指導(dǎo)老師: XXXXXXXXXXXXXX 設(shè)計(jì)時(shí)間: XXXXXXXXXXXXXXX 一.設(shè)計(jì)目的 1、掌握死鎖概念、死鎖發(fā)生的原因、死鎖產(chǎn)生的必要條件; 2、掌握死鎖的預(yù)防、死鎖的避免; 3、深刻理解死鎖的避免:安全狀態(tài)和銀行家算法; 二.銀行家算法 1.簡(jiǎn)介 銀行家算法是一種最有代表性的避免死鎖的算法。在避免死鎖方法中允許進(jìn)程動(dòng)態(tài)地申請(qǐng)資源,但系統(tǒng)在進(jìn)行資源分配之前,應(yīng)先計(jì)算此次分配資源的安全性,若分配不會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),則分配,否則等待。為實(shí)現(xiàn)銀行家算法,系統(tǒng)必須設(shè)置若干數(shù)據(jù)結(jié)構(gòu)。 2.數(shù)據(jù)結(jié)構(gòu) 1)可利用資源向量Available 是個(gè)含有m個(gè)元素的數(shù)組,其中的每一個(gè)元素代表一類(lèi)可利用的資源數(shù)目。如果Available[j]=K,則表示系統(tǒng)中現(xiàn)有Rj類(lèi)資源K個(gè)。2)最大需求矩陣Max 這是一個(gè)n×m的矩陣,它定義了系統(tǒng)中n個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)m類(lèi)資源的最大需求。如果Max[i,j]=K,則表示進(jìn)程i需要Rj類(lèi)資源的最大數(shù)目為K。3)分配矩陣Allocation 這也是一個(gè)n×m的矩陣,它定義了系統(tǒng)中每一類(lèi)資源當(dāng)前已分配給每一進(jìn)程的資源數(shù)。如果Allocation[i,j]=K,則表示進(jìn)程i當(dāng)前已分得Rj類(lèi)資源的 數(shù)目為K。4)需求矩陣Need 這也是一個(gè)n×m的矩陣,用以表示每一個(gè)進(jìn)程尚需的各類(lèi)資源數(shù)。如果Need[i,j]=K,則表示進(jìn)程i還需要Rj類(lèi)資源K個(gè),方能完成其任務(wù)。Need[i,j]=Max[i,j]-Allocation[i,j].3.算法原理 操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請(qǐng)資源時(shí),要測(cè)試該進(jìn)程對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請(qǐng)量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請(qǐng)資源時(shí),先測(cè)試該進(jìn)程本次申請(qǐng)的資源數(shù)是否超過(guò)了該資源所剩余的總量。若超過(guò)則拒絕分配資源,若能滿足則按當(dāng)前的申請(qǐng)量分配資源,否則也要推遲分配。 三.算法實(shí)現(xiàn) 1.初始化 由用戶(hù)輸入數(shù)據(jù),分別對(duì)可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。 2.銀行家算法 在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。 銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是,才分配。設(shè)進(jìn)程cusneed提出請(qǐng)求REQUEST [i],則銀行家算法按如下規(guī)則進(jìn)行判斷。(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],則轉(zhuǎn)(2);否則,出錯(cuò)。(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],則轉(zhuǎn)(3);否則,出錯(cuò)。(3)系統(tǒng)試探分配資源,修改相關(guān)數(shù)據(jù): AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系統(tǒng)執(zhí)行安全性檢查,如安全,則分配成立;否則試探險(xiǎn)性分配作廢,系統(tǒng)恢復(fù)原狀,進(jìn)程等待。 3.安全性檢查算法 (1)設(shè)置兩個(gè)工作向量Work=AVAILABLE;FINISH(2)從進(jìn)程集合中找到一個(gè)滿足下述條件的進(jìn)程,F(xiàn)INISH==false;NEED<=Work;如找到,執(zhí)行(3);否則,執(zhí)行(4)(3)設(shè)進(jìn)程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的進(jìn)程Finish= true,則表示安全;否則系統(tǒng)不安全。 4.算法流程圖 1)初始化算法流程圖 2)銀行家算法流程圖: 3)安全性算法流程圖: 4.代碼(C語(yǔ)言) #include /*M個(gè)進(jìn)程對(duì)N類(lèi)資源最大資源需求量*/ int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系統(tǒng)可用資源數(shù)*/ int AVAILABLE[N]={10,5,7};/*M個(gè)進(jìn)程對(duì)N類(lèi)資源最大資源需求量*/ int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; /*M個(gè)進(jìn)程已經(jīng)得到N類(lèi)資源的資源量 */ int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; /*M個(gè)進(jìn)程還需要N類(lèi)資源的資源量*/ int Request[N]={0,0,0}; void main(){ int i=0,j=0;char flag; void showdata();void changdata(int);void rstordata(int);int chkerr(int);showdata();enter:{ printf(“請(qǐng)輸入需申請(qǐng)資源的進(jìn)程號(hào)(從0到”); printf(“%d”,M-1); printf(“):”); scanf(“%d”,&i);} if(i<0||i>=M){ printf(“輸入的進(jìn)程號(hào)不存在,重新輸入!n”); goto enter;} err:{ printf(“請(qǐng)輸入進(jìn)程”); printf(“%d”,i); printf(“申請(qǐng)的資源數(shù)n”); printf(“類(lèi)別: A B Cn”);printf(“ ”); for(j=0;j { scanf(“%d”,&Request[j]); if(Request[j]>NEED[i][j]) { printf(“%d”,i); printf(“號(hào)進(jìn)程”); printf(“申請(qǐng)的資源數(shù) > 進(jìn)程”); printf(“%d”,i); printf(“還需要”); printf(“%d”,j);printf(“類(lèi)資源的資源量!申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!n”); goto err; } else { if(Request[j]>AVAILABLE[j]) { printf(“進(jìn)程 ”); printf(“%d”,i); printf(“申請(qǐng)的資源數(shù)大于系統(tǒng)可用”); printf(“%d”,j); printf(“類(lèi)資源的資源量!申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!n”); goto err; } } } } changdata(i);if(chkerr(i)){ rstordata(i); showdata();} else showdata(); printf(“n”); printf(“按'y'或'Y'鍵繼續(xù),否則退出n”); flag=getch(); if(flag=='y'||flag=='Y'){ goto enter; } else { exit(0);} } /*顯示數(shù)組*/ void showdata(){ int i,j;printf(“系統(tǒng)可用資源向量:n”);printf(“***Available***n”);printf(“資源類(lèi)別: A B Cn”);printf(“資源數(shù)目:”);for(j=0;j printf(“%d ”,AVAILABLE[j]);} printf(“n”);printf(“n”);printf(“各進(jìn)程還需要的資源量:n”);printf(“******Need******n”);printf(“資源類(lèi)別: A B Cn”);for(i=0;i printf(“ ”); printf(“%d”,i); printf(“號(hào)進(jìn)程:”); for(j=0;j { printf(“ %d ”,NEED[i][j]); } printf(“n”);} printf(“n”);printf(“各進(jìn)程已經(jīng)得到的資源量: n”);printf(“***Allocation***n”);printf(“資源類(lèi)別: A B Cn”);for(i=0;i printf(“ ”); printf(“%d”,i); printf(“號(hào)進(jìn)程:”); /*printf(“:n”);*/ for(j=0;j { printf(“ %d ”,ALLOCATION[i][j]); } printf(“n”); } printf(“n”);} /*系統(tǒng)對(duì)進(jìn)程請(qǐng)求響應(yīng),資源向量改變*/ void changdata(int k){ int j; for(j=0;j AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j];} } /*資源向量改變*/ void rstordata(int k) { int j; for(j=0;j AVAILABLE[j]=AVAILABLE[j]+Request [j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j]; } } /*安全性檢查函數(shù)*/ int chkerr(int s){ int WORK,FINISH[M],temp[M];int i,j,k=0; for(i=0;i WORK=AVAILABLE[j]; i=s; printf(“n”); while(i { if(FINISH[i]==FALSE&&NEED[i][j]<=WORK) { printf(“系統(tǒng)不安全!本次資源申請(qǐng)不成功!n”); printf(“n”); return 1; } } } WORK=WORK+ALLOCATION[i][j]; FINISH[i]=TRUE; temp[k]=i;k++;i=0; printf(“n”); printf(“經(jīng)安全性檢查,系統(tǒng)安全,本printf(”n“); printf(” 本次安全序列:n“);printf(”進(jìn)程依次為“);for(i=0;i printf(”%d“,temp[i]); 次分配成功。n”);} else { i++;} } for(i=0;i printf(“-> ”);} printf(“n”);return 0;四.程序運(yùn)行截圖 0號(hào)進(jìn)程申請(qǐng)資源{1,2,3},各向量發(fā)生變化 0和進(jìn)程繼續(xù)申請(qǐng)資源{2,2,0},各向量變化 2號(hào)進(jìn)程申請(qǐng)資源,由于NEED[2]={9,0,2},前兩次申請(qǐng)不合理,系統(tǒng)處于不安全狀態(tài)太。第三次2號(hào)申請(qǐng)資源向量為{1,0,2},系統(tǒng)回到安全狀態(tài),并得出新的安全序列3-0-1-2-4。 五.心得體會(huì) 從此次的課程設(shè)計(jì)中,我收獲很多。首先也是最重要的一點(diǎn)是對(duì)處理機(jī)調(diào)度與死鎖有了深入的理解;其次,再次鞏固了C語(yǔ)言編程。 在用C語(yǔ)言設(shè)計(jì)和編寫(xiě)銀行家算法和安全性檢查算法時(shí)遇到了一些困難都克服了。在使程序界面美觀、能夠持續(xù)循環(huán)運(yùn)行時(shí)用了很多方法,花了比較多的時(shí)間。最后選擇用goto語(yǔ)句控制,我覺(jué)得在此實(shí)驗(yàn)中比較好,代碼閱讀起來(lái)更加方便。 課程設(shè)計(jì)報(bào)告 題 目: 模擬請(qǐng)求頁(yè)式管理 課程名稱(chēng): 計(jì)算機(jī)操作系統(tǒng) 學(xué) 院: 信息工程學(xué)院 專(zhuān) 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí): 14計(jì)本(1)學(xué)生姓名: * * * 學(xué) 號(hào): 201403031** 指導(dǎo)教師: * * 成 績(jī): 開(kāi)課時(shí)間: 2016-2017 學(xué)年 一 學(xué)期 模擬請(qǐng)求頁(yè)式管理 第1章 需求分析 1.1設(shè)計(jì)要求 請(qǐng)求頁(yè)式管理是一種常用的虛擬存儲(chǔ)管理技術(shù)。本設(shè)計(jì)通過(guò)請(qǐng)求頁(yè)式存儲(chǔ)管理中頁(yè)面置換算法模擬設(shè)計(jì),了解虛擬存儲(chǔ)技術(shù)的特點(diǎn),掌握請(qǐng)求頁(yè)式管理的頁(yè)面置換算法。本實(shí)驗(yàn)要求用Vc++或其他高級(jí)語(yǔ)言編寫(xiě)和調(diào)試。 編寫(xiě)程序?qū)崿F(xiàn): (1)先進(jìn)先出頁(yè)面置換算法(FIFO)(2)最近最久未使用頁(yè)面置換算法(LRU)最佳置換頁(yè)面置換算法(OPT)設(shè)計(jì)一個(gè)虛擬存儲(chǔ)區(qū)和內(nèi)存工作區(qū),編程序演示以上三種算法的具體實(shí)現(xiàn)過(guò)程,并計(jì)算訪問(wèn)命中率。 1.2解決方案 首先確定實(shí)現(xiàn)語(yǔ)言使用c#實(shí)現(xiàn)圖形化界面,后確定要實(shí)現(xiàn)哪些功能,比如算法選擇,頁(yè)面添加,模擬控制。然后確定輸出結(jié)構(gòu)以便于程序的測(cè)試和驗(yàn)證。將基本框架建立后再進(jìn)行編程。編程前進(jìn)行算法結(jié)構(gòu)分析最后編程實(shí)現(xiàn)。 1.3算法實(shí)現(xiàn)原理 1、先進(jìn)先出置換算法(FIFO): 發(fā)生缺頁(yè)中斷時(shí)按照頁(yè)面進(jìn)入內(nèi)存順序總是淘汰最先進(jìn)入內(nèi)存的頁(yè)面。 2、最近最久未使用置換算法(LRU): 發(fā)生缺頁(yè)中斷時(shí)總是淘汰存在內(nèi)存中最長(zhǎng)時(shí)間未被使用的頁(yè)面。 3、最佳置換算法(OPT): 發(fā)生缺頁(yè)中斷時(shí)若一個(gè)或幾個(gè)頁(yè)面將來(lái)將不會(huì)被調(diào)用則按先進(jìn)先出原則淘汰頁(yè)面,若將來(lái)都有調(diào)用則比較調(diào)用時(shí)刻選擇最遠(yuǎn)時(shí)刻頁(yè)面淘汰。 4、缺頁(yè)率:缺頁(yè)次數(shù)占頁(yè)面調(diào)用次數(shù)的百分比。 第2章 概要設(shè)計(jì) 2.1數(shù)據(jù)設(shè)計(jì) 常變量:調(diào)用頁(yè)面最大數(shù)量(MaxN),內(nèi)存最大頁(yè)面數(shù)(MaxM)待調(diào)用頁(yè)面數(shù)組:page_dd[MaxN]存放等待調(diào)用的頁(yè)面號(hào) 頁(yè)面數(shù)組專(zhuān)用指針 page_p,用于指向page_dd數(shù)組中正需調(diào)入內(nèi)存的頁(yè)號(hào) 內(nèi)存塊數(shù)組:Memery[MaxM],存放內(nèi)存當(dāng)前存放的頁(yè)號(hào) 缺頁(yè)計(jì)數(shù)器:count,記錄缺頁(yè)次數(shù) 內(nèi)存塊狀態(tài)數(shù)組:M1[MaxN],M2[MaxN],M3[MaxN],記錄每次頁(yè)面調(diào)用結(jié)束后內(nèi)存各塊的狀態(tài) 缺頁(yè)記錄數(shù)組s[MaxN],用于記錄頁(yè)面調(diào)用時(shí)是否產(chǎn)生缺頁(yè)中斷,初始化為是 2.2函數(shù)設(shè)計(jì) 1、頁(yè)面添加函數(shù):void btnAdd_Click(object sender, EventArgs e)用于實(shí)現(xiàn)通過(guò)點(diǎn)擊按鈕實(shí)現(xiàn)數(shù)據(jù)輸入。 2、內(nèi)存初始化函數(shù):init(int[] a, int[] b,int []m1,int[]m2,int[]m3)參數(shù)有頁(yè)面數(shù)組、內(nèi)存數(shù)組、狀態(tài)數(shù)組,采用先進(jìn)先出算法對(duì)內(nèi)存先進(jìn)行裝滿 服務(wù)于先進(jìn)先出頁(yè)面置換函數(shù)和最佳置換函數(shù)。 3、輸出函數(shù):void display(int[]a,int[]m1,int[]m2,int[]m3,char[]c)用于輸出模擬結(jié)果,參數(shù)有頁(yè)面數(shù)組,內(nèi)存數(shù)組,狀態(tài)數(shù)組,缺頁(yè)記錄數(shù)組。再模擬之后調(diào)用。 4、模擬控制函數(shù):void btnmo_Click(object sender, EventArgs e)用于實(shí)現(xiàn)通過(guò)單擊模擬按鈕,根據(jù)用戶(hù)所選算法進(jìn)行模擬并顯示結(jié)果。 5、先進(jìn)先出算法模擬函數(shù): void FIFO(int[] a, int[] b,int[]m1,int[]m2,int[]m3,char[] s)用于實(shí)現(xiàn)先進(jìn)先出算法模擬,參數(shù)有頁(yè)面數(shù)組,內(nèi)存數(shù)組、內(nèi)存狀態(tài)記錄數(shù)組,缺頁(yè)記錄數(shù)組。在模擬函數(shù)中調(diào)用。 6、最近最久未使用算法模擬函數(shù): void LRU(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s)用于 3 實(shí)現(xiàn)最近最久未使用算法模擬,參數(shù)有頁(yè)面數(shù)組,內(nèi)存數(shù)組,內(nèi)存狀態(tài)記錄數(shù)組,缺頁(yè)記錄數(shù)組。在模擬函數(shù)中被調(diào)用。 7、最近最久未使用函數(shù)輔助函數(shù):void LUR_I(int[] a,int e)用于對(duì)最近最久未使用算法中所用輔助數(shù)組(記錄頁(yè)面存在時(shí)長(zhǎng))進(jìn)行調(diào)整,參數(shù)有輔助數(shù)組及需調(diào)整的數(shù)據(jù)下標(biāo)。在最近最久未使用函數(shù)中調(diào)用。 8、最佳置換算法模擬函數(shù): void OPT(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s)用于模擬最佳置換算法。參數(shù)有頁(yè)面數(shù)組,內(nèi)存數(shù)組,內(nèi)存狀態(tài)記錄數(shù)組,缺頁(yè)記錄數(shù)組。在模擬函數(shù)中被調(diào)用。 9、最佳置換算法輔助函數(shù):void OPT_F(int[] a, int e)用于對(duì)最佳置換算法中的輔助數(shù)組進(jìn)行調(diào)整。參數(shù)有輔助數(shù)組,需調(diào)整數(shù)據(jù)下標(biāo)。在最佳置換算法中被調(diào)用。 10、重置函數(shù):void btncz_Click(object sender, EventArgs e)用于重新選擇算法進(jìn)行新的模擬。 2.3主要算法設(shè)計(jì) 1、初始化函數(shù)算法: 第一步:將第一個(gè)頁(yè)面調(diào)入內(nèi)存,調(diào)整最佳置換算法輔助數(shù)組,缺頁(yè)計(jì)數(shù)器加一,保存內(nèi)存數(shù)組狀態(tài)。 第二步:調(diào)用下一個(gè)頁(yè)面并判斷內(nèi)存中是否有本頁(yè)面有轉(zhuǎn)第三步,無(wú)轉(zhuǎn)第四步。第三步:更改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)值,記錄當(dāng)前內(nèi)存狀態(tài),調(diào)整最佳置換算法輔助數(shù)組,頁(yè)面指針指向下一頁(yè)。 第四步:將頁(yè)面調(diào)入內(nèi)存,調(diào)整最佳置換算法輔助函數(shù),缺頁(yè)計(jì)數(shù)器加一,保存內(nèi)存數(shù)組狀態(tài)。若內(nèi)存尚不滿轉(zhuǎn)第一步。具體見(jiàn)圖1初始化算法流程圖。 開(kāi)始頁(yè)面調(diào)入內(nèi)存缺頁(yè)計(jì)數(shù)器加一記錄內(nèi)存狀態(tài)調(diào)用下一頁(yè)否否內(nèi)存是否有該頁(yè)面是記錄內(nèi)存狀態(tài)修改缺頁(yè)數(shù)組內(nèi)存已滿是結(jié)束 圖1 初始化算法流程圖 2、先進(jìn)先出頁(yè)面置換算法: 第一步:檢查內(nèi)存中是否已有需調(diào)用頁(yè)面,有則轉(zhuǎn)第二步,無(wú)則轉(zhuǎn)第三步。第二步:記錄當(dāng)前內(nèi)存狀態(tài),修改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)值。 第三步:內(nèi)存中無(wú)需要調(diào)用的頁(yè)面,進(jìn)行出隊(duì)操作,然后進(jìn)行入隊(duì)操作,記錄內(nèi)存塊狀態(tài),缺頁(yè)計(jì)數(shù)器加一。 第四步:若頁(yè)面數(shù)組未被調(diào)用結(jié)束轉(zhuǎn)第一步。具體見(jiàn)圖2先進(jìn)先出算法流程圖。 開(kāi)始頁(yè)面調(diào)入內(nèi)存該頁(yè)在內(nèi)存中是否已存在是否否先出隊(duì)操作后入隊(duì)操作記錄內(nèi)存狀態(tài)修改缺頁(yè)數(shù)組值記錄內(nèi)存狀態(tài)缺頁(yè)計(jì)數(shù)器加一頁(yè)面調(diào)用結(jié)束是結(jié)束 圖2 先進(jìn)先出算法流程圖 3、最近最久未使用置換算法: 第一步:將頁(yè)面調(diào)入內(nèi)存,記錄內(nèi)存狀態(tài),缺頁(yè)計(jì)數(shù)器加一,調(diào)整輔助數(shù)組,頁(yè)面指針加一。 第二步:檢查內(nèi)存中是否已有所需頁(yè)面,有轉(zhuǎn)第三步,無(wú)轉(zhuǎn)第一步。 第三步:修改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)記錄,記錄內(nèi)存狀態(tài),調(diào)整輔助數(shù)組,頁(yè)面指針加一。第四步:內(nèi)存是否已滿,無(wú)則轉(zhuǎn)第一步,是則轉(zhuǎn)第五步。 第五步:檢查內(nèi)存中是否有所需頁(yè)面,有則記錄當(dāng)前內(nèi)存狀態(tài),修改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)值。無(wú)則轉(zhuǎn)第六步。 第六步:檢查輔助數(shù)組找出最大值并記錄其下標(biāo),置換內(nèi)存中對(duì)應(yīng)下標(biāo)的數(shù)據(jù),調(diào)整輔助數(shù)組,缺頁(yè)計(jì)數(shù)器加一。 第七步:頁(yè)面是否調(diào)用結(jié)束未結(jié)束則轉(zhuǎn)第五步。具體見(jiàn)圖3最近最久未使用算法流程圖。 開(kāi)始調(diào)入頁(yè)面至內(nèi)存記錄內(nèi)存狀態(tài)計(jì)數(shù)器加一否調(diào)整輔助數(shù)組調(diào)用下一頁(yè)內(nèi)存中是否已有該頁(yè)否內(nèi)存已滿是通過(guò)輔助數(shù)組確定淘汰頁(yè)面是修改缺頁(yè)數(shù)組記錄內(nèi)存狀態(tài)調(diào)整輔助數(shù)組否頁(yè)面置換記錄內(nèi)存狀態(tài)計(jì)數(shù)器加一調(diào)用結(jié)束是結(jié)束 圖3 最近最久未使用算法 4、最佳置換算法: 第一步:檢查內(nèi)存中是否已有所需頁(yè)面,有則記錄內(nèi)存狀態(tài),修改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)數(shù)值。無(wú)則轉(zhuǎn)第二步。 第二步:判斷內(nèi)存中各頁(yè)面的未來(lái)調(diào)用情況,記錄是否還有調(diào)用,若有則記錄調(diào)用時(shí)刻。 第三步:分析調(diào)用情況,內(nèi)存中頁(yè)面都在將來(lái)不會(huì)被調(diào)用轉(zhuǎn)第四步,有一個(gè)被調(diào)用轉(zhuǎn)第五步,有兩個(gè)被調(diào)用轉(zhuǎn)第六步,全被調(diào)用轉(zhuǎn)第七步。 第四步:查找輔助數(shù)組找到內(nèi)存中存在時(shí)間最長(zhǎng)的頁(yè)面進(jìn)行置換,修改內(nèi)存狀態(tài),缺頁(yè)計(jì)數(shù)器加一,修改輔助數(shù)組。 第五步:查找到不會(huì)被調(diào)用的頁(yè)面,并根據(jù)輔助數(shù)組選擇最早進(jìn)入內(nèi)存的頁(yè)面將其置換。修改內(nèi)存狀態(tài),缺頁(yè)計(jì)數(shù)器加一,修改輔助數(shù)組。 第六步:查找輔助數(shù)組找到將來(lái)不需要在調(diào)用的頁(yè)面將其置換,修改輔助數(shù)組,記錄內(nèi)存狀態(tài),缺頁(yè)計(jì)數(shù)器加一。 第七步:查找輔助數(shù)組,找尋最晚被調(diào)用的頁(yè)面,將其置換。記錄內(nèi)存狀態(tài),修改輔助數(shù)組,缺頁(yè)計(jì)數(shù)器加一。 第八步:頁(yè)面是否調(diào)用完成,否則轉(zhuǎn)第一步。具體見(jiàn)圖4最佳置換算法流程圖 開(kāi)始調(diào)入頁(yè)面記錄內(nèi)存狀態(tài)計(jì)數(shù)器加一更新輔助函數(shù)是頁(yè)面已存在否向后檢查內(nèi)存當(dāng)前頁(yè)面調(diào)用情況所有頁(yè)面都不會(huì)再度調(diào)用否是一個(gè)頁(yè)面會(huì)調(diào)用否否是兩個(gè)頁(yè)面會(huì)調(diào)用是否查找輔助數(shù)組得到最先進(jìn)入頁(yè)面通過(guò)輔助數(shù)組得到不會(huì)再調(diào)用的頁(yè)面通過(guò)輔助數(shù)組獲取最晚調(diào)用的頁(yè)面通過(guò)輔助數(shù)組得到另外兩個(gè)頁(yè)面中最先進(jìn)入的頁(yè)面置換頁(yè)面記錄內(nèi)存狀態(tài)計(jì)數(shù)器加一更新輔助函數(shù)頁(yè)面調(diào)用結(jié)束是結(jié)束 圖4 最佳置換算法流程圖 2.4界面設(shè)計(jì) 采用c# 設(shè)計(jì)windows窗體應(yīng)用程序,使用下拉列表框選擇算法,通過(guò)按鈕添加待調(diào)用的頁(yè)面。通過(guò)文本控件顯示模擬結(jié)果。顯示樣式:第一行:算法名稱(chēng); 第二行:調(diào)用頁(yè)面順序; 第三行至第五行顯示內(nèi)存在每調(diào)用一次頁(yè)面后的狀態(tài); 第六行:是否缺頁(yè); 最后一行顯示缺頁(yè)率; 第3章 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 3.1函數(shù)設(shè)計(jì) 1、添加按鈕功能實(shí)現(xiàn)代碼 主要功能:實(shí)現(xiàn)單擊一次添加一個(gè)調(diào)用頁(yè)面,并給出相應(yīng)的提示,如正在輸入的是第幾次調(diào)度頁(yè)面,在輸入為空時(shí)能夠彈出對(duì)話框提示用戶(hù),在輸入完成時(shí)為避免數(shù)組越界應(yīng)在輸入完成時(shí)隱藏;輸入過(guò)程中始終保證時(shí)輸入焦點(diǎn)。private void btnAdd_Click(object sender, EventArgs e){ if(txtAdd.Text!= “")//輸入不為空才能繼續(xù)輸入 { page_dd[i_add] = Convert.ToInt32(txtAdd.Text);/*將輸入值賦值給頁(yè)面數(shù)組*/ txtShow.Text += txtAdd.Text + ” “;/*顯示供用戶(hù)查閱*/ i_add++;txtAdd.Clear();/*清空*/ if(i_add == MaxN)//輸入結(jié)束時(shí) { txtAdd.ReadOnly = true;//不允許繼續(xù)輸入 btnAdd.Hide();//按鈕隱藏 return;} txtAdd.Focus();//設(shè)置為輸入焦點(diǎn) label2.Text = ”第“ +(i_add + 1)+ ”次調(diào)度頁(yè)面:“;/*提示用戶(hù)正在輸入的是第幾次調(diào)度頁(yè)面*/ } /*輸入為空則彈出對(duì)話框提示用戶(hù)輸入為空*/ else { MessageBox.Show(”請(qǐng)輸入調(diào)用頁(yè)面!“, ”輸入為空“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtAdd.Focus();} } 2、初始化函數(shù) 主要功能:將內(nèi)存一先進(jìn)先出方式填滿,并記錄每個(gè)頁(yè)面進(jìn)入時(shí)間,服務(wù)于先進(jìn)先出頁(yè)面置換算法和最佳置換算法。 void init(int[] a, int[] b,int []m1,int[]m2,int[]m3){ /*內(nèi)存未滿時(shí)循環(huán)*/ for(int i = 0;i < MaxM&&page_p //調(diào)整輔助數(shù)組將剛進(jìn)入內(nèi)存的頁(yè)面的對(duì)應(yīng)時(shí)間 OPT_F(O_Q ,i); count++;//缺頁(yè)計(jì)數(shù)器加一 m1[page_p] = b[0];//保存內(nèi)存狀態(tài) m2[page_p] = b[1];m3[page_p] = b[2];page_p++;//調(diào)用下一頁(yè)面 //檢查內(nèi)存中是否原先就有需要的頁(yè)面; for(int j = 0;j <= i&&page_p s[page_p] = 'F';//缺頁(yè)數(shù)組對(duì)應(yīng)數(shù)據(jù)更改 m1[page_p] = b[0];//記錄內(nèi)存狀態(tài) m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q,-1);//調(diào)整最佳置換算法輔助函數(shù) page_p++;//調(diào)用下一頁(yè) j =-1;//重新開(kāi)始尋找 } } } } 3、先進(jìn)先出頁(yè)面置換函數(shù) 主要功能:根據(jù)先進(jìn)先出算法要求在產(chǎn)生缺頁(yè)中斷時(shí)采用先進(jìn)先出方式確定淘汰頁(yè)面,并在每次頁(yè)面調(diào)用時(shí)記錄下內(nèi)存狀態(tài),缺頁(yè)次數(shù);采用循環(huán)隊(duì)列使得每次出隊(duì)的一定是最先進(jìn)入內(nèi)存的。 private void FIFO(int[] a, int[] b,int[]m1,int[]m2,int[]m3,char[] s){ int Fpage_p = page_p;int front, rear;//定義隊(duì)列對(duì)手和對(duì)尾指針并初始化 front = 0;rear = MaxM1;int sa;for(;Fpage_p < MaxN;Fpage_p++){ sa = 0;for(int i = 0;i < MaxM;i++)//檢查內(nèi)存中是否已有要調(diào)用的頁(yè)面。 { if(b[i] == a[Fpage_p]){ m1[Fpage_p] = b[0];m2[Fpage_p] = b[1];m3[Fpage_p] = b[2];s[Fpage_p] = 'F';sa = 1;break;} } if(sa == 0){ front =(front + 1)% MaxM; rear =(rear + 1)% MaxM;b[rear] = a[Fpage_p];m1[Fpage_p] = b[0];m2[Fpage_p] = b[1];m3[Fpage_p] = b[2];count++;} else continue;} } /*最近最久未使用算法輔助數(shù)組調(diào)整函數(shù)*/ private void LUR_I(int[] a,int e){ int temp;temp = a[e];a[e] = 1;for(int i = 0;i < MaxM;i++){ if(a[i] < temp && i!=e)a[i]++;} } /*最佳置換算法輔助數(shù)組調(diào)整函數(shù)*/ private void OPT_F(int[] a, int e){ if(e!=-1){ a[e] = 0;for(int i = 0;i < MaxM;i++){ if(i!= e)a[i]++;} } else for(int i = 0;i < MaxM;i++){ a[i]++;} } /*最近最久未使用算法*/ private void LRU(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s){ int[] L_Q = new int[MaxM]{3,3,3};int sa;for(int i = 0;i < MaxM && page_p < MaxN;i++){ b[i] = a[page_p];//調(diào)入內(nèi)存 count++;m1[page_p] = b[0];//保存內(nèi)存狀態(tài) m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, i);page_p++;for(int j = 0;j <= i && page_p < MaxN;j++){ if(b[j] == a[page_p]){ s[page_p] = 'F';m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, j);page_p++;j =-1;} } } for(;page_p < MaxN;page_p++){ sa = 0;for(int i = 0;i < MaxM;i++)//用的頁(yè)面。{ if(b[i] == a[page_p]){ m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];s[page_p] = 'F';LUR_I(L_Q, i);sa = 1;break;} } if(sa == 0){ 檢查內(nèi)存中是否已有要調(diào)40 for(int i = 0;i < MaxM;i++){ if(L_Q[i] == 3){ b[i] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, i);break;} } count++;} else continue;} } /*最佳置換算法*/ private void OPT(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s){ int sa;int O_p;int Ocount;int[] OPT_I=new int [MaxM ]{-1 ,-1 ,-1 };int[] OPT_J=new int [MaxM]{MaxN ,MaxN ,MaxN };for(;page_p < MaxN;page_p++){ for(int i = 0;i < MaxM;i++){ OPT_I[i] =-1;//刷新?tīng)顟B(tài)數(shù)組 OPT_J[i] = MaxN;} sa = 0;for(int i = 0;i < MaxM;i++)//檢查內(nèi)存中是否已有要調(diào)用的頁(yè)面。 { if(b[i] == a[page_p]){ m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q,-1); s[page_p] = 'F';sa = 1;break;} } if(sa == 0)//缺頁(yè) { Ocount = 0;for(int i = 0;i < MaxM;i++){ O_p = page_p + 1;for(;O_p < MaxN;O_p++){ if(b[i] == a[O_p]){ Ocount++;OPT_I[i] = 1;OPT_J[i] = O_p;break;} } } switch(Ocount){ case 0://全部頁(yè)面以后都不會(huì)再度調(diào)用 int temp = 0;for(int i = 0;i < MaxM;i++){ if(O_Q[i] > O_Q[temp])temp = i;} b[temp] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q ,temp);count++;break;case 1://有一個(gè)頁(yè)面將在以后調(diào)用 temp = 0;for(int i = 0;i < MaxM;i++){ if(OPT_I[i]!= 1 && O_Q[i] > O_Q[temp])temp = i; } b[temp] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q ,temp);count++;break;case 2: for(int i = 0;i < MaxM;i++){ if(OPT_I[i] ==-1){ b[i] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q, i);count++;} } break;case 3: int p = 0;for(int i = 0;i < MaxM;i++){ if(OPT_J[i] >OPT_J[p])p = i;} b[p] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q, p);count++;break;} } } } /*重置函數(shù)*/ private void btncz_Click(object sender, EventArgs e){ comboBox1.SelectedIndex = 0; txtAdd.Text = ”“;page_p = 0;i_add = 0;count = 0;//txtShow.Text = ”";for(int i = 0;i < MaxM;i++)Memery[i] =-1;for(int i = 0;i < MaxN;i++)s[i] = 'T';} } } 操 作 系 統(tǒng) 課 程 設(shè) 計(jì) 實(shí) 驗(yàn) 報(bào) 告 學(xué)院:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 班級(jí):計(jì)112 學(xué)號(hào):1113022032 姓名: 一、實(shí)驗(yàn)名稱(chēng): 用C++實(shí)現(xiàn)驅(qū)動(dòng)調(diào)度算法、頁(yè)面替換算法、銀行家算法、處理器調(diào)度算法 二、實(shí)驗(yàn)要求: 書(shū)寫(xiě)實(shí)驗(yàn)報(bào)告,包括的內(nèi)容有: (1)實(shí)驗(yàn)題目 (2)程序中使用的數(shù)據(jù)結(jié)構(gòu)及主要文字說(shuō)明 (3)帶有注釋的源程序 (4)執(zhí)行程序說(shuō)明,表明各進(jìn)程控制快的初始狀態(tài),以及各算法的運(yùn)行狀態(tài) (5)通過(guò)實(shí)驗(yàn)后的收獲與體會(huì)及對(duì)實(shí)驗(yàn)的改進(jìn)意見(jiàn)和見(jiàn)解 二、實(shí)驗(yàn)?zāi)康模?/p> 通過(guò)自己編程來(lái)實(shí)現(xiàn)各類(lèi)操作系統(tǒng)算法,進(jìn)一步理解操作系統(tǒng)的概念及含義,提高對(duì)操作系統(tǒng)的認(rèn)識(shí),同時(shí)提高自己的動(dòng)手實(shí)踐能力。加強(qiáng)我們對(duì)各類(lèi)算法的理解。 三、實(shí)驗(yàn)內(nèi)容: 1、實(shí)現(xiàn)頁(yè)面替換算法 (1)FIFO 先進(jìn)先出頁(yè)面替換算法 (2)LRU最近最少使用頁(yè)面替換算法 (3)LFU最少使用頻率頁(yè)面替換算法 2、銀行家算法 3、實(shí)現(xiàn)驅(qū)動(dòng)調(diào)度算法 (1)先來(lái)先服務(wù)算法 (2)電梯算法 (3)掃描算法 4、實(shí)現(xiàn)處理器調(diào)度 (1)先進(jìn)先出處理器調(diào)度 (2)時(shí)間片輪轉(zhuǎn)法 (3)優(yōu)先級(jí)調(diào)度 四、實(shí)驗(yàn)原理: 1、頁(yè)面替換算法 先進(jìn)先出頁(yè)面置換算法:該算法總是淘汰最先進(jìn)入內(nèi)存的頁(yè)面,即選擇在內(nèi)存中駐留時(shí)間最久的頁(yè)面加以淘汰。將已調(diào)入內(nèi)存的頁(yè)面按先后次序鏈接成一個(gè)隊(duì)列,將最先調(diào)入的頁(yè)面與新頁(yè)面進(jìn)行置換 最近最久未使用置換算法:該算法是利用“最近的過(guò)去”作為“最近的將來(lái)”,將最近最久未使用的頁(yè)面加以淘汰。將已調(diào)入內(nèi)存的頁(yè)面按先后順序鏈接成一個(gè)隊(duì)列,為每一個(gè)頁(yè)面增加一個(gè)訪問(wèn)字段,用來(lái)記錄一個(gè)頁(yè)面自上次被訪問(wèn)以來(lái)所經(jīng)歷的是時(shí)間t,當(dāng)需淘汰一個(gè)頁(yè)面時(shí),選擇現(xiàn)有頁(yè)面中其t值最大,即最近最久未使用的頁(yè)面加以淘汰 2、銀行家算法 先對(duì)用戶(hù)提出的請(qǐng)求進(jìn)行合法性檢查,即檢查請(qǐng)求的是不大于需要的,是否不大于可利用的。若請(qǐng)求合法,則進(jìn)行試分配。最后對(duì)試分配后的狀態(tài)調(diào)用安全性檢查算法進(jìn)行安全性檢查。若安全,則分配,否則,不分配,恢復(fù)原來(lái)狀態(tài),拒絕申請(qǐng)。 3、驅(qū)動(dòng)調(diào)度算法 先進(jìn)先出算法(FIFO):總是嚴(yán)格按時(shí)間順序?qū)Υ疟P(pán)請(qǐng)求予以處理。算法實(shí)現(xiàn)簡(jiǎn)單、易于理解并且相對(duì)公平,不會(huì)發(fā)生進(jìn)程餓死現(xiàn)象。但該算法可能會(huì)移動(dòng)的柱面數(shù)較多并且會(huì) 經(jīng)常更換移動(dòng)方向,效率有待提高 電梯調(diào)度算法:總是將一個(gè)方向上的請(qǐng)求全部處理完后,才改變方向繼續(xù)處理其他請(qǐng)求。 掃描算法(scan algorithm):總是從最外向最內(nèi)(或最內(nèi)向最外)進(jìn)行掃描,然后在從最內(nèi)向最外(或最外向最內(nèi))掃描。該算法與電梯調(diào)度算法的區(qū)別是電梯調(diào)度在沒(méi)有最外或最內(nèi)的請(qǐng)求時(shí)不會(huì)移動(dòng)到最外或最內(nèi)柱面。 4、處理器調(diào)度算法 先進(jìn)先出處理器調(diào)度:按照作業(yè)進(jìn)入系統(tǒng)后備工作隊(duì)列的先后次序來(lái)挑選作業(yè),先進(jìn)入系統(tǒng)的作業(yè)將優(yōu)先被挑選進(jìn)入主存,創(chuàng)建用戶(hù)進(jìn)程,分配所需資源,然后移入就緒隊(duì)列。 時(shí)間片輪轉(zhuǎn)法調(diào)度算法:調(diào)度次序每次把CPU分配給就緒隊(duì)列進(jìn)程/線程使用規(guī) 定的時(shí)間間隔,就緒隊(duì)列中每個(gè)進(jìn)程/線程輪流的運(yùn)行一個(gè)時(shí)間片,當(dāng)時(shí)間片耗盡時(shí),就強(qiáng)迫當(dāng)前運(yùn)行進(jìn)程/線程讓出處理器,轉(zhuǎn)而排列到就緒隊(duì)列尾部,等候下一輪調(diào)度。 優(yōu)先級(jí)調(diào)度:根據(jù)確定的優(yōu)先級(jí)來(lái)選取進(jìn)程/線程,總是選擇就緒隊(duì)列中的優(yōu)先 級(jí)最高者投入運(yùn)行,即優(yōu)先級(jí)越高,先被調(diào)用。 五、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 對(duì)操作系統(tǒng)的各類(lèi)算法設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)如下: 頁(yè)面替換算法:void FIFO();void LRU();void LFU(); 銀行家算法:void Init()初始化算法 void Bank()銀行家算法 bool Safe()安全性算法 驅(qū)動(dòng)調(diào)度算法: struct MagneticHead//磁頭構(gòu)成{ int site; int count; bool direct; }; struct Range//磁盤(pán)磁道范圍 { int mStart; int mEnd; }; struct RequestList//請(qǐng)求序列 { int site; bool state; }; struct Data//基本數(shù)據(jù)集合{ MagneticHead magneticHead; RequestList *requestList; int *executeList; Range range; int length; }; 處理器調(diào)度: typedef struct pcb//時(shí)間片輪轉(zhuǎn)法 { char pname[N]; int runtime; int arrivetime; char state; struct pcb*next; }PCB; typedef struct PCB1//先進(jìn)先出服務(wù) { char ID[3];//進(jìn)程號(hào) char name[10];//進(jìn)程名 char state;//運(yùn)行狀態(tài) floatarrivetime;//到達(dá)時(shí)間 floatstarttime;//進(jìn)程開(kāi)始時(shí)間 floatfinishtime;//進(jìn)程結(jié)束時(shí)間 floatservicetime;//服務(wù)時(shí)間 float turnaroundtime;//周轉(zhuǎn)時(shí)間 float weightedturnaroundtime;//帶權(quán)周轉(zhuǎn)時(shí)間 struct PCB1 *next;//指向下個(gè)進(jìn)程 }pcb1; struct pcb2 {優(yōu)先級(jí)調(diào)度 char name[10]; char state; int super; int ntime; int rtime; struct pcb2* link; }*ready=NULL,*d; typedef struct pcb2 PCB2; 六、課程設(shè)計(jì)總結(jié) 在本次課程設(shè)計(jì)中,就是講平時(shí)所做的實(shí)驗(yàn)結(jié)合起來(lái),實(shí)現(xiàn)操作系統(tǒng)的各類(lèi)算法,了解操作系統(tǒng)的運(yùn)行原理以及其基本概念,更好的將操作系統(tǒng)的原理很好的展現(xiàn)出來(lái)。同時(shí),在本次實(shí)驗(yàn)中遇到了很多問(wèn)題,需要我們仔細(xì)的檢查和修改。其次,實(shí)驗(yàn)中為了能更好的體現(xiàn)各類(lèi)算法的運(yùn)行情況,需要做一個(gè)清晰的界面,以能清楚地看出運(yùn)行結(jié)果。第二篇:計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)教學(xué)大綱
第三篇:計(jì)算機(jī)操作系統(tǒng) 課程設(shè)計(jì)報(bào)告 銀行家算法
第四篇:操作系統(tǒng)課程設(shè)計(jì)報(bào)告
第五篇:操作系統(tǒng)課程設(shè)計(jì)報(bào)告