操作系统页面存储管理系统

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<iostream>
using namespace std;
#define Maxsize 64                        //进程大小
#define X 64                              //物理块的大小
***** 定义页表结构体 *****
struct Page
{
 int Yh;                          //页表的页号
    int kh;                          //页表的块号
 int State;                       //页表的状态
};
typedef struct node
{
 int data[Maxsize];
 int top;
}SeqStack;        //定义顺序栈

unsigned char RAM[8];                  //用于生成位图                          
int Map[64];                         
int YeHao[X];       //定义访问页号的序列
int Length,Size,kuaisu;                 //定义页表的长度,页块大小,内存块的个数
int C;         //用于计算内存块的大小
int Num;        //定义内存队列节点的个数
int Visit[Maxsize];                     //定义访问过的页面序列号

struct Page   page1[100];    //定义页表结构体数组
struct Page   page2[100];
struct Page   page3[100];
int d;         //定义逻辑地址
int Yh;         //定义页号
int Yd;         //定义相对地址
int v;         //定义访问次数

int n1=0;        //命中次数
int n2=0;                               //定义LRU算法的命中次数

SeqStack *neichun1=(SeqStack *)malloc(sizeof(SeqStack));               
SeqStack *neichun2=(SeqStack *)malloc(sizeof(SeqStack));              
SeqStack *neichun3=(SeqStack *)malloc(sizeof(SeqStack));               
///*******创建位示图******//
//用二进制的一位来表示磁盘中的一个盘块的使用情况
void weishitu()
{
 int k=0;
  srand(time(0));           //种下随机数种子,使每次产生的随机数不同
 for(int i=0;i<8;i++)
 {              //产生8个0-256的数
  RAM[i]=(unsigned char)rand()%256;
 }
 cout<<endl;
 for(int j=0;j<64;j++)
 {
    int x=j%8;int y=j/8;
    unsigned char temp=(unsigned char)pow(2,x);
    if(( unsigned char)(RAM[y]&temp)==temp)             //判断内存空间是否被占用
    Map[j]=1;
    else
    Map[j]=0;
 }
 for(int m=0;m<64;m++)
 {
 cout<<" "<<Map[m];
 if(m%8==7)
 cout<<endl;
 }
}
***********对栈的操作**********
//返回栈尾
void setnull(SeqStack *s)                   
{
 s->top=-1;
}
//判断是否是空栈
int StackIsEmpty(SeqStack *s)
{
   if (s->top == -1)
   return 1;
   else
   return 0;
}
//进栈
void StackPush(SeqStack *s, int x)
{
    s->top++;
    s->data[s->top] = x;    
}
//出栈
int StackPop(SeqStack *s)
{
 s->top--;
 return(s->data[s->top+1]);
}
*****将栈中的最后一个元素删除******
void outStack(SeqStack *s)
{
 int SS[Maxsize];
 int j=0;
 while(!StackIsEmpty(s)&&j<kuaisu)
  {  
     SS[j]=StackPop(s);
     j++;
  }
   for(int i=kuaisu-2;i>=0;i--)
   {  
    StackPush(s,SS[i]);  
   }
}
**********删除栈中的任意元素***********/
void DeleteStack(SeqStack *s,int xx)
{
 int SS[Maxsize];
 int j=0;
 while(!StackIsEmpty(s)&&s->data[s->top]!=xx&&j<kuaisu)
 {
  SS[j]=StackPop(s);
  j++;
 }
 StackPop(s);
 for(int i=j-1;i>=0;i--)
 {
  StackPush(s,SS[i]);
 }  
}
**********将栈中的任意元素放到栈顶***********/
void TopStack(SeqStack *s,int xx)
{
 int SS[Maxsize];
 int j=0;
 while(!StackIsEmpty(s)&&s->data[s->top]!=xx&&j<kuaisu)
 {
  SS[j]=StackPop(s);
  j++;
 }

 StackPop(s);
 for(int i=j-1;i>=0;i--)
 {
  StackPush(s,SS[i]);
 }
  StackPush(s,xx);
}
//输入页表长度及内存块数
void input()
{
 cout<<"   欢迎使用请求分页存储区管理实验        "<<endl; 
 cout<<"                   操作系统课程设计               "<<endl;
 cout<<"                                                    "<<endl;

 cout<<"输入页表长度:"<<endl;
 cin>>Length;
              //初始化页表结构体
 for(int i=0;i<Length;i++)
 {
  page1[i].Yh=i;
  page1[i].kh=-1;
  page1[i].State=0;
 }
 for(int j=0;j<Length;j++)
 {
  page2[j].Yh=j;
  page2[j].kh=-1;
  page2[j].State=0;
 }
 for(int k=0;k<Length;k++)
 {
  page3[k].Yh=k;
  page3[k].kh=-1;
  page3[k].State=0;
 }
              //初始化内存
 setnull(neichun1);
 setnull(neichun2);
 setnull(neichun3);
 cout<<"输入内存块数:"<<endl;
 cin>>kuaisu;

 cout<<"输入块长(k):"<<endl;
 cin>>Size;
 C=Size*1024;
}
//输入物理地址,并计算出逻辑地址   判断地址是否越界
void address()
{
 printf("输入地址: ");
 scanf("%x",&d);
 Yh=d/C;
 Yd=d%C;
 if(Yh>Length-1)
 {
  cout<<"错误!!  地址越界!!"<<endl;
  cout<<"请重新输入逻辑地址:";
  scanf("%x",&d);
  Yh=d/C;
  Yd=d%C;
 }
 printf("页号:%d\n",Yh);
 printf("十进制大小:%d\n",d);
 v++;
 Visit[v-1]=Yh;
}
void output(Page page[10],SeqStack *Memory,int c,float e)             //page为页表,Memory为内存栈,c为物理地址,e为命中次数,f为缺页率
{
 float f;
 cout<<"页号"<<"     "<<"块号"<<"     "<<"状态位"<<endl;
 for(int i=0;i<Length;i++)
 {
  cout<<"  "<<page[i].Yh<<"  "<<page[i].kh<<"    "<<page[i].State<<endl;
 }
 cout<<endl;
 cout<<"内存分配块:"<<endl;
 cout<<"序号"<<"    "<<"页号"<<endl;
    for(int k=0;k<Memory->top+1;k++)
    cout<<"  "<<k<<"      "<<Memory->data[k]<<endl;
    for(int j=Memory->top+1;j<kuaisu;j++)
    cout<<"  "<<j<<"      "<<"-1"<<endl;
 cout<<endl;
 cout<<"物理地址"<<c<<endl;
 cout<<"访问次数"<<v<<endl;
 int h=v-e;
 printf(" 缺页次数:%d  \n ",h);
 f=(1-e/v)*100;
    printf("缺页率:%5.2f%",f);
 cout<<"%"<<endl;

}

