久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

計(jì)算機(jī)操作系統(tǒng) 課程設(shè)計(jì)報(bào)告(推薦)

時(shí)間:2019-05-15 10:02:51下載本文作者:會(huì)員上傳
簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《計(jì)算機(jī)操作系統(tǒng) 課程設(shè)計(jì)報(bào)告(推薦)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《計(jì)算機(jī)操作系統(tǒng) 課程設(shè)計(jì)報(bào)告(推薦)》。

第一篇:計(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 #include using namespace std;typedef struct PNode {

// 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<name<<“ 進(jìn)程”<

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 #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 #include #define LEN sizeof(struct area)#define LEN_POINTER_LIST sizeof(struct AreaPointer_list)struct area{

};//分區(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 #include #include #include #include //#include using namespace std;const int FDF=-2;const int FFF=-1;const int N=100;//存儲(chǔ)空間(FAT表長(zhǎng)度)int fnum;//文件數(shù)量 struct FILEINFO{

};

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表”<>o;switch(o){

} case 1: cout<<“輸入文件名:”;

cin>>tmpname;

cout<<“輸入文件長(zhǎng)度:”;cin>>tmplength;

write(tmpname,tmplength);break;cin>>tmpname;int insertpoint;

cout<<“輸入插入點(diǎn):”<>insertpoint;

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 #include #include void FCFS(int array[],int m)// 先來(lái)先服務(wù)算法 {

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>array[i];} do {

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é)大綱

