• 大小: 408KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-09
  • 语言: 其他
  • 标签:

资源简介

这是一个自己完成软件工程的操作系统课程课程设计题目:此程序用于模拟虚拟磁盘页面置换算法,实现了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


评论

共有 条评论