void outopt(Page page[10],SeqStack *Memory,int x,float e)
///page为页表,Memory为内存栈,c为物理地址,e为命中次数,
{
 float f;                    //定义f为缺页率
 cout<<"页号"<<"     "<<"块号"<<"     "<<"状态位"<<endl;
 for(int i=0;i<Length;i++)
 {
 cout<<"  "<<page[i].Yh<<"  "<<page[i].kh<<"    "<<page[i].State<<endl;
 }
 printf("内存分配块:\n");
 cout<<"序号"<<"    "<<"页号"<<endl;
   for(int k=0;k<Memory->top+1;k++)
    cout<<"  "<<k<<"      "<<Memory->data[k]<<endl;
    for(int j=Memory->top+1;j<kuaisu;j++)
    cout<<"  "<<j<<"      "<<"-1"<<endl;
 printf(" 访问次数:%d  \n",x);
 int h=x-e;
 printf(" 缺页次数:%d  \n ",h);
 f=(1-e/x)*100;
    printf("缺页率:%5.2f%",f);
 cout<<"%"<<endl;
}

int jisu1(){
 int c1;
 for(int i=kuaisu;i<v;i++)
 {   
        int flag0=0;
  if(Visit[i]==neichun3->data[0])
  {
   flag0=1;
   c1=i;
  }
     if(flag0==1) break;
  if(Visit[i]!=neichun3->data[0])
   c1=Maxsize+3;
 }
 return c1;
}

