存储管理实验

一、实验目的 

     连续内存分配方式会形成许多“碎片”,虽然可以通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。如果允许将一个进程直接分散地装入到许多不相邻接的分区中,则无需再进行“紧凑”。基于这一思想而产生了离散分配方式。

如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。  

在分页存储管理方式中,如果不具备页面兑换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。

本实验通过程序模拟操作系统的基本分页存储管理方式,进一步理解这一内存分配方式的原理和特点,加深对理论知识的掌握。 

 

二、实验要求 

 1、用C语言或Java语言编写程序模拟操作系统对内存的基本分页存储管理方式  

2、程序要能正确对“内存”进行“分配”和“回收”,能接受用户的输入,显示内存的分配情况,并有一定的容错能力。  

3、每个人独立按时完成实验内容。 

三、实验方法

#include<iostream>
#include<iostream.h>
#include<iomanip.h>
#include<ctype.h>
#define N 6
#define M 4
struct{
    int lnumber;
    int flag;
    int pnumber;
    int write;
    int dnumber;
}page[N];

int p[M];
int head;
void initial(void);
intdo_mmap(int);
void do_page_fault(int);
void run_first_instructon(int);
void run_a_instruction(int);
void print_page_and_fifoqueue(void);
main()
{
    int laddress,paddress;
    int lnumber,ad,pnumber;
    print_page_and_fifoqueue();
    run_first_instructon(0x0000);
    cout<<"输入下一条指令的逻辑地址(0~32767)(-1 to end)"<<endl; 
    cin>>laddress;
    while(laddress>32767){
         cout<<"输入错误! 请重新输入下一条指令的逻辑地址(0~32767)(-1 to end)"<<endl; 
         cin>>laddress; 
    }
    while(laddress!=-1){ 
           lnumber=laddress>>10; 
            lnumber 
          if(page[lnumber].flag==1){ 
              paddress=do_mmap(laddress); 
          cout<<paddress<<"输出转换后的物理地址"<<endl; 
        run_a_instruction(paddress); 
        cout<<"此指令执行是否修改所在页lnumber="<<lnumber<<"(y/n?) "; 
        char change; 
        cin>>change; 
         if(tolower(change)=='y'){
             page[lnumber].write=1; 
             print_page_and_fifoqueue(); } 

        }
          else{ 
          cout<<lnumber<<"输出该页的页号--表示硬件产生缺页中断"<<endl; 
          do_page_fault(lnumber);
          continue; 
          } 
          cout<<"输入下一条指令的逻辑地址((0~32767),-1 to end)\n"; 
          cin>>laddress; 
         while(laddress>32767){ 
                 cout<<"worse(0~32767)(-1 to end)"<<endl; 
                 cin>>laddress; } 
    } 
    cout<<"进程运行结束!"<<endl; 
    system("PAUSE"); 
     return 0; 
} 
void initial(void) 

{ 
    int i; 
    for(i=0; i<=5; i++){ 
      page[i].lnumber=i; 
      if(i<=M-1){
          cout<<"输入页号为"<<i<<" 所在内存的物理块号(预装入前四个页面):"; 
          cin>>page[i].pnumber; 
         page[i].flag=1; 
      } 

 } 
 head=0; 
 for(i=0; i<=M-1; i++) 
     p[i]=i; 

} 
voidprint_page_and_fifoqueue(void) 

{ 

   int i; 
  cout<<"输出页表!\n"; cout<<setw(10)<<"lnumber"<<setw(9)<<"flag"<<setw(10)<<"pnumber"<<setw(10)<<"write"<<setw(10)<<"dnumber"<<endl; 
   for(i=0; i<=N-1; i++) 
   cout<<setw(7)<<page[i].lnumber<<setw(10)<<page[i].flag<<setw(10)<<page[i].pnumber<<setw(10)<<page[i].write<<setw(10)<<page[i].dnumber<<endl; 
cout<<"输出FIFO对列:\n"; 
cout<<setw(10)<<"NO"<<setw(40)<<"page(已在主存的页号lnumber)\n"; 
cout<<"head="<<head<<endl; 
for(i=0; i<=M-1;i++) 
cout<<setw(10)<<i<<setw(15)<<p[i]<<endl; 

} 
intdo_mmap(intladdress) 

{ 
intlnumber, ad, pnumber, paddress; 
lnumber=laddress>>10; 
ad=laddress&0x3ff; 
pnumber=page[lnumber].pnumber; 
paddress=pnumber<<10|ad; 
returnpaddress; 

} 
voidrun_a_instruction(intpaddress) 

{ 

 cout<<paddress<<" 输出物理地址--表示指令执行完成"<<endl; 

} 
 voidrun_first_instructon(intladdress) 

{ 

 intlnumber, ad, pnumber, paddress; 
 lnumber=laddress>>10;
 if(page[lnumber].flag==1) 
 paddress=do_mmap(laddress); 
 cout<<paddress<<"输出转换后的物理地址"<<endl; 
 run_a_instruction(paddress); 
 cout<<"此指令执行(0x0000)是否修改所在页面lnumber="<<lnumber<<"(y/n?) "; 
 char change; 
 cin>>change; 
 if(tolower(change)=='y'){ 
    page[lnumber].write=1; 
    print_page_and_fifoqueue(); 
} 
 cout<<"********第一条指令执行完成(地址为0x0000)***********"<<endl; 

} 
voiddo_page_fault(intlnumber) 

{ 
  int j; 
  j=p[head]; 
  p[head]=lnumber; 
   head=(head+1)%M; 
   if(page[j].write==1) 
  write_to_harddisk(j); 
 page[j].flag=0; 
page[lnumber].flag=1; 
page[lnumber].write=0; 
page[lnumber].pnumber=page[j].pnumber;
cout<<lnumber<<"输出该页--表示该页调入了主存"<<endl;
cout<<"按任意键将查看“页面置换”之后的页表page[N]和FIFO队列信息"<<endl; 
system("PAUSE"); 
print_page_and_fifoqueue(); 
}

四、实验总结

实验比较难以理解,因为学的知识太多,并不能什么都学精,希望自己可以慢慢地深入了解。

转载于:https://www.cnblogs.com/xy1015/p/4599132.html

一. 实验目的: 1.通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法 2.通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二.实验要求 实验程序由以下三大部分组成: (1) 通过随机数产生一个指令序列(实际上是指令的逻辑地址序列),共320条指令。指令的地址按下述原则生成: A:50%的指令是顺序执行的 B:25%的指令要实现向前跳转,均匀分布在前地址部分 C:25%的指令要实现向后跳转,均匀分布在后地址部分 具体的实施方法是: A:在[0,319]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1的指令 C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’ D:顺序执行一条指令,其地址为m’+1 E:在后地址[m’+2,319]中随机选取一条指令并执行 F:重复步骤A-E,直到320次指令 (2) 将每条指令的逻辑地址变换为页地址 设:页面大小为1K; 用户内存容量4页到32页; 用户虚存容量为32K。 在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为: 第 0 条-第 9 条指令为第0页(对应逻辑地址为[0,9]) 第10条-第19条指令为第1页(对应逻辑地址为[10,19]) ……………………………… 第310条-第319条指令为第31页(对应逻辑地址为[310,319]) 按以上方式,用户指令可组成32页。 (3) 分别使用FIFO算法和LFU算法,计算给用户进程的这32页分配4,5,…,32个页面(内存块)时其缺页率。
实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值