页式虚拟存储管理 C语言编写

KINGWANG3039 2012-11-27 08:20:49
二、 实验内容
编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。进一步认识页式虚拟存储管理中如何处理缺页中断以及页面置换算法。
设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流,它是一系列需要访问的指令的地址,为不失一般性,你可以适当地(用人工指定方法或用随机数产生器)生成这个序列。页面淘汰算法采用 FIFO页面淘汰或LRU算法,并且在淘汰一页时,只将该页在页表中标志位进行修改,而不再判断它是否被改写过,也不将它写回到辅存。
具体的做法是:
(1)产生一个需要访问的指令地址流或按所给的指令地址流表。
(2)指定合适的页面尺寸(例如以 1K为1页)。
(3)指定内存页表的最大长度,并对页表进行初始化。每访问一个地址时,首先要查页表,得到所在页的页号,判断该页是否在主存,如果该页已在主存,则打印页表情况;同时输出绝对地址。如果该页不在主存,则按 FIFO或LRU页面淘汰算法淘汰一页后调入所需的页(只将该页在页表中标志位进行修改),打印页表情况;逐个地址访问,直到所有地址访问完毕。

算法的流程图参考如下:

(4)假定主存的每个主存块1024字节,系统中每个作业分得主存块4块。
页表如下:
页号 标志 主存块号 修改标志 磁盘位置
0 1 5 0 011
1 1 8 0 012
2 1 9 0 013
3 1 1 0 021
4 0 0 022
5 0 0 023
6 0 0 121

(5)指令流表如下:
依次执行下述指令序列来调试你的程序。仅模拟指令的执行,不考虑指令序列中具体操作的执行。


操作 页号 页内地址 操作 页号 页内地址
+ 0 070 移位 4 053
+ 1 050 + 5 023
* 2 015 存 1 037
存 3 021 取 2 078
取 0 056 + 4 001
- 6 040 存 6 084

(6)6)为了检查程序的正确性,同学可自行确定若干组指令序列,运行设计的程序,核对执行结果。

...全文
1241 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
KINGWANG3039 2012-11-28
  • 打赏
  • 举报
回复
#include <stdio.h> #include <stdlib.h> #define BUSY 0 #define NOTBUSY 1 struct Page{ int PNumber; //页号 int BNumber; //物理块号 int Count; //计数器 bool State; //状态位 } Page[6]={{0,2,3,true},{1,1,2,true},{2,-1,0,false},{3,0,1,true},{4,-1,0,false},{5,-1,0,false}}; //对页表进行初始化 //利用结构体数组存储页表 struct Physical{ int BNumber; //物理块号 int State; //状态位 }Physical[3]={{0,1},{1,1},{2,1}}; //利用结构体数组初始化页框 int main() { int P, BNumber; int i, j, k; int MaxSzie, MaxCount = 0; printf("\nPlease input the size of the course:"); scanf("%d",&MaxSzie);//输入进程大小 int Address; printf("\nPlease input the address:"); scanf("%d",&Address);//输入要访问的地址 while(Address < 0 || Address > MaxSzie) { printf("ERROR"); printf("\nPlease input the address again:"); scanf("%d",&Address); } P = Address / 1024; for (i = 0; i <= 5; i++) { if (Page[i].PNumber == P && Page[i].State == true) //在页表中并 在主存中 { printf("\n页在主存,打印页表:"); printf("\n页号:%d 物理块号:%d 状态:%d",Page[i].PNumber,Page[i].BNumber,Page[i].State); } } for(i = 0; i <= 5; i++) { if (Page[i].PNumber == P && Page[i].State == false) { printf("\n在辅存"); //判断页面是否已满 if(Physical[0].State == BUSY && Physical[1].State == BUSY && Physical[2].State == BUSY) { for (j = 0; j <= 5; j++) { if (Page[j].Count >= MaxCount && Page[j].State == true) { MaxCount = Page[j].Count; k = j; } } BNumber = Page[k].BNumber; Page[k].Count = 0; Page[k].State = false; Page[i].BNumber = BNumber; Page[i].State = true; //修改count for (j = 0; j <= 5; j++) if (Page[j].State == true) Page[j].Count = Page[j].Count + 1; //淘汰页面,重新调入 printf("/n页在辅存并已调入主存,打印页表:"); printf("\n页号:%d 物理块号:%d 状态:%d",Page[i].PNumber,Page[i].BNumber,Page[i].State); } else { for (j = 0; j <= 2 ; j++) { if (Physical[j].State == NOTBUSY) { Page[i].BNumber = Physical[j].BNumber; Page[i].State = true; for (j = 0; j <= 5; j++) if (Page[j].State == true) Page[j].Count = Page[j].Count + 1; printf("/n页在辅存,打印页表:"); printf("\n页号:%d 物理块号:%d 状态:%d",Page[i].PNumber,Page[i].BNumber,Page[i].State); } } } } } system("PAUSE"); /* pause to see the result */ return 0; }
KINGWANG3039 2012-11-28
  • 打赏
  • 举报
