动态分区分配实验报告

时间: 2023-08-21 22:07:39 浏览: 56
动态分区分配是一种内存管理技术,将内存分成若干个区域,每个区域的大小不同,根据程序的需要进行分配和回收。该技术可以提高内存利用率,减少内存碎片,并且可以动态调整内存分配,适应不同的应用场景。 本次实验主要是通过模拟动态分区分配的过程,来加深对动态分区分配的理解。 实验环境及工具:C++ 编译器,Visual Studio 2019。 实验步骤: 1. 定义数据结构 首先我们定义一个内存块的结构体,包含该内存块的起始地址、大小、是否被分配等信息: ```c++ struct MemoryBlock { int startAddr; // 起始地址 int size; // 大小 bool isFree; // 是否被分配 }; ``` 2. 模拟内存分配 接下来我们模拟内存的分配过程。首先定义一个动态数组来保存内存块的信息,然后按照一定的规则进行内存分配。这里我们采用了首次适应算法(First Fit)来进行内存分配: ```c++ void allocateMemory(vector<MemoryBlock>& mem, int size) { for (int i = 0; i < mem.size(); i++) { if (mem[i].isFree && mem[i].size >= size) { mem[i].isFree = false; if (mem[i].size > size) { MemoryBlock newBlock = { mem[i].startAddr + size, mem[i].size - size, true }; mem.insert(mem.begin() + i + 1, newBlock); } mem[i].size = size; cout << "分配了 " << size << "KB 内存,起始地址为 " << mem[i].startAddr << "KB" << endl; return; } } cout << "内存不足,无法分配" << endl; } ``` 该函数遍历内存块数组,找到第一个空闲内存块大小大于等于需要分配的内存大小的内存块,并将其分配出去。如果该内存块大小大于分配的大小,则将剩余部分插入到内存块数组中。 3. 模拟内存回收 当程序不再需要某个内存块时,需要将该内存块回收,以便下一次分配。这里我们采用了合并相邻空闲块的方法来进行内存回收。 ```c++ void freeMemory(vector<MemoryBlock>& mem, int startAddr) { for (int i = 0; i < mem.size(); i++) { if (mem[i].startAddr == startAddr) { mem[i].isFree = true; cout << "已释放 " << mem[i].size << "KB 内存,起始地址为 " << mem[i].startAddr << "KB" << endl; if (i > 0 && mem[i - 1].isFree) { mem[i - 1].size += mem[i].size; mem.erase(mem.begin() + i); i--; } if (i < mem.size() - 1 && mem[i + 1].isFree) { mem[i].size += mem[i + 1].size; mem.erase(mem.begin() + i + 1); } return; } } cout << "该内存块不存在,无法释放" << endl; } ``` 该函数遍历内存块数组,找到需要回收的内存块,并将其标记为空闲。然后检查该内存块的前后是否有空闲内存块,如果有,则将它们合并成一个更大的空闲内存块。 4. 模拟内存使用 最后,我们编写一个简单的程序来模拟内存的使用。该程序会不断地进行内存分配和回收,并且每次进行操作后会输出当前内存块数组的信息。 ```c++ int main() { vector<MemoryBlock> mem; mem.push_back({ 0, 1024, true }); // 初始化内存块 while (true) { cout << "1. 分配内存" << endl; cout << "2. 释放内存" << endl; cout << "3. 查看内存情况" << endl; cout << "4. 退出" << endl; cout << "请输入操作编号:"; int choice, size, addr; cin >> choice; switch (choice) { case 1: cout << "请输入需要分配的内存大小(KB):"; cin >> size; allocateMemory(mem, size); break; case 2: cout << "请输入需要释放的内存起始地址(KB):"; cin >> addr; freeMemory(mem, addr); break; case 3: for (int i = 0; i < mem.size(); i++) { cout << "起始地址:" << mem[i].startAddr << "KB,大小:" << mem[i].size << "KB,状态:"; if (mem[i].isFree) { cout << "空闲" << endl; } else { cout << "已分配" << endl; } } break; case 4: return 0; default: cout << "操作编号无效,请重新输入" << endl; } } return 0; } ``` 实验结果: 运行程序后,可以看到以下界面: ``` 1. 分配内存 2. 释放内存 3. 查看内存情况 4. 退出 请输入操作编号: ``` 输入 1 可以进行内存分配,输入 2 可以进行内存回收,输入 3 可以查看当前内存块数组的情况,输入 4 可以退出程序。下面是一些操作示例: ``` 请输入操作编号:1 请输入需要分配的内存大小(KB):256 分配了 256KB 内存,起始地址为 0KB 请输入操作编号:1 请输入需要分配的内存大小(KB):512 分配了 512KB 内存,起始地址为 256KB 请输入操作编号:3 起始地址:0KB,大小:256KB,状态:已分配 起始地址:256KB,大小:512KB,状态:已分配 请输入操作编号:2 请输入需要释放的内存起始地址(KB):0 已释放 256KB 内存,起始地址为 0KB 请输入操作编号:3 起始地址:0KB,大小:768KB,状态:空闲 请输入操作编号:4 ``` 可以看到,程序可以正常进行内存分配和回收,并且在操作后正确地合并了相邻空闲块,保证了内存块的连续性。 总结: 通过本次实验,我们深入了解了动态分区分配的原理,掌握了内存分配和回收的实现方法,提高了对内存管理的理解。

相关推荐

最新推荐

recommend-type

操作系统实验三——动态分区分配方式的模拟

本设计的目的是使学生熟悉存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行
recommend-type

计算机操作系统实验报告_动态分区分配方式的模拟

一是用C 语言实现对采用首次适应算法和最佳适应算法的动态分区分配过程ALLOC()和回收过程FREE(),其中空闲分区由空闲分区链来管理,进行分配时,系统优先使用空闲区底端空间。 二是假设初始状态下,可用内存空间...
recommend-type

操作系统 动态分区存储管理方式的主存分配回收实验报告

详细的实验报告 基于VC6.0实现的 动态分区存储管理方式的主存分配回收实验报告
recommend-type

操作系统可变分区存储管理方式的内存分配回收实验报告

带有流程图及注释源代码编写程序完成可变分区存储管理方式的内存分配回收。 具体包括:确定内存空间分配表; 采用最优适应算法完成内存空间的分配和回收; 编写主函数对所做工作进行测试。
recommend-type

操作系统实验五 主存空间的分配与回收 附代码

系统采用最优适应分配算法为作业分配主存空间,而且具有紧凑技术。请编程完成以下步骤: (1)、输出此时的已分配区表和未分配区表; (2)、装入 Job3(15K),输出主存...附加要求:增加分区移动策略,要求移动开销最小。
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

去除字符串s="ab23cde"中的数字,构成一个新的字符串"abcde"。

可以使用正则表达式来匹配并替换字符串中的数字: ```python import re s = "ab23cde" new_s = re.sub(r'\d+', '', s) print(new_s) # 输出:abcde ``` 其中,`\d` 表示匹配数字,`+` 表示匹配一个或多个数字,`re.sub()` 函数用来替换匹配到的数字为空字符串。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。