Buddy伙伴堆内存管理算法

参考了三篇博客的内容,一篇的界面,一篇的算法和一篇的原理解释,都对代码进行了一定的改变,界面增加了很多部分,内部的话可变性提高,动态适应数据变化。

可以与这三篇博客内容对比着看,便于理解算法。

理解的话看
https://blog.csdn.net/orange_os/article/details/7392986

界面参考了
https://blog.csdn.net/u014071802/article/details/30716975?utm_source=blogxgwz1

主函数用了下面这个,更改了部分数据结构
https://blog.csdn.net/qq_24369113/article/details/53681293 
 
 

一、实验目的及要求

①空闲页面分为10个块组,块组编号为0,1,2,……,8,9;

②内存空间及其划分(界面如下图):

●内存物理空间大小可选择:256M bytes,512M bytes;

●每个页框的大小可选择:1K bytes,2K bytes,4K bytes;

●对选择的内存空间及其划分,当所有内存为空闲时,显示其各块组空闲区链表的内容;

●随机指定多个不连续占用的内存空间(每块占用空间包括2i个连续的页框),显示各块组空闲区链表的内容;

●基于内存当前情况,随机产生申请的页框数m,显示满足m个页框的申请后,块组空闲区链表的内容;

●基于内存当前情况,随机产生被占用的(页框号,块组号)释放,显示释放后块组空闲区链表的内容。

二、系统总体功能

 系统整体界面:          

 

 

系统运行界面

 

 

用户可以选择手动输入或者选择系统内置的信息去初始化程序的内部,然后通过点击自动运行按钮开始执行程序,并通过暂停、继续和下一步去控制流程,更深入的了解内部构造与真实的运行过程,程序就会在日志部分、文档部分和动态显式部分来分别显式具体的信息。

二、功能模块划分

 

系统总体功能模块构成图:

 

 

各子模块功能及功能流程图如下

●内存使用模块:

在该模块对应的显示框中,不同颜色的长方体对应不同的进程,在该框中的全部长方体表示在内存中得到分配正在进行的全部进程,每个长方体有对应编号,对应着各自的进程,当显示框中全部被有颜色的长方体占据时,表示内存已经全部分配完毕,已经无空间可以分配。

 

 

●进程列表模块:

在该模块对应的显示框中,不同颜色的长方体对应于不同的进程,长方体中数字表示了不同的进程编号。当一个进程需要申请空间时,首先会进入到该进程列表模块的显示框中,再开始进行内存分配,若有足够满足进程要求的空间,则对其进行分配,该进程进入到内存使用模块,同时将进程列表模块中该进程对应的长方体删除掉。若是没有足够的内存空间,则该进程一直保留在进程列表模块中,直到有足够的空间对其进行分配为止。

 

 

●进程申请情况模块:

该模块对应的显示框中,显式了所有进程的内存分配情况,申请失败则无进程信息,申请成功则显示进程分配空间的地址信息,开始执行,以及进程运行所需时间。Time表示随时间的推移,每一个time是一个单位时间。

 

 

●进程释放模块:

    该模块对应的显示框中,显式了所有进程的内存释放情况。Time表示随时间的推移,每一个time是一个单位时间。在每个单位时间没有内存释放则不输出信息,若有内存释放则显式释放的是哪一个进程,以及该进程所占用的地址空间,所占用内存大小信息。

 

 

●日志模块:

    该模块对应的显示框中,显式了所有内存块的地址分配情况,从初始情况和每一个进程开始时所有的内存块的分配地址情况,都会记录下来,以备需要时查看。

 

 

●内存大小及页框大小输入模块:

       在改模块对应的显示框中,有多个选择框,最开始有选项输入和手动输入选择框,当用户选择选项输入时,则内存大小和页框大小的选择只能从复选框中选择。若用户选择手动输入时,则内存大小和页框大小的选择需要用户在文本框中单独输入。

 

 

●运行模块:

       在改模块对应的显示框中,有多个按钮。在选择好内存大小和页框大小之后,点击自动运行即可开始程序的运行,点击暂停可使程序暂停,点击下一步按钮则可以使程序分布进行,每一次只执行一个动作,可方便用户观察进程分配情况,点击继续按钮,则程序回复自动执行情况。

 

 

三、详细设计

 

       在这次伙伴堆算法的内存分配和释放实验代码中,我们主要运用的数据结构有Map(映射)、List(列表),这两种数据结构。

 

(来自百度)

 

Map及List的定义:

public Map<Integer, List> FreeMemory = new HashMap<>();

 

Map内部List及Map本身的初始化操作:

for (int i = 0; i < blockgroup_sum; i++) {//初始化map,以及所有的区块list,给最大的块一个初始值

            List<int[]> list = new ArrayList<int[]>();

            FreeMemory.put(block_name((int) pow(2, i)), list);

        }

定义的FreeMenory在到处使用:

FreeMemory.get(new Integer((int) Math.pow(2, blockgroup_sum - 1) * pageframe_size)).add(new int[]{0, freememory_size - 1});

   

 

 

全部源码在GitHub项目上,用IDEA开发,eclipse版本也在源码文件里,也有jar包。

https://github.com/STK0210/Buddy

posted @ 2019-01-14 11:09  STK0210  阅读(966)  评论(0编辑  收藏  举报