7

#include <bits/stdc++.h>
using namespace std;
#define max1 200
#define max2 0x3f3f3f
struct LRU
{
    int num;
    int time;
};
struct table
{
    int queyechishu;
    int mingzhongcishu;
    int zhihuancishu;
    double queyelv;
    double mingzhongvlv;
};
table lru2,option2,clock2;
int  output1[max1][max1],output2[max1][max1],output3[max1][max1],s=0,s2=0,s3=0,zhong1=0,zhong2=0,zhong3=0,kk;
LRU lru[max1];
char ch;
int pre[max1],dist[max1][max1],block1[max1];
int block,length,page[max1],papelack=0;
int n,m,pages,replace1,replace2,replace3;
int a1[max1],a2[max1],a3[max1];
int num1=0;
int num2=0;
int num3=0;
void menu();
void menu1();
void menu2();
bool flag;
void init()
{
	for (int i = 1; i <= n; i++)
	{
		lru[i].time = 0;
		lru[i].num = -1;
	}
}
/******************************
返回找到的位置或者替换的位置
*******************************/
int findpage(int k)
{
    int i = 0;
    for(int j = 1; j <= block; j++)
    {
         if(lru[j].num == page[k])
         {
             i = j;
             flag = false;
             break;
         }
    }
    if(flag)///没有找到
    {
        for(int j = 1; j <= block; j++)
        {
            if(lru[i].time < lru[j].time)
            {
                i = j;   ///返回最后使用的内存块用来被替换。
            }
        }
    }
    return i;
}
int LRU1()
{
    init(); //初始化
	int line = 0;
	bool flag1; //访问标志
	int i, j, tmp;
	for (i = 1; i <= n; i++) {
		flag = true;
		if (line < block){ //没有装满的情况
			flag1 = false;
			for (j = 0; j < line; j++){
				if (lru[j].num == page[i]) { //访问序列目标已经存在
					printf("%d页面已经存在\n", lru[j].num);
					for(int pp = 0; pp < block; pp++)
                   {
                        output1[s][pp] = lru[pp].num;
                   }
                     s++;
					flag1 = true;
					lru[j].time = 0;
					break;
				}
			}
			if (!flag1){
				printf("没有装满,添加新页面:");
				cout<<page[i]<<endl;
				lru[line++].num = page[i];
				lru[line].time = 0;
				for(int pp = 0; pp < block; pp++)
        {
            output1[s][pp] = lru[pp].num;
        }
        s++;
				papelack++;
			}
		}
		else{
			tmp = findpage(i);
			if (flag){
				printf("产生页面置换中断\n");
				printf("将%d页置换出去,将%d页置换进来\n",lru[tmp].num,page[i]);
				a1[num1++] = lru[tmp].num;
				lru[tmp].num = page[i];
				lru[tmp].time = 0;
				for(int pp = 0; pp < block; pp++)
        {
            output1[s][pp] = lru[pp].num;
        }
        s++;
				replace1++;
				papelack++;
			}
			else{
				printf("访问%d页面成功\n", lru[tmp].num);
				lru[tmp].time = 0; //时间清零
				zhong1++;
				for(int pp = 0; pp < block; pp++)
        {
            output1[s][pp] = lru[pp].num;
        }
        s++;
			}
		}
		if (line > block) {   //内存装满
			for (int k = 1; k <= block; k++) {
				lru[k].time++;
			}
		}
		else {
			for (int k= 0; k < line; k++) {
				lru[k].time++;
			}
		}
	}
	if(line >= block)
        kk = block;
    else kk = line;
	return papelack;
}
int OPT1()
{
    int pre[max1];
    int papelack = 0;
    fill(pre,pre+max1,0);
    fill(dist[0],dist[0]+max1*max1,max2);
    fill(block1,block1+max1,-1);
    for(int i = n; i >= 1; i--)
    {
        for(int j = 0; j <= pages;j++)
        {
            if(pre[j])
            {
                dist[i][j] = pre[j] - i;
            }
            pre[page[i]] = i;
        }
    }
    for(int i = 1; i <= n; i++)
    {
        int j;
        int maxdist = 0,p;
        for( j = 1; j <= m; j++)
        {
            if(block1[j] == -1)
            {
                block1[j] = page[i];
                 cout<<"页面"<<page[i]<<"不在内存,直接放入物理块"<<j<<"中!"<<endl;

                papelack++;
                  for(int k = 1; k <= m; k++)
                  {
                   output2[s2][k] = block1[k];
                  }
                   s2++;
                cout<<endl<<"当前内存页面:";
              for(int k=1; k<=m; ++k)//内存中页面加载情况
              cout<<block1[k]<<"   ";
              cout<<endl<<endl;
                break;
            }
            else if(block1[j] == page[i])
            {
                cout<<page[i]<<"已经存在内存"<<endl<<endl;
                zhong2++;
                 for(int k = 1; k <= m; k++)
        {
            output2[s2][k] = block1[k];
        }
        s2++;
                break;
            }
            if(maxdist < dist[i][block1[j]])
            {
                maxdist = dist[i][block1[j]];
                p = j;
            }
        }
        if(j > m)
        {
        cout<<"页面"<<page[i]<<"不在内存  置换: "<<block1[p]<<" --> "<<page[i]<<endl;
        replace2++;
        a2[num2++] = block1[p];
        block1[p] = page[i];
        papelack++;
        for(int k = 1; k <= m; k++)
        {
            output2[s2][k] = block1[k];
        }
        s2++;
        cout<<endl<<"当前内存页面:";
        for(int k=1; k<=m; ++k)//内存中页面加载情况
            cout<<block1[k]<<"   ";
        cout<<endl<<endl;
        }
    }
    return papelack;
}
int nru[max1];//表示 物理块 i 最近时候被访问过
int page_in_block[max1];//页面 i 在 block的下标索引
int CLOCK1(){
    int index = 1;
    papelack = 0;
    memset(block1, -1, sizeof(block1));
    for(int i=1; i<=n; i++){
        if(page_in_block[page[i]])
        {//如果page[i]已经在内存中
            nru[page_in_block[page[i]]] = 1;//重新标记这个物理块中的页面被访问过了
            cout<<endl<<"第"<<i<<"次: 页面"<<page[i]<<"已经存在物理块"<< page_in_block[page[i]] << "中!"<<endl;
            zhong3++;
        }
        else {
            while(true){
                if(index > m) index = 1;
                if(block1[index] == -1) {
                    nru[index] = 1;
                    page_in_block[page[i]] = index;
                    block1[index++] = page[i];
                    papelack++;
                    break;
                }
                if(block1[index] == page[i]){
                    nru[index++] = 1;
                    break;
                } else {
                    if(nru[index] == 0){//替换该页面
                        nru[index] = 1;
                        page_in_block[block1[index]] = 0;
                        cout<<endl<<"第"<<i<<"次: 物理块"<<index<<"中的页面"<< block1[index] <<"最近未被使用,将要被页面"<<page[i]<<"替换!"<<endl;
                        page_in_block[page[i]] = index;
                        block1[index++] = page[i];
                        papelack++;
                        replace3++;
                        a3[num3++] = block1[index];
                        break;
                    } else
                        nru[index++] = 0;
                }
            }
        }
        for(int k = 1; k <=m; k++)
            output3[s3][k] = block1[k];
        s3++;
        for(int k=1; k<=m; ++k)
            cout<<block1[k]<<" ";
        cout<<endl;
    }
    return papelack;
}
/*********************
设计一个表格输出三种算法的结果
*********************/
void compare()
{
    int queye = LRU1();
    lru2.queyelv = queye;
    lru2.zhihuancishu = replace1;
    lru2.mingzhongcishu = zhong1;
    lru2.queyelv = 1.0*queye/n;
    lru2.mingzhongvlv = 1.0*zhong1/n;

    int queye2 = OPT1();
    option2.queyelv = queye2;
    option2.zhihuancishu = replace2;
    option2.mingzhongcishu = zhong2;
    option2.queyelv = 1.0*queye2/n;
    option2.mingzhongvlv = 1.0*zhong2/n;

    int queye3 = CLOCK1();
    clock2.queyelv = queye3;
    clock2.zhihuancishu = replace3;
    clock2.mingzhongcishu = zhong3;
    clock2.queyelv = 1.0*queye3/n;
    clock2.mingzhongvlv = 1.0*zhong3/n;
    int a[3];
  a[0] = lru2.mingzhongvlv;
  a[1] = option2.mingzhongvlv;
  a[2] = clock2.mingzhongvlv;
  for(int i = 0; i < 2; i++)
  {
      for(int j = 0; j < i-1; j++)
      {
          if(a[j] < a[j+1])
          {
              int t = a[j];
              a[j] = a[j+1];
              a[j+1] = t;
          }
      }
  }
  cout<<"LRU"<<"      "<<"OPTION"<<"     "<<"CLOCK"<<

}
void menu2(string string1)
{
    cout<<endl;
	cout<<"                          ▂▃▅▆▇█████▇▆▅▃▂                            "<<endl;
	cout<<"☆    ===================================================================    ☆"<<endl;
	cout<<"                                                                                "<<endl;
	cout<<"                           您已经选择";cout<<string1;cout<<"                 "<<endl;
	cout<<"                           请输入页面访问串个数及访问串:                  "<<endl;
	cout<<"                                                                                 "<<endl;
	//cout<<"                                                                                 "<<endl;
	cout<<"☆    ===================================================================     ☆"<<endl;
}
void menu1()
{
    int k;
    cin>>k;
    if(k == 1)
    {
        system("CLS");
        menu2("LRU");
        cin>>n;
        for(int i = 1; i <= n ;i++)
        {
            cin>>page[i];
            pages = max(pages,page[i]);
        }
    cout<<"请输入物理块个数:";
    cin>>block;
    cout<<"/*******************************/"<<endl<<endl;
    cout<<"这里是LRU算法"<<endl<<endl;
    cout<<"/*******************************/"<<endl<<endl;
    int pa = LRU1();
    cout<<"缺页中断次数:"<<pa<<endl;
    cout<<"页面置换次数:"<<replace1<<endl;
    printf("缺页率: %2.2lf",1.0*pa/n*100);
    cout<<"%"<<endl;
    printf("命中率: %.2lf",1.0*zhong1/n*100);
    cout<<"%"<<endl;
    cout<<"依次被置换的页面:";
    for(int i = 0; i < num1; i++)
        cout<<a1[i]<<" ";
    cout<<endl;
    for(int i = 0; i < kk; i++)
    {
        for(int j = 0; j < s; j++)
        {
            cout<<output1[j][i]<<"  ";
        }
        cout<<endl;
    }
    cout<<"按任意键返回主菜单....."<<endl;
    cin>>ch;
    system("CLS");
    menu();
    replace1 = 0;
    }
    else if(k == 2)
    {
        system("CLS");
        menu2("OPTION");
    cin>>n;
    for(int i=1; i<=n; ++i)
    {
        cin>>page[i];
        pages = max(pages, page[i]) ;
    }
    cout<<"请输入物理块个数:";
    cin>>m;
    system("CLS");
    cout<<"                             *******************************"<<endl<<endl;
    cout<<"                             OPTION算法运行结果"<<endl<<endl;
    cout<<"                             *******************************"<<endl<<endl;
    int pa = OPT1();
    cout<<"                             中断次数:"<<pa<<endl;
    cout<<"                             置换次数:"<<replace2<<endl;
    cout<<"                             依次被置换的页面:";
   printf("缺页率: %2.2lf",1.0*pa/n*100);
    cout<<"%"<<endl;
    printf("命中率: %.2lf",1.0*zhong2/n*100);
    cout<<"%"<<endl;
        cout<<"依次被置换的页面:";
    for(int i = 0; i < num2; i++)
    cout<<a2[i]<<" ";
    cout<<endl;
     for(int i = 1; i <= m; i++)
    {
        for(int j = 0; j < s2; j++)
        {
            cout<<output2[j][i]<<"  ";
        }
        cout<<endl;
    }
    cout<<"按任意键返回主菜单....."<<endl;
    cin>>ch;
    system("CLS");
    menu();
    replace2 = 0;
    }
    else
        if(k == 3)
        {
        system("CLS");
        menu2("CLOCK");
        cin>>n;
        for(int i = 1; i <= n ;i++)
        {
            cin>>page[i];
            pages = max(pages,page[i]);
        }
    cout<<"请输入物理块个数:";
    cin>>m;
    cout<<"/*******************************/"<<endl;
    cout<<"这里是CLOCK算法"<<endl;
    cout<<"/*******************************/"<<endl;
    int pa = CLOCK1();
    cout<<"缺页中断次数:"<<pa<<endl;
    cout<<"页面置换次数:"<<replace3<<endl;

     printf("缺页率: %2.2lf",1.0*pa/n*100);
    cout<<"%"<<endl;
    printf("命中率: %.2lf",1.0*zhong3/n*100);
    cout<<"%"<<endl;
     cout<<"依次被置换的页面:";
    for(int i = 0; i < num3; i++)
        cout<<a3[i]<<" ";
    cout<<endl;
    for(int i = 1; i <= m; i++)
    {
        for(int j = 0; j < s3; j++)
        {
            cout<<output3[j][i]<<"  ";
        }
        cout<<endl;
    }
    replace3 = 0;
    cout<<"按任意键返回主菜单....."<<endl;
    cin>>ch;
    system("CLS");
    menu();
    }
    else
        if(k == 4)
    {
                system("CLS");
        menu2("算法比较");
        cin>>n;
        for(int i = 1; i <= n ;i++)
        {
            cin>>page[i];
            pages = max(pages,page[i]);
        }
    cout<<"请输入物理块个数:";
    cin>>m;
    cout<<"/*******************************/"<<endl;
    cout<<"这里是CLOCK算法"<<endl;
    cout<<"/*******************************/"<<endl;
    }
    else
    {
        system("CLS");
        cout<<endl;
        cout<<"                      请您按要求输入哟!                         "<<endl;
        menu();
    }
}
void menu()        //默认主菜单界面                  ***********************************************
{

	cout<<endl;
	cout<<"                          ▂▃▅▆▇█████▇▆▅▃▂                       "<<endl;
	cout<<"☆    ===================================================================    ☆"<<endl;
	cout<<"                                                                               "<<endl;
	cout<<"                           欢迎来到操作系统页面置换算法界面                        "<<endl;
	cout<<"                                                                               "<<endl;
	//cout<<"                                                                     "<<endl;
	cout<<"☆    ===================================================================    ☆"<<endl;
	//cout<<"                                                                               "<<endl;
	cout<<"                            请输入一下数字选择相应算法                           "<<endl;
	cout<<"                                                                               "<<endl;
	cout<<"                                【1】   LRU算法                              "<<endl;
	cout<<"                                【2】   OPTION算法                        "<<endl;
	cout<<"                                【3】   CLOCK算法                             "<<endl;
	cout<<"                                【4】   查看算法比较表                                            "<<endl;
	cout<<"☆    ===================================================================    ☆"<<endl;
	cout<<endl;
	cout<<"                           请输入【1—3】:";

	menu1();

}

int main()
{
 system("color 8e");
   menu();

    return 0;
}
/*
3
0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
3
3 2 1 5 2 4 5 3 2 5 2
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值