虚拟内存的页面置换

输出结果格式仿照教材,含Clock算法

#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
#define MaxNumber 100
#define MAX_NUM 5
#define MAX_NUM_PROC 512
//进程结构体
struct CList
{
    int data;
    int flag;
}CLOCK_list[MAX_NUM];
int test[MAX_NUM_PROC][MAX_NUM_PROC];
int PageOrder[MaxNumber];  //页面序列
int Simulate[MaxNumber][MaxNumber];//存放输出的数组 
int PageCount[MaxNumber]; //当前内存距离下一次出现的距离
int BlockNum;            //物理块数
int PageNum; //页面个数
int LackNum; //缺页数 
double  LackPageRate;   //缺页率
bool found; //页面是否命中 
int timeOfLRU[MaxNumber];   //记录物理块中各个页面最近使用时间 
int memoryPage[MaxNumber];   //虚拟队列
int choose;
//void input();  //输入
void initial();  //初始化物理块
void FIFO();
void OPT();
void LRU();
void CLOCK();
void chooseAlgorithm();//选择算法
void output(); //输出 

int main() {
    printf("请输入物理块数:"); 
    scanf("%d",&BlockNum);
    printf("请输入页面序列长度:"); 
    scanf("%d",&PageNum);
    printf("请输入页面序列:");  
    for (int i = 0; i < PageNum; i++)
    {
        //readData >> PageOrder[i];
        scanf("%d",&PageOrder[i]);
    }
    chooseAlgorithm();
    return 0;
}

void initial() {//初始化 
    int i, j, k;
    int z = 0;	//判断初始化物理块是否填满
    bool found;
    LackNum = BlockNum;
    LackPageRate = 0.0;
    for (int i = 0; i < PageNum; i++) {
        PageCount[i] = 0;  //初始化距离
        memoryPage[i] = -1;  //初始化队列
    }
    for (int i = 0; i < BlockNum; i++) {
        for (int j = 0; j < PageNum; j++) {
            Simulate[i][j] = -1;//初始化
        }
    }

    for (int i = 0; i < PageNum; i++) {//初始化物理块
        found = false;
        timeOfLRU[i] = 0;
        for (int j = 0; j < BlockNum; j++) 
		{
            if (memoryPage[j] == PageOrder[i])//页面命中
            {
                found = true;
                for (int w=0;w<=z;w++)
                {
                	Simulate[w][i] = memoryPage[w];
				}

            }
 
        }
        
        if (!found) {  //当有新的进程进入到队列时,便计算其对应的距离
            memoryPage[z] = PageOrder[i];//小于物理块数时,页面顺序进入队列
            for (int j = 0; j <= z; j++) 
			{
                Simulate[j][i] = memoryPage[j];//保存当前序列的值
            }
            z++;
            for (int k = 0; k < i; k++) {
                timeOfLRU[k]++;   //之前的页面对应的时间+1
            }
        }
        else {
            timeOfLRU[i] = 0;  //重新更新为0,表示最近刚刚使用
        }
        if (z == BlockNum) 
		{ //物理块被填满,结束循环 
            break;
        }
    }
}




void OPT() {
    cout << "OPT算法调度结果为:" << endl;
    int i, j, s, k, m, t;
    initial();
    int distance;   //表示队列每个值距离下一次访问的距离
    int point;  //指向最长时间未被访问的下标
    for (i = BlockNum; i < PageNum; i++) {
        found = false;
        for (k = 0; k < BlockNum; k++) {
            if (memoryPage[k] == PageOrder[i]) {  //页面命中
                found = true;
                	for(int w=0;w<BlockNum;w++)
              	{
              		Simulate[w][i] = memoryPage[w];
				}
	
            }
  
        }
			if (!found) {
            LackNum++;
            //计算当前队列每一页对应的下一次出现的距离
            for (s = 0; s < BlockNum; s++) {
                distance = 1;
                for (t = i; t < PageNum; t++) {   //向后找离他最远的
                    if (memoryPage[s] != PageOrder[t])
                        distance++;
                    else
                        break;
                }
                PageCount[s] = distance;//当前内存距离下一次出现的距离
            }
            //向后比较队列内最长时间不被访问的并淘汰,置换页面
            point = 0;
            for (m = 1; m < BlockNum; m++) {
                if (PageCount[point] < PageCount[m])
                    point = m;
            }
            memoryPage[point] = PageOrder[i];
            for (j = 0; j <= BlockNum; j++) {
                Simulate[j][i] = memoryPage[j];//保存当前序列的值
            }
        }
    }
    output();
    LackPageRate = (LackNum * 1.0) / PageNum;
    //cout << "缺页数:: " << LackNum << endl;
    //cout << "缺页率:: " << LackPageRate << endl;
}

void FIFO() {
    cout << "FIFO算法调度结果为:" << endl;
    initial();
    int i, j, k;
    int point = 0;
    //分配内存
    for (int i = BlockNum; i < PageNum; i++) {
        found = false;
        for (int k = 0; k < BlockNum; k++) {
            if (memoryPage[k] == PageOrder[i]) {   //页面命中
                found = true;
               // break;   
            }
            Simulate[k][i] = memoryPage[k];
            if(k==0&&found==true)
            {
            	for(int w=1;w<BlockNum;w++)
            	{
            		Simulate[w][i] = memoryPage[w];
				}
            
			}
        }

        if (!found) {   //如果页面不在队列中,则进行相应的处理
            LackNum++;  //缺页数加1
            memoryPage[point] = PageOrder[i];//页面替换队列中最老的
            for (int j = 0; j <= BlockNum; j++) {
                Simulate[j][i] = memoryPage[j];//保存当前序列的值
            }
            point++;//后移
            if (point == BlockNum)//当指向队尾时后,重新指向队首
                point = 0;
        }
    }
    output();//输出物理块状态
    LackPageRate = (LackNum * 1.0) / PageNum;
    //cout << "缺页数:: " << LackNum << endl;
    //cout << "缺页率:: " << LackPageRate << endl;
}

