- #include<stdio.h>
- #include<string.h>
- #include<iostream.h>
- const int MAXSIZE=1000;//定义最大页面数
- const int MAXQUEUE=3;//定义页框数
- typedef struct node{
- int loaded;
- int hit;
- }page;
- page pages[MAXQUEUE]; //定义页框表
- int queue[MAXSIZE];
- int quantity;
- //初始化结构函数
- void initial()
- {
- int i;
- for(i=0;i<MAXQUEUE;i++){
- pages[i].loaded=-1;
- pages[i].hit=0;
- }
- for(i=0;i<MAXSIZE;i++){
- queue[i]=-1;
- }
- quantity=0;
- }
- //初始化页框函数
- void init()
- {
- int i;
- for(i=0;i<MAXQUEUE;i++){
- pages[i].loaded=-1;
- pages[i].hit=0;
- }
- }
- //读入页面流
- void readData()
- {
- FILE *fp;
- char fname[20];
- int i;
- cout<<"请输入页面流文件名:";
- cin>>fname;
- if((fp=fopen(fname,"r"))==NULL){
- cout<<"错误,文件打不开,请检查文件名";
- }
- else{
- while(!feof(fp)){
- fscanf(fp,"%d ",&queue[quantity]);
- quantity++;
- }
- }
- cout<<"读入的页面流:";
- for(i=0;i<quantity;i++){
- cout<<queue[i]<<" ";
- }
- }
- //FIFO调度算法
- void FIFO()
- {
- int i,j,p,flag;
- int absence=0;
- p=0;
- cout<<endl<<"----------------------------------------------------"<<endl;
- cout<<"FIFO调度算法页面调出流:";
- for(i=0;i<quantity;i++){
- flag=0;
- for(j=0;j<MAXQUEUE;j++){
- if(pages[j].loaded==queue[i]){
- flag=1;
- }
- }
- if(flag==0){
- if(absence>=MAXQUEUE){
- cout<<pages[p].loaded<<" ";
- }
- pages[p].loaded=queue[i];
- p=(p+1)%MAXQUEUE;
- absence++;
- }
- }
- absence-=MAXQUEUE;
- cout<<endl<<"总缺页数:"<<absence<<endl;
- }
- //最近最少使用调度算法(LRU)
- void LRU()
- {
- int absence=0;
- int i,j;
- int flag;
- for(i=0;i<MAXQUEUE;i++){
- pages[i].loaded=queue[i];
- }
- cout<<endl<<"----------------------------------------------------"<<endl;
- cout<<"最近最少使用调度算法(LRU)页面流:";
- for(i=MAXQUEUE;i<quantity;i++){
- flag=-1;
- for(j=0;j<MAXQUEUE;j++){
- if(queue[i]==pages[j].loaded){
- flag=j;
- }
- }
- //CAUTION pages[0]是队列头
- if(flag==-1){
- //缺页处理
- cout<<pages[0].loaded<<" ";
- for(j=0;j<MAXQUEUE-1;j++){
- pages[j]=pages[j+1];
- }
- pages[MAXQUEUE-1].loaded=queue[i];
- absence++;
- }
- else{
- //页面已载入
- pages[quantity]=pages[flag];
- for(j=flag;j<MAXQUEUE-1;j++){
- pages[j]=pages[j+1];
- }
- pages[MAXQUEUE-1]=pages[quantity];
- }
- }
- cout<<endl<<"总缺页数:"<<absence<<endl;
- }
- //最近最不常用调度算法(LFU)
- void LFU()
- {
- int i,j,p;
- int absence=0;
- int flag;
- for(i=0;i<MAXQUEUE;i++){
- pages[i].loaded=queue[i];
- }
- cout<<endl<<"----------------------------------------------------"<<endl;
- cout<<"最近最不常用调度算法(LFU)页面流:";
- for(i=MAXQUEUE;i<quantity;i++){
- flag=-1;
- for(j=0;j<MAXQUEUE;j++){
- if(pages[j].loaded==queue[i]){
- flag=1;
- pages[j].hit++;
- }
- }
- if(flag==-1){
- //缺页中断
- p=0;
- for(j=0;j<MAXQUEUE;j++){
- if(pages[j].hit<pages[p].hit){
- p=j;
- }
- }
- cout<<pages[p].loaded<<" ";
- pages[p].loaded=queue[i];
- for(j=0;j<MAXQUEUE;j++){
- pages[j].hit=0;
- }
- absence++;
- }
- }
- cout<<endl<<"总缺页数:"<<absence<<endl;
- }
- //第二次机会算法
- void second()
- {
- int i,j,t;
- int absence=0;
- int flag,temp;
- for(i=0;i<MAXQUEUE;i++){
- pages[i].loaded=queue[i];
- }
- cout<<endl<<"----------------------------------------------------"<<endl;
- cout<<"第二次机会算法页面流:";
- for(i=MAXQUEUE;i<quantity;i++){
- flag=-1;
- for(j=0;j<MAXQUEUE;j++){
- if(pages[j].loaded==queue[i]){
- flag=1;
- pages[j].hit=1;
- }
- }
- if(flag==-1){
- //缺页处理
- t=0;
- while(t==0){
- if(pages[0].hit==0){
- cout<<pages[0].loaded<<" ";
- for(j=0;j<MAXQUEUE-1;j++){
- pages[j]=pages[j+1];
- }
- pages[MAXQUEUE-1].loaded=queue[i];
- pages[MAXQUEUE-1].hit=0;
- t=1;
- }
- else{
- temp=pages[0].loaded;
- for(j=0;j<MAXQUEUE-1;j++){
- pages[j]=pages[j+1];
- }
- pages[MAXQUEUE-1].loaded=temp;
- pages[MAXQUEUE-1].hit=0;
- }
- }
- absence++;
- }
- }
- cout<<endl<<"总缺页数:"<<absence<<endl;
- }
- //显示版权信息函数
- void version()
- {
- cout<<endl<<endl;
- cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
- cout<<" ┃ 虚拟存储管理器的页面调度 ┃"<<endl;
- cout<<" ┠───────────────────────┨"<<endl;
- cout<<" ┃ (c)All Right Reserved Neo ┃"<<endl;
- cout<<" ┃sony006@163.com ┃"<<endl;
- cout<<" ┃version 2004 build 1122┃"<<endl;
- cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
- cout<<endl<<endl;
- }
- void main()
- {
- version();
- initial();
- readData();
- FIFO();
- init();
- LRU();
- init();
- LFU();
- init();
- second();
- }
- //该片段来自于http://www.codesnippet.cn/detail/100120131504.html
来源: http://www.codesnippet.cn/detail/100120131504.html