《計(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ì)算機(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 #include #include #include /*用到了getch()*/ #define M 5 /*進(jìn)程數(shù)*/ #define N 3 /*資源數(shù)*/ #define FALSE 0 #define TRUE 1

/*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)更加方便。

第四篇:操作系統(tǒng)課程設(shè)計(jì)報(bào)告

課程設(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ì)報(bào)告

操 作 系 統(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ì)報(bào)告(推薦)word格式文檔
下載計(jì)算機(jī)操作系統(tǒng) 課程設(shè)計(jì)報(bào)告(推薦).doc
將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
點(diǎn)此處下載文檔

文檔為doc格式


聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

相關(guān)范文推薦

    操作系統(tǒng)課程設(shè)計(jì)報(bào)告

    操作系統(tǒng)課程設(shè)計(jì)報(bào)告 專(zhuān) 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 學(xué) 號(hào): 姓 名: 提交日期: 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 【設(shè)計(jì)目的】 (1)本實(shí)驗(yàn)的目的是通過(guò)一個(gè)簡(jiǎn)單多用戶(hù)文件系統(tǒng)的設(shè)計(jì),加深理解文件系......

    操作系統(tǒng)課程設(shè)計(jì)

    湖北民族學(xué)院信息工程學(xué)院11級(jí)計(jì)算機(jī)專(zhuān)業(yè)操作系統(tǒng)課程設(shè)計(jì) (操作系統(tǒng)課程設(shè)計(jì))連續(xù)動(dòng)態(tài)分區(qū)內(nèi)存 管理模擬實(shí)現(xiàn) 學(xué)生姓名: 韓 慧 學(xué)生學(xué)號(hào): 031140312 班 級(jí): 031140--3 0311401、......

    操作系統(tǒng)課程設(shè)計(jì)

    長(zhǎng)春理工大學(xué) 軟件學(xué)院 0813111班 27號(hào) 姓名:丁為勝 一. 概述 1、課程設(shè)計(jì)目的及任務(wù)課程設(shè)計(jì)地點(diǎn)及要求 每個(gè)學(xué)生一臺(tái)微機(jī),需要安裝windows98或windows2000操作系統(tǒng),配備VC、VB......

    操作系統(tǒng)課程設(shè)計(jì)

    1 引言 操作系統(tǒng)是計(jì)算機(jī)科學(xué)與技術(shù)專(zhuān)業(yè)的主要專(zhuān)業(yè)基礎(chǔ)課和主干課。操作系統(tǒng)對(duì)計(jì)算機(jī)系統(tǒng)資源實(shí)施管理,是所有其他軟件與計(jì)算機(jī)硬件的唯一接口,所有用戶(hù)在使用計(jì)算機(jī)時(shí)都要得......

    操作系統(tǒng)課程設(shè)計(jì)

    操作系統(tǒng)課程設(shè)計(jì) 注意事項(xiàng): 0. 請(qǐng)每位同學(xué)必須按時(shí)提交課程設(shè)計(jì)報(bào)告(包括電子版和紙質(zhì)版),算入期末成績(jī) 1. 在三個(gè)題目中選擇一個(gè) 2. 如果選擇題目(一)進(jìn)程調(diào)度算法,要求實(shí)現(xiàn)其中2......

    嵌入式操作系統(tǒng)程課程設(shè)計(jì)報(bào)告

    目錄 一、 實(shí)習(xí)任務(wù)和目的????????????1 二、實(shí)習(xí)基本要求?????????????1 三、實(shí)習(xí)題目???????????????1 四、實(shí)習(xí)地點(diǎn)???......

    重郵操作系統(tǒng)課程設(shè)計(jì)報(bào)告

    操作系統(tǒng)課程設(shè)計(jì) 班級(jí): 姓名:學(xué)號(hào): 時(shí)間: 年 月 日 指導(dǎo)教師: 實(shí)驗(yàn)題目: 操作系統(tǒng)課程設(shè)計(jì) 實(shí)驗(yàn)?zāi)康模?1、 掌握Linux操作系統(tǒng)安裝的一般方法 2、 掌握Linux 內(nèi)核升級(jí)一般方法 3......

    銀行家算法《操作系統(tǒng)》課程設(shè)計(jì)報(bào)告

    《操作系統(tǒng)》課程設(shè)計(jì)報(bào)告課題:銀行家算法專(zhuān)業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名班級(jí)計(jì)算機(jī)學(xué)號(hào)指導(dǎo)教師信息工程學(xué)院一、實(shí)驗(yàn)要求和實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)?zāi)康模罕菊n程設(shè)計(jì)是學(xué)生學(xué)習(xí)完《操作系......

主站蜘蛛池模板: 日本老妇人乱xxy| 午夜视频体内射.com.com| 久久精品丝袜高跟鞋| 成人无码无遮挡很h在线播放| 伊人久久大香线焦av综合影院| 精品国产av一区二区果冻传媒| 国产成人精品无码免费看夜聊软件| 无翼乌口工全彩无遮挡h全彩| 亚洲精品无码aⅴ中文字幕蜜桃| 国产欧美日韩专区发布| 欧美顶级metart裸体全部自慰| 色偷偷av一区二区三区| 午夜寂寞视频无码专区| 小宝极品内射国产在线| 精品无码成人久久久久久| 成人无码视频| 久久免费看少妇高潮v片特黄| 性做久久久久久久免费看| 好吊色欧美一区二区三区四区| 在线黑人抽搐潮喷| 97人人超碰国产精品最新o| 国产成人综合久久二区| 国产动作大片中文字幕| 亚洲精品无码不卡在线播放he| 国产超碰人人爽人人做av| 国产精品久久久亚洲| 99久久婷婷国产综合精品电影| 国产做爰又粗又大又爽动漫| 亚洲欧美日韩国产另类电影| 国内精品一区二区福利视频| 久久亚洲精品无码va大香大香| 香蕉伊蕉伊中文视频在线| 欧美亚洲日本国产黑白配| 免费国产在线精品一区二区三区| 在线看免费无码的av天堂| 国产香蕉尹人在线观看视频| av无码免费岛国动作片片段欣赏网| 国产精品亚洲精品一区二区| 狂猛欧美激情性xxxx大豆行情| 日本精品一区二区三区在线视频| 亚洲人成网亚洲欧洲无码|