资源简介
这是一个自己完成软件工程的操作系统课程课程设计题目:此程序用于模拟虚拟磁盘页面置换算法,实现了FIFO页面置换算法和LRU页面置换算法,获得课程设计优秀的好成绩
代码片段和文件信息
#include
#include
#include
#include
#include
#define N 8 // 进程需要的主存页数
#define M 4 //分配给进程的主存物理块数
static int P[M]={0000}; //用数组模拟 FIFO 算法中的队列(使用循环队列)
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); //模拟地址转换
void do_page_fault_FIFO(int); //缺页中断处理程序
void do_page_fault_LRU(int); //缺页中断处理程序
void run_first_instructon(int); //执行进程的第一条指令
void run_a_instruction(int); //CPU执行一条指令
void print_page_and_FIFOqueue(void); //输出页表和FIFO队列
void print_page_and_LRUqueue(void); //输出页表和LRU队列
void initial_instruction(void);
int do_mmap(int memnumberint disknumber);
int main()
{
int iindex;
int laddress paddress; //逻辑地址,物理地址
int pagenumber ad; //页号,页内地址和物理块号
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 执行第 %d 条指令\n“index+1);
printf(“指令: 操作 页号 页内地址\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当前指令被执行,指令的物理地址:%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“);
printf(“ %s %d %d\n\n“instruction[index].opertaorinstruction[index].pnumberinstruction[index].offset);
printf(“是否需要执行此条指令?(y/n):“);
fflush(stdin); //
scanf(“%c“&ch);// 清除键盘缓冲区,linux系统可能不好用
if(ch==‘n‘ || ch==‘N‘){
break;
}
}while(index<12);
return 0;
}
//手工初始化页表和p[M]队列
void initial(void)
{
int i;
// N 进程的需要的页数
printf(“------------(预装入前四个页面)--------------\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
- 上一篇:shop二次开发说明文档
- 下一篇:STC15W-408AS_EEPROM与串口通信
评论
共有 条评论