void LRU() {
    cout << "LRU算法调度结果为:" << endl;
    int i, j, s, k;
    initial();
    int point;//指向最长时间未被访问的下标

    for (i = 0; i < PageNum; i++)//从第一个开始扫描,确保时间记录无误 
	 {
        found = false;
        for (k = 0; k < BlockNum; k++) {
            if (memoryPage[k] == PageOrder[i])   //页面命中
                found = true;
                if(i>=BlockNum)
                {
                	  for(int w=0;w<BlockNum;w++)
                {
                	Simulate[w][i] = memoryPage[w];
				}
				}
              
        }

        if (!found) {
            LackNum++;
            //向前比较队列内最长时间不被访问的并淘汰,置换页面
            point = 0;
            
            for (j = 1; j < BlockNum; j++) {
                if (timeOfLRU[point] < timeOfLRU[j])
                    point = j;
            }

            for (s = 0; s < BlockNum; s++) {
                if (memoryPage[s] != memoryPage[point])
                    timeOfLRU[s]++;
            }

            memoryPage[point] = PageOrder[i];
            for (j = 0; j <= BlockNum; j++) {
                Simulate[j][i] = memoryPage[j];//保存当前序列的值
            }
            timeOfLRU[point] = 0;
        }

        else { 
		//对命中块进行处理  
            for (s = 0; s < BlockNum; s++) {
                if (memoryPage[s] != PageOrder[i])
                    timeOfLRU[s]++;
                else
                    timeOfLRU[s] = 0;
            }
        }
    }
    output();

    LackPageRate = (LackNum * 1.0) / PageNum;
    //cout << "缺页数:: " << LackNum << endl;
    //cout << "缺页率:: " << LackPageRate << endl;
}


void CLOCK()
{
	cout << "CLOCK算法调度结果为:" << endl;
    for(int i=0;i<BlockNum;i++)
    {
       CLOCK_list[i].data = 0;
       CLOCK_list[i].flag = 0;
    }

    int index = 0;
    for(int i=0;i<PageNum;i++)
    {
        int Found =0;
        for(int j=0;j<BlockNum;j++)
        {
            if(CLOCK_list[j].data == PageOrder[i])
            {
                CLOCK_list[j].flag =1;
                Found = 1;
                break;
            }
        }

        if(!Found)
        {
            int full = 0;
            for(;index<BlockNum;index++)
            {
                if(CLOCK_list[index].flag ==0)
                {
                    full = 1;
                    CLOCK_list[index].data = PageOrder[i];
                    CLOCK_list[index].flag =1;
                    index++;
                    break;
                }
                else
                {
                    CLOCK_list[index].flag =0;
                }
            }
            if(index == BlockNum)
                index = 0;

            if(!full)
            {
                CLOCK_list[0].data = PageOrder[i];
                CLOCK_list[0].flag =1;
                index++;
            }

        }
        
        for(int j=0;j<BlockNum;j++)
        {
        	test[j][i]=CLOCK_list[j].data;
            
        }
    }
    for (int i = 0; i < PageNum; i++)
	 {
    	//cout<<"  ";
        cout << PageOrder[i] << "  "; 
    }
    printf("\n");
    for(int j=0;j<BlockNum;j++)
    {
    	for(int i=0;i<PageNum;i++)
        {
        	if(test[j][i]==0)
        	{
        		printf("   ");
			}
			else
			{
				printf("%d  ",test[j][i]);
			}

        }
        printf("\n");
	}
    
}
void chooseAlgorithm()
{
    
    printf("请根据算法前ID选择你要用的算法:\n");
        printf("**************************************\n");
	
		printf("*****************0、退 出*************\n");
		printf("*****************1、OPT***************\n");
		printf("*****************2、FIFO**************\n");
		printf("*****************3、LRU***************\n");
		printf("*****************4、Clock*************\n");
		printf("**************************************\n");
    cin >> choose;
    cout << endl;
    if (choose == 1)
    {
    	OPT();
        
        chooseAlgorithm();
    }
    else if (choose == 2)
    {
        FIFO();
        chooseAlgorithm();
    }
    else if (choose == 3) {
        LRU();
        chooseAlgorithm();
    }
    else if (choose == 4) {
        CLOCK();
        chooseAlgorithm();
    }

    else if (choose == 0) {
        exit(0);
    }
    else
    {
        cout << "输入错误!请按照提示输入!" << endl;
        chooseAlgorithm();
    }
}

void output() {
    int i, j;
    for (i = 0; i < PageNum; i++) {
    	//cout<<"  ";
        cout << PageOrder[i] << "  ";
    }
    cout << endl;
    for (i = 0; i < BlockNum; i++) {
        for (j = 0; j < PageNum; j++) {
           
            if (Simulate[i][j] == -1) {
                cout << "   ";
            }
            else {
                cout  << Simulate[i][j]<< "  ";
            }
        }
        cout << endl;
    }
}

//2 3 2 1 5 2 4 5 3 2 5 2

原参考:https://www.csdn.net/dwz/404?from=KMTEx,侵删

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值