实验五 存储管理实验

一,实验目的

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

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

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

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

 

二,实验内容和要求

实验内容:本实验假定内存空间已经按块划分,目标程序无需关心内存块大小等底层细节,只需按算法对内存块进行分配即可。程序应该实现以下功能:

  1、内存初始化。假定内存块共有N个,初始化后的内存空间应该有一部分已经被使用,这可以用随机数或程序内部的其他算法完成。

  2、程序应该能接受用户输入的进程信息,并为之分配内存,返回分配结果(成功或失败),注意,此处应该考虑到不合法的输入并进行相应处理。

  3、程序能回收用户指定的进程所占用的内存空间,因此,程序可能需要为每个进程分配一个唯一的进程号并给出详细的提示信息。

  4、能直观合理地显示内存分配情况。

  5、程序界面友好,便于操作和查看运行结果。

  实验要求:

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

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

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

 

三、主要程序及其解释

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 struct memory{
  5     int memory_number;
  6     char proname; 
  7 };
  8 struct memory memory_table[20]={0};
  9 struct page{ 
 10     
 11     char proname;//进程名称
 12     int prosize;//进程大小  
 13     int pagetable[10];//进程页表
 14 };//页表
 15 struct page page_table[10]={0};
 16 
 17 int allocate(int memorysize,int i,int pagesize);//为进程分配内存空间
 18 int reclaim(int memorysize,char proname);//释放进程占用的空间
 19 
 20 void output();
 21 int main()
 22 {
 23     int pagesize;//分页大小
 24     int memorysize=80;//内存大小
 25     char proname;
 26     int choice;//操作选择
 27     int i;
 28     
 29     printf("Please enter the page size:");
 30     scanf("%d",&pagesize);
 31     //初始化
 32     for(i=0;i<20;i++)
 33     {
 34         memory_table[i].memory_number=i;
 35         memory_table[i].proname='0';
 36     }
 37     for(i=0;i<10;i++)
 38     {
 39         page_table[i].proname='0';
 40         
 41     }
 42     srand((unsigned)time(NULL));
 43     for(i=0;i<7;i++)
 44     {
 45         
 46         int number=rand()%19+1;
 47         memory_table[number].proname='a';
 48         memorysize--;
 49     }
 50     output();
 51     //进入存储分配
 52     while(memorysize!=0)
 53     {
 54         printf("Selecting Operation\n1.Allocate  2.Reclaim\n");
 55         scanf("%d",&choice);
 56         if(choice==1)
 57         {
 58             for( i=0;i<10;i++)
 59             {
 60                 if(page_table[i].proname=='0')
 61                 {
 62                     getchar();
 63                     printf("Please enter process name:");
 64                     scanf("%c",&page_table[i].proname);
 65                     getchar();
 66                     printf("Please enter process size:");
 67                     scanf("%d",&page_table[i].prosize);
 68                     break;
 69                 }
 70             }
 71             memorysize=allocate(memorysize,i,pagesize);
 72         }else
 73         {
 74             printf("Please enter process name:");
 75             getchar();
 76             scanf("%c",&proname);
 77             memorysize=reclaim(memorysize,proname);
 78         }
 79         
 80         output();
 81     }
 82     
 83     
 84     return 0;
 85 }
 86 
 87 
 88 
 89 int  allocate(int memorysize,int i,int pagesize)
 90 {
 91     int k;
 92     int j;
 93     for(k=0;k<(page_table[i].prosize/pagesize);k++)
 94     {
 95         for( j=0;j<20;j++)
 96         {
 97             if(memory_table[j].proname=='0')
 98             {
 99                 memory_table[j].proname=page_table[i].proname;
100                 page_table[i].pagetable[k]=j;
101                 memorysize--;
102                 break;
103                 
104             }
105         }
106         
107     }
108     return memorysize;
109 }
110 
111 int reclaim(int memorysize,char proname)
112 {
113     int j;
114     int k;
115     for( j=0;j<20;j++)
116     {
117         if(memory_table[j].proname==proname)
118         {
119             memory_table[j].proname='0';
120             
121             memorysize++;
122             
123             
124         }
125     }
126     for (j=0;j<10;j++)
127     {
128         if(page_table[j].proname==proname)
129         {
130             page_table[j].proname='0';
131             page_table[j].prosize=0;
132             for(k=0;k<10;k++)
133             {
134                 page_table[j].pagetable[k]=0;
135             }
136             
137             break;
138             
139         }
140     }
141     return memorysize;
142 }
143 
144 
145 
146 void output(){
147     int i;
148     printf("————————memory allocation——————————\n");
149     printf("     Physical Block No.   Process Name\n");
150     for(i=0;i<20;i++)
151     {
152         
153         printf("        %d                          %c\n",memory_table[i].memory_number , memory_table[i].proname);
154     }
155 }

运行结果如下:

四,实验总结

这个实验是这学期最后一个实验了,发现有些松懈,没有太用心去写思考,直接参考其他人的代码,这是很不好的习惯。不过有去看代码理解代码。而这个实验是存储管理的,理解代码后也加深了课本知识的理解。

转载于:https://www.cnblogs.com/zhengyh/p/4599171.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一. 实验目的: 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 实验要求 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值