int jisu2(){
 int c2;
 for(int i=kuaisu;i<v;i++)
 {   
        int flag0=0;
  if(Visit[i]==neichun3->data[1])
  {
   flag0=1;
   c2=i;
  }
        if(flag0==1) break;
   if(Visit[i]!=neichun3->data[1]) c2=Maxsize+2;
 }
  return c2;
}
int jisu3(){
 int c3;
 for(int i=kuaisu;i<v;i++)
 {
        int flag0=0;
  if(Visit[i]==neichun3->data[2])
  {
       flag0=1;
      c3=i;
  }
        if(flag0==1) break;
    if(Visit[i]!=neichun3->data[2]) c3=Maxsize+1;
 }
 return c3;
}

int Max()
{
  int c1=jisu1();
  int c2=jisu2();
  int c3=jisu3();
  int Max0,Max;
  if(c1>c2) Max0=c1;
  else Max0=c2;
  if(Max0>c3)  Max=Max0;
    else Max=c3;
  return Max;
}
*****先进先出(FIFO)算法******/
void FIFO()
{
 if(page1[Yh].State==1)  n1++;
 else {             
            page1[Yh].State=1;
         if(neichun1->top+1<kuaisu)
   {
            int flag=0;
             for(int i=0;i<64;i++)
    {     
              if(Map[i]==0)
     {
                       flag=1;
                    Map[i]=1;
              page1[Yh].kh=i;
              StackPush(neichun1,Yh);
     }
         if(flag==1)  break;
    }        
   }
     else
  {   
       int s=neichun1->data[0];
          page1[Yh].kh=page1[s].kh;
    page1[Yh].State=1;
          page1[s].State=0;
    page1[s].kh=-1; 
    outStack(neichun1);
    StackPush(neichun1,Yh);
  }
 }
 int wl=page1[Yh].kh*C+Yd;
 output(page1,neichun1,wl,n1);
}
*******LRU(最近未使用)*********

void LRU()

  if(page2[Yh].State==1)
  {
  n2++;
  TopStack(neichun2,Yh);
  }
   else
   { 
          page2[Yh].State=1;
          if(neichun2->top+1<kuaisu)
    {    
             int flag1=0;
             for(int i=0;i<64;i++)
    {     
              if(Map[i]==0)
     {
                      flag1=1;
                   Map[i]=1;
             page2[Yh].kh=i;
             StackPush(neichun2,Yh);
     }
        if(flag1==1) break;
    }       
    }
        else{
            int s=neichun2->data[0];
               page2[Yh].kh=page2[s].kh;
         page2[Yh].State=1;
               page2[s].State=0;
         page2[s].kh=-1; 
         outStack(neichun2);
         StackPush(neichun2,Yh);     
     } 
  }
 int wl=page2[Yh].kh*C+Yd;
 output(page2,neichun2,wl,n2);
}
/*********最佳(OPT)置换算法**********/
void OPT()
{
 int m=0;                          //定义OPT算法的命中次数
 for(int i=0;i<v;i++)
 {
  Yh=Visit[i];
  if(page3[Yh].State==1) m++;
  else
  {
            page3[Yh].State=1;
   if(neichun3->top+1<kuaisu)
   {
     int flag2=0;
     for(int j=0;j<64;j++)
     {
        if(Map[j]==0)
      {
          flag2=1;
          Map[j]=1;
          page3[Yh].kh=j;
          StackPush(neichun3,Yh);
      }
         if(flag2==1) break;     
     }  
   }
   else
    {
       int leaf;          //定义将要删除页号
                   int max=Max();
       if(max==jisu1())  leaf=neichun3->data[0];
       else if(max==jisu2()) leaf=neichun3->data[1];
       else if(max==jisu3()) leaf=neichun3->data[2];
          page3[Yh].kh=page3[leaf].kh;
       page3[Yh].State=1;
       page3[leaf].State=0;
       page3[leaf].kh=-1;
                   DeleteStack(neichun3,leaf);
       StackPush(neichun3,Yh);
    }     
    }  
    output(page3,neichun3,i+1,m);
   }
}

 

