-
大小: 408KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-05-09
- 語言: 其他
- 標(biāo)簽:
資源簡介
這是一個自己完成軟件工程的操作系統(tǒng)課程課程設(shè)計(jì)題目:此程序用于模擬虛擬磁盤頁面置換算法,實(shí)現(xiàn)了FIFO頁面置換算法和LRU頁面置換算法,獲得課程設(shè)計(jì)優(yōu)秀的好成績

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#define?N?8??//?進(jìn)程需要的主存頁數(shù)
#define?M?4 ??//分配給進(jìn)程的主存物理塊數(shù)
static?int?P[M]={0000}; //用數(shù)組模擬?FIFO?算法中的隊(duì)列(使用循環(huán)隊(duì)列)
static?int?head=0;
struct
{int??pagenumber;??//頁號
?int??flag;??? //表示該頁是否在主存,“1“表示在主存,“0“表示不在主存
?int??memnumber;?? //該頁所在主存塊的塊號
?int??write;??? //該頁是否被修改過,“1“表示修改過,“0“表示沒有修改過
?int??disknumber;?? //該頁存放在磁盤上的位置,即磁盤塊號
}page[N];?? //頁表定義
struct??instr
{
char?opertaor[10];
int?pnumber;
int?offset;
}instruction[12];
void?initial(void);
int?do_mmap(int); //模擬地址轉(zhuǎn)換
void?do_page_fault_FIFO(int); //缺頁中斷處理程序
void?do_page_fault_LRU(int); //缺頁中斷處理程序
void?run_first_instructon(int); //執(zhí)行進(jìn)程的第一條指令
void?run_a_instruction(int); //CPU執(zhí)行一條指令
void?print_page_and_FIFOqueue(void); //輸出頁表和FIFO隊(duì)列
void?print_page_and_LRUqueue(void); ????//輸出頁表和LRU隊(duì)列
void?initial_instruction(void);
int?do_mmap(int?memnumberint?disknumber);
int?main()
{
int?iindex;
int?laddress?paddress; //邏輯地址,物理地址
int?pagenumber?ad; //頁號,頁內(nèi)地址和物理塊號
instr?newinstr;
char?chselect;
printf(“\n****此程序用于模擬虛擬磁盤頁面置換算法****\n“);
printf(“\n****程序可以模擬FIFO和LRU兩種頁面置換算法*****“);
printf(“\n****1、輸入字母‘F‘或‘f‘?選擇模擬FIFO頁面置換算法*****“);?
printf(“\n****2、輸入字母‘L‘或‘l‘?選擇模擬LRU頁面置換算法*****“);?
printf(“\n****你的選擇是:“);
scanf(“%c“&select);?
initial();
if(select==‘L‘?||?select==‘l‘)
? print_page_and_LRUqueue();
? else
? print_page_and_FIFOqueue();
????initial_instruction();??????//初始化模擬的指令
????index=0;
???? printf(“\n?執(zhí)行第??%d??條指令\n“index+1);
???? printf(“指令:???操作?????頁號????頁內(nèi)地址\n“);
???? printf(“?????????%s????????%d?????????%d\n\n“instruction[index].opertaorinstruction[index].pnumberinstruction[index].offset);
????do{?
????
pagenumber=instruction[index].pnumber;
if?(page[pagenumber].flag==1)
{???
paddress=do_mmap(page[pagenumber].memnumberinstruction[index].offset);
printf(“\n當(dāng)前指令被執(zhí)行,指令的物理地址:%X\n“paddress);
if(strcmp(instruction[index].opertaor“save“)==0)
{
page[pagenumber].write=1;
}
}
else
{???if(select==‘L‘?||?select==‘l‘)
do_page_fault_LRU(pagenumber);
else
do_page_fault_FIFO(pagenumber);
}
if(select==‘L‘?||?select==‘l‘)
? print_page_and_LRUqueue();
? else
? print_page_and_FIFOqueue();
index++;
printf(“下一條指令是12條指令中的第?%d?條\n“index+1);
???? printf(“指令:???操作?????頁號????頁內(nèi)地址\n“);
???? printf(“?????????%s????????%d?????????%d\n\n“instruction[index].opertaorinstruction[index].pnumberinstruction[index].offset);
printf(“是否需要執(zhí)行此條指令?(y/n):“);?
fflush(stdin);??//?
scanf(“%c“&ch);//?清除鍵盤緩沖區(qū),linux系統(tǒng)可能不好用?
if(ch==‘n‘?||?ch==‘N‘){
break;
}?
?????}while(index<12);
?????return?0;
}
//手工初始化頁表和p[M]隊(duì)列
void?initial(void)
{
int?i;
?????//?N?進(jìn)程的需要的頁數(shù)?
?????printf(“------------(預(yù)裝入前四個頁面)--------------\n“);
for(i=0;?i page[i].pagenumber=i;
if(i printf(“輸入頁號為?%d?所在主存的物理塊號:“i);?
s
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????7912??2018-06-29?20:49??pagemanager\main.cpp
?????文件?????843121??2018-06-29?20:39??pagemanager\mingw5\main.o
?????文件????1328287??2018-06-29?20:39??pagemanager\mingw5\pagemanager.exe
?????文件??????14453??2018-06-29?20:50??pagemanager\pagemanager.cfp
?????文件????????122??2018-06-29?13:04??pagemanager\pagemanager.cfpg
?????文件?????????51??2018-06-29?20:52??pagemanager\readme.txt
?????目錄??????????0??2018-06-29?20:39??pagemanager\mingw5
?????目錄??????????0??2018-06-29?20:50??pagemanager
-----------?---------??----------?-----??----
??????????????2193946????????????????????8
評論
共有 條評論