回复
帮忙啊!!!!!
KINGWANG3039 2012-11-27
  • 打赏
  • 举报
回复
这个有符合上面的要求吗?
prajna 2012-11-27
  • 打赏
  • 举报
回复
format了一下,改了幾個編譯錯誤,拿個板凳,佔各位,慢慢看
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define len sizeof(struct page)
struct pagetable
{
  int pagenum;
  int blocknum;
  char state;
}num[1024];

struct page
{
  int pagenum;
  int blocknum;
  struct page *next;
}*head=NULL,*tail=NULL;

int blocktable[3]={0,0,0};
void 
print(int a)
{
  int i;
  printf("\n*****pagenum  blocknum  state\n");
  for(i=0;i<=a;i++)
  {
    num[i].pagenum=i;
    printf("%8d%8d%8c",num[i].pagenum,num[i].blocknum,num[i].state);
    printf("\n");
  }
  printf("\n");
}
void
insert(int n,int m)
{
  struct page*p;
  p=(struct page*)malloc(len);
  p->pagenum=n;
  p->blocknum=m;
  if(head==NULL)
  {
    head=p;
    tail=p;
    p->next=NULL;
  }
  else
  {
    tail->next=p;
    tail=p;
  }
}
int main( void )
{
  int i,j,a,b,c,d;
  char s;
  char ch;
  struct page *p;

  /* #####Initialize pagetable!!!#####*/

  printf("*****Please input the size of process:");
  scanf("%d",&a);
  b=a/1024;

  for(i=0;i<=b;i++)
  {
    num[i].pagenum=i;
    num[i].blocknum=-1;
    num[i].state='F';
  }
  print(b);

  /*#####Start to request the page!#####*/

  do
  {
    ch=getchar(); //getch();
    j=0;
    printf("*****please input the adress:");
    scanf("%d",&c);
    if(c>a)
      printf("\n*****The adress is slop over!\n");
    else
    {
      d=c/1024;
      s=num[d].state;
      if(s=='T')
        print(b);
      else
      {
        for(j=0;j<3;j++)
          if(blocktable[j]==0)
          {
            blocktable[j]=1;
            num[d].pagenum=d;
            num[d].blocknum=j;
            num[d].state='T';


            print(b);
            insert(d,j);
            break;
          }

          /*#####Start FIFO arithmetic!!!#####*/

          if(j==3)
          {
            int h;
            h=head->pagenum;
            num[d].blocknum=head->blocknum;
            num[d].state='T';
            num[h].blocknum=-1;
            num[h].state='F';
            print(b);
            p=(struct page*)malloc(len);
            p->pagenum=d;
            p->blocknum=head->blocknum;
            p->next=NULL;
            head=head->next;
            tail->next=p;
            tail=p;
          }
      }
    }

  }while(c>=0);

  return 0;
}
转角天边 2012-11-27
  • 打赏
  • 举报
回复
mark,进来学习
KINGWANG3039 2012-11-27
  • 打赏
  • 举报
回复
#include"string.h" #include"stdio.h" #define len sizeof(struct page) struct pagetable {int pagenum; int blocknum; char state; }num[1024]; struct page { int pagenum; int blocknum; struct page *next; }*head=NULL,*tail=NULL; int blocktable[3]={0,0,0}; print(int a) { int i; printf("\n*****pagenum blocknum state\n"); for(i=0;i<=a;i++) { num[i].pagenum=i; printf("%8d%8d%8c",num[i].pagenum,num[i].blocknum,num[i].state); printf("\n"); } printf("\n"); } insert(int n,int m) { struct page*p; p=(struct page*)malloc(len); p->pagenum=n; p->blocknum=m; if(head==NULL) { head=p; tail=p; p->next=NULL; } else { tail->next=p; tail=p; } } main() { int i,j,a,b,c,d; char s; char ch; struct page *p; /* #####Initialize pagetable!!!#####*/ printf("*****Please input the size of process:"); scanf("%d",&a); b=a/1024; for(i=0;i<=b;i++) { num[i].pagenum=i; num[i].blocknum=-1; num[i].state='F'; } print(b); /*#####Start to request the page!#####*/ do { ch=getch(); j=0; printf("*****please input the adress:"); scanf("%d",&c); if(c>a) printf("\n*****The adress is slop over!\n"); else { d=c/1024; s=num[d].state; if(s=='T') print(b); else { for(j=0;j<3;j++) if(blocktable[j]==0) { blocktable[j]=1; num[d].pagenum=d; num[d].blocknum=j; num[d].state='T'; print(b); insert(d,j); break; } /*#####Start FIFO arithmetic!!!#####*/ if(j==3) { int h; h=head->pagenum; num[d].blocknum=head->blocknum; num[d].state='T'; num[h].blocknum=-1; num[h].state='F'; print(b); p=(struct page*)malloc(len); p->pagenum=d; p->blocknum=head->blocknum; p->next=NULL; head=head->next; tail->next=p; tail=p; } } } }while(c>=0); } 这个程序帮忙检验下 对不对啊!

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