void main()
{
 input();
 cout<<"位示图:";
 weishitu();
 cout<<"                                                    "<<endl;
 cout<<" 选择置换算法                   "<<endl;
 cout<<endl;
 cout<<"    FIFO : F            "<<endl;
 cout<<endl;
 cout<<"    LRU: L            "<<endl;
 cout<<endl;
 cout<<"    OPT :O            "<<endl;
 cout<<endl;
 cout<<" 位示图重置:R                "<<endl;

 cout<<"                                                    "<<endl;
 char A;
 while(1){    
     cout<<" 输入算法:"<<endl;
     
     cout<<">";
   cin>>A;
   
     switch(A)
     {
      case 'F':
      case 'f':     address();FIFO(); break;

      case 'L':
      case 'l':        address();LRU();break;

      case 'o':
      case 'O':
     {

     cout<<"访问页号:"<<endl;
         for(int i=0;i<v;i++)
     {
         cout<<Visit[i]<<"   "; 
     }
     cout<<endl;
     OPT();        
     break;
     }

      case 'R':
      case 'r': 
       cout<<"位示图:"<<endl;
       weishitu();
                
       for(int i=0;i<v;i++)
       {
        Visit[i]=NULL;
     }
       v=0;
       setnull(neichun1);
       setnull(neichun2);
       setnull(neichun3);
     }
 }
    
}

1 实验目标 存储管理的主要功能之一是合理地分配空间 请求页式管理是一种常用的虚拟存储管理技术 本实验的目的是通过请求页式存储管理页面置换算法模拟设计 了解虚拟存储技术的特点 掌握请求页式管理的页面置换算法 2 实验要求 1 通过随机数产生一个指令序列 共320条指令 指令的地址按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分 25%的指令是均匀分布在后地址部分 具体的实施办法是: 在[0 319]的指令地址之间随机选取一点m; 顺序执行一条指令 即执行地址为m+1的指令; 在前地址[0 m+1]随机选取一条指令并执行 该指令的地址为m’; 顺序执行一条指令 其地址为m’+1; 在后地址[m’+2 319]随机选取一条指令并执行; 重复上述步骤 直到执行320次指令 2 将指令序列变换成页地址流 设: 页面大小为1K; 用户内存容量为4页到32页; 用户虚存容量为32K; 在用户虚存 按每K存放10条指令排列虚存地址 即320条指令在虚存的存放方式为: 第0条 9条指令为第0页(对应虚存地址为[0 9]); 第10条 第19条指令为第一页(对应虚存地址为[10 19]); 第310条 第319条指令为第31页(对应虚存地址为[310 319]); 按以上方式 用户指令可组成32页 3 计算并输出下述各种算法在不同内存容量下的命率 先进先出的算法(FIFO); 最近最少使用算法(LRR); 最佳淘汰算法(OPT);先淘汰最不常用的页地址; 命率 1 页面失效次数 页地址流长度 在本实验 页地址流长度为320 页面失效次数为每次访问相应指令时 该指令所对应的页不在内存的次数 ">1 实验目标 存储管理的主要功能之一是合理地分配空间 请求页式管理是一种常用的虚拟存储管理技术 本实验的目的是通过请求页式存储管理页面置换算法模拟设计 了解虚拟存储技术的特点 掌握请求页式管理的页 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙在江湖aa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值