专注人工智能在金融领域的应用

操作系统:页式管理的分配与回收算法(C语言)

#include<stdio.h>
#include<stdlib.h>
//#include<iomanip.h>
//#include"windows.h"
//#include"os.h"
#define n 64//实验中假定主存的长度
#define m 4//实验中假定每个作业分得主存块块数
int p[m];//定义页
struct
{
 short int lnumber;//页号
 short int flag;//表示该页是否在主存,“1”表示在主存,“0”表示不在主存
 short int pnumber;//该页所在主存块的块号
 short int write;//该页是否被修改过,“1”表示修改过,“0”表示没有修改过
 short int dnumber;//该页存放在磁盘上的位置,即磁盘块号
 short int times;//被访问的次数,用于LRU算法
}page[n];//定义页表
//各个函数的实现如下:
void computer()
{
 int i;
 for(i=0;i<n;i++)
 {
  page[i].lnumber = i;
  page[i].flag = 0;
  page[i].pnumber = 10000;//用10000表示为空
  page[i].write = 0;
  page[i].dnumber = i;
  page[i].times = 0;
 }//初始化页表
 
 for(i=0;i<m;i++)
 {
  page[i].pnumber = i;
 }
 
 for(i=0;i<m;i++)
 {
  p[i] = i;
  page[i].flag = 1;
 }//初始化页 

void  showpagelist()
{
    int i;
 printf("页号\t是否在主存中\t块号\t是否被修改过\t磁盘块号\t访问次数\n");
 for(i=0;i<n;i++)
 {
  printf("%d\t%d               %d\t%d                  %d          \t%d\n",page[i].lnumber,page[i].flag,page[i].pnumber,page[i].write,page[i].dnumber,page[i].times);
 }
}
void  showpage()
{
    int i;
 for(i=0;i<m;i++)
 {
  printf("\t%d",p[i]);
 }
 printf("\n");
}
void transformation()
{
 unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;
 int i,head=0,fail = 0;
 int method,temppage=0;
 short int times = 10000;
 printf("请输入一个逻辑地址(四位十六进制数):");
 scanf("%x",&logicAddress);//读入逻辑地址
 logicNumber = logicAddress >> 10;//得到页号
 printf("页号为:%d\n",logicNumber);
 innerAddress = logicAddress & 0x03ff;//得到页内地址
 printf("页内地址为:%d\n",innerAddress);
 for(i=0;i<n;i++)
 {
  if(logicNumber==(unsigned)page[i].lnumber)
  {
   if(page[i].flag == 1)
   {
  
    printf("请求的页面在主存中!\n");
    page[i].times++;
    physicsNumber = page[i].pnumber;//由页号得到块号
   
    printf("请求的主存块号为:%d\n",physicsNumber);
    physicsAddress = physicsNumber << 10 |innerAddress;//得到物理地址
   
    printf("请求的物理地址为:%d\n",physicsAddress);
    break;
   }
   else
   {   
                
    printf("请求的页面不在主存中! 将进行缺页中断处理!\n请选择算法!\n");
    printf("1.先进先出\n2.最近最少用!\n请选择置换算法\n");
    scanf("%d",&method);
    if(method == 1) //采用先进先出算法
    {
     printf("采用先进先出算法!\n");
     fail = p[head];
     printf("第:%d页将被替换\n",fail);
     p[head] = logicNumber;
     head = (head+1) % m;
     if(page[fail].write == 1)
       printf("第:%d页曾被修改过\n",fail);
     page[fail].flag = 0;
     page[logicNumber].flag = 1;
     page[logicNumber].write = 0;
     page[logicNumber].pnumber = page[fail].pnumber;
     page[fail].pnumber = 10000;
     page[logicNumber].times++;
     break;
    }
    else if(method == 2) //采用最近最少用算法
    {
     printf("采用最近最少用算法!\n");
     for(i=0;i<n;i++)
     {
      if(page[i].flag == 1)
      {
       if(page[i].times<times)
       {
        times = page[i].times;
        temppage = page[i].lnumber;
       }
      }
     }
     printf("第:%d页将被替换\n",temppage);
     for(i=0;i<m;i++)
     {
      if(p[i] == temppage)
      {
       p[i] = logicNumber;
      }
     }
     if(page[temppage].write == 1)
     printf("第:%d页曾被修改过\n",temppage);
     page[temppage].flag = 0;
     page[logicNumber].flag = 1;
     page[logicNumber].write = 0;
     page[logicNumber].pnumber = page[temppage].pnumber;
     page[temppage].pnumber = 10000;
     page[logicNumber].times++;
     break;
    }
    else
    { 
     printf("你输入有误,即将退出!");
     exit(1);
    }
   }
  }
 }
}
void main()
{
 char c,d,temp;
 computer();
 showpage();
 showpagelist();
T:
 transformation();
 printf("是否显示页和页表?(y/n)");
 scanf("%c",&temp);////忽略回车
 scanf("%c",&c);
 scanf("%c",&temp);////忽略回车
 switch(c)
 {
 case 'y':
  showpage();
  showpagelist();
 case 'n':
  printf("是否继续进行请求分页?(y/n)");
  scanf("%c",&d);
  if (d=='Y'||d=='y')
   goto T;
  else if (d=='N'||d=='n')
   exit(1);
  else 
  printf("输入错误!\n");
 default:printf("输入错误!\n");
 }
 
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>