# 操作系统内存管理项目:
# 计算机内存管理模拟系统
# 一、分析
## 1.1 项目目的
- 加深对动态分区存储管理方式及其实现过程的理解。
- 加深对请求调页系统的原理和实现过程的理解。
- 进一步掌握动态分区中的首次适应算法和最佳适应算法。
- 进—步掌握请求分区置换算法,本系统实现了 FIFO 和 LRU 两种算法
- 通过设计图形界面对计算机内存管理过程进行模拟。
## 1.2 项目功能要求
**动态分区分配方式的模拟:**
要求:假设初始态下,可用内存空间为 640K,并有下列请求序列,请分别用首次适应算法和最佳适应算法进行内存块的分配和回收,并显示出每次分配和回收后的空闲分区链的情况来。
给定任务列表:
- 作业 1 丰请 13OK
- 作业 2 申请 6OK
- 作业 3 申请 100k
- 作业 2 释放 6OK
- 作业 4 申请 200K
- 作业 3 释放 100K
- 作业 1 释放 130K
- 作业 5 申请 140K 作业 6 申请 60K
- 作业 7 申请 50K
**请求调页存储管理方式模拟:**
**内容**:假设每个页面可存放 10 条指令,分配给一个作业的内存块为 4。模拟一个作业的执行过程,该作业有 320 条指令,即它的地址空间为 32 页,目前所有页还没有调入内存。
在模拟过程中,如果所访问指令在内存中,则显示其物理地址,并转到下一条指令;如果没有在内存中,则发生缺页,此时需要记录缺页次数,并将其调入内存。如果 4 个内存块中已装入作业,则需进行页面置换。
所有 320 条指令执行完成后,计算并显示作业执行过程中发生的缺页率。
置换算法可以选用 FIFO 或者 LRU 算法。
作业中指令访问次序可以按照下面原则形成:50% 的指令是顺序执行的,25% 是均匀分布在前地址部分,25% 是均匀分布在后地址部分。
### 题目分析
根据题目要求,系统需要模拟的计算机功能分为动态分区和请求分区两种,这两种从实现方法的角度又能各自分为两种,相当于系统需要执行四种算法,输出相应的结果,并通过相应的界面将模拟过程和结果进行呈现。
系统设计的基本思路,是用户可通过 button 按钮自由选择模拟内容,系统监听鼠标点击后跳转到相应的模拟页面。
# 二、设计
## 2.1 类结构设计
按照之前的分析,系统的类结构只设计了两种:一类是界面,另一类用来存放对象。由于整个系统需要四个模拟结果页面、选择"FF 还是 BF 算法"的子页面、选择"FIFO 还是 LRU"算法的子页面和选择“动态模拟还是请求模拟"的主页面,而最终的模拟结果页面两两类似,可以只用两个页面类分别呈现动态分区和请求分区的结果,所以系统总共包含五个页面类,以及存储进程对象的 Process 类和存储块对象的 Block 类。
系统的类结构总体比较简单,类总要只有七个,它们以页面跳转为脉络,相互衔接方便用户点选。
## 2.2 成员操作设计
在本 Java 系统中,Process 类与 Block 类相当于 C 语言中的结构体,充当自定义类型的作用。除此以外,其他的五个页面类具有许多类似的成员操作,这里将它们总体概述。
页面类的主要操作为绘制页面和执行算法。绘制页面即绘制系统为满足用户需要设置的标签、按钮等,按钮分别对应鼠标监听,所以五个页面都包含响应鼠标监听、跳转到下一页面的操作,以除了主页面外的所有页面都包含的“返回"键为例:
```c++
类中:JButton jb=null;
构造函数中︰jb=new JButton("返回"");
jb.addActionListener(this);//加入事件监听
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()=="返回"){
this.dispose();
)
}
```
## 2.3 界面设计
模拟系统的界面设计较为简单,使用 Java.swing 中不同的布局方式将标签、按钮、文本框和表格等元素铺排在 JFrame 窗口。主页面和选择算法页面尺寸较小,只包涵两个选择按钮和一个返回按钮,简单清晰,在动态分布模拟结果界面,系统使用两个表格呈现 1~11 步之后的内存情况,在请求分区模拟结果页面,系统使用两个文本域展示产生的 320 个随机数和对应的调用页面,用两个文本框呈现缺页数和缺页率。
由于页面总数较少,所有的页面图片将在后面的部分呈现。
### 2.3.1 算法设计
动态分布模拟算法包括 FF 和 BF,由于这两种方法的回收方式是相同的,所以系统用三个函数来实现这两种算法,它们是 BF 分配、FF 分配和 Free 回收函数。
请求分区模拟算法包括 FIFO 和 LRU,函数设计分为随机数生成、初始化块、Exist、Space 等。
部分核心代码片段将在下一部分给出。
# 三、实现
## 3.1 FF 实现
```c++
static void FF(int number, int size, int task) {
Process date = new Process();
date.number = number;
date.length = size;
int i;
for ( i = 0; i < list.size(); i++) {
if (date.length <= ((Process)list.get(i)).length && ((Process)list.get(i)).flag
== 0) {
break;
}
}
if (i == list.size()) {
System.out.println("没有足够的内存进行分配");
}
if (((Process)list.get(i)).length - date.length <= 4 && i != list.size() - 1 ) {
Process)list.get(i)).number = date.number;
Process)list.get(i)).flag = 1;
} else {
date.flag = 1;
Process)list.get(i)).length -= date.length;
date.startAddress = ((Process)list.get(i)).startAddress;
Process)list.get(i)).startAddress += date.length;
list.add(i, date);
}
disPlay(task);
}
```
## 3.2 BF 实现
```c++
static void BF(int number, int size,int task) {
Process date = new Process();
date.number = number;
date.length = size;
int m, j;
Process target = new Process();
for (m = 1; m < list.size()-1; m++) {
= m;
target.number = ((Process)list.get(m)).number;
target.flag = ((Process)list.get(m)).flag;
target.length = ((Process)list.get(m)).length;
target.startAddress = ((Process)list.get(m)).startAddress;
while(j>0 && ((Process)list.get(j-1)).length>target.length) {
Process)list.get(j)).number = ((Process)list.get(j-1)).number;
Process)list.get(j)).flag = ((Process)list.get(j-1)).flag;
Process)list.get(j)).length = ((Process)list.get(j-1)).length;
Process)list.get(j)).startAddress =
Process)list.get(j-1)).startAddress + ((Process)list.get(j)).length;
j--;
}
Process)list.get(j)).number = target.number;
((Process)list.get(j)).length = target.length;
Process)list.get(j)).flag = target.flag;
Process)list.get(j)).startAddress = target.startAddress-
Process)list.get(j+1)).length;
}
int i;
for ( i = 0; i < list.size(); i++) {
if (date.length <= ((Process)list.get(i)).length && ((Process)list.get(i)).flag == 0) {
//当有合适的内存,且未被利用
break;
}
}
if (i == list.size()) {
}
if (((Process)list.get(i)).length - date.length <= 4 && i != list.size() - 1 ) {
Process)list.get(i)).number = date.number;
Process)list.get(i)).flag = 1;
}
else {
//分片分配内存
date.flag = 1;
Process)list.get(i)).length -= date.length;
date.startAddress = ((Process)list.get(i)).startAddress;
((Process)list.get(i)).startAddress += date.length;
list.add(i, date);
}
disPlay(task);
}
```
## 3.3 FIFO 实现
```c++
void FIFO() {
Rand();
initiate();
int exist, space, position;
int curpage;
for (int i = 0; i < 320; i++) {
pc = temp[i];
cu
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
100013116-基于Java实现计算机内存管理模拟系统.zip (28个子文件)
neicunguanli
Memory可执行文件.jar 13KB
LICENSE 1KB
Memory management源代码
.classpath 295B
.settings
org.eclipse.jdt.core.prefs 587B
src
Dyncompute.java 3KB
Block.java 54B
Dynamic.java 9KB
Process.java 677B
Homepage.java 1KB
Request.java 4KB
Reqcompute.java 2KB
bin
Request.class 5KB
Block.class 281B
Dyncompute.class 4KB
Dynamic.class 6KB
Process.class 1KB
Homepage.class 2KB
Reqcompute.class 3KB
.project 376B
img.doc-md
7-9a00cbf96249c4efa05526c6b9656a6d.png 136KB
2-a97397d6cfa1451edaff8e0d8e529966.png 46KB
4-472adaa76fa0014eaaba596b02f1bfcd.png 112KB
3-10c7b83f5cfde472d244293100e96504.png 40KB
6-1f83a3f80635b373e3238b34172c2481.png 131KB
5-2d36d2c90de70950d69a523b1c8d9081.png 119KB
1-133721ae4f0993c33e5ff989860e8d4b.png 37KB
计算机内存管理模拟系统.pdf 1.08MB
README.md 10KB
共 28 条
- 1
资源评论
神仙别闹
- 粉丝: 2687
- 资源: 7649
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- flowable-designer-5.22.0.zip
- threadmanager.cpp
- 腾讯云小程序 - 一站式开发与部署平台
- 基于JSP+Java+Servlet采用MVC模式开发的购物网站+源码(毕业设计&课程设计&项目开发)
- fastgestures安装包,模拟mac的触控板收拾,两指代表右击, 三指拖拽
- 基于组态王的升降式横移立体车库控制系统+源码(毕业设计&课程设计&项目开发)
- 基于python+Django和协同过滤算法的电影推荐系统+源码(毕业设计&课程设计&项目开发)
- 环境配置 vscode+jupyter
- 项目全部代码,还包含使用到的图片
- 项目全部代码,还包含使用到的图片
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功