操作系统第5次实验报告:内存管理

姓名:傅伟杰

学号:201821121018

班级:计算1811

1. 记录内存空间使用情况

 

 

 根据实验课内容可知,需要进行上述链表allocated_block的定义,这个结构体用来对各个进程被分配到的内存进行具体的描述,其中具体描述包括了:pid(进程id),size(进程),start_addr(开始地址),pro_name[](进程名数组),next(next指针)。

另外还需要定义一个链表的头指针,这个链表计算机的内存块信息,头指针初始值设置为空,一旦进行内存分配了,头指针进行向下移动。

2. 记录空闲分区

 

 

 创建一个空闲链表,用来对内存空闲分区进行描述,具体描述包括:size(大小),start_addr(起始地址),next(next指针)。

同理,跟上述一致的,也要定义链表的头指针,一旦内存空间进行了初始化之后,所有的内存分区就都是所谓的空闲分区了。

上述的2个链表的定义,为下面的内存分配算法,内存释放算法,提供了最基本的条件。

3.内存分配算法

首次适应算法

 

 

地址排序

我使用了首次适应(First Firt)算法,首先从空闲分区表的第一个表开始查找该表,把第一个能够满足要求的空闲分区分别给作业,这个方法的目的在于减少查找时间。为了能够适应这个算法, 我的空闲分区表中空闲分区需要按地址从第低到高进行排序,该算法有限使用低地址部分的空闲区,在低地址空间造成许多小的空闲区,在高地址空间保留打的空闲区。

4. 内存释放算法

 

 

 

 

 

 

 

 

 

 

 内存的释放算法需要进行到结束进程,将已经分配给刚刚结束的进程的内存空间进行还原,删除该节点内存分配的信心,以及最后的如何进行空闲分区链表的更新,在我的理解下,应该是对新释放的节点插入到控股先分区的链表的结尾处,然后对空闲链表按照地址进行重新排序(是否有序),然后检查是否存在可以合并的空闲分区,如果有,要进行合并,最后对空闲分区链表进行排序,需要注意的时这里的地址的重新排序需要跟我们的内存分配算法相匹配,我采用的时首次适应算法,所以这里的地址应该时从低到高有序排序。

5. 运行结果

 

编译运行所写程序

 

 

 输出结果:

 

 

 

 

 

 

 

 

 

 

 数据测试实现:

 

 

 

 

 

 

 

 

 通过双重for循环的嵌套,外层控制释放内存是否达到10次,内层控制进程是否分配满,内层循环结束进行判断,是否全部分配完成或者达到了10次,如果满足条件,进行释放进程所占用的内存空间,并输出使用情况,不满足条件,则进行进程的随机分配,并输出内存的使用情况。

 

下面对前4组数据进行具体的内容分析:

说明:我设置的初始空闲分区的内存范围为0-1024。

1.为进程process_02分配了起始地址为0,大小为84的内存空间,分配结束后空闲分区的剩余存储地址从84开始,大小为940的空间。

2.为进程process_03分配了起始地址为84,大小为106的内存空间,分配结束后空闲分区的剩余存储地址从190开始,大小为834的空间。

3.为进程process_01分配了起始地址为190,大小为17的存储空间,分配结束后空闲分区的剩余存储地址从207开始,大小为817的空间。

4.释放了进程process_03(起始地址为84,大小为106)的内存空间,进行释放之后空闲分区剩余存储地址有起始地址为84,大小为106的空间和起始地址为207,大小为817的空间。

6. 参考资料

https://www.cnblogs.com/XNQC1314/p/9065236.html

https://github.com/

posted @ 2020-05-15 17:05  Vijay1  阅读(189)  评论(0编辑  收藏  举报