操作系统课程设计
要求
Linux中内存分配的伙伴堆算法模拟。
(1)模拟内存实始情况。
(2)实现Buddy heap算法。
(3)通过键盘输入随机产生的申请和释放操作。
(4)每次申请或释放都显示实时的内存分配的对比图。
实现结果:
伙伴算法:
Linux把空闲的页面按照页块大小分组进行管理。用数组管理各个空闲页块组。当进程提出存储请求时。系统按照Buddy算法。根据请求的 页面数在free_area口对应的空闲页块组中搜索。linux并不是按 照要求的页块的数目去进行分配.而是将大于、等于这个数目的 最小2n个页块分配出去。比如,要求3个页块。就分配2-2=4块;要求16个页块,就分配24=16块.如此等等。因此,系统总是按 照进程所需连续存储块的申请数量。到空闲区队列free 中 能够满足要求的最小空闲区队列里查找。当队列不空时,就把第一个空闲区分配出去。如果该队列为空.那么就继续查找下面的队列(其空闲区的尺寸为上一个队列的2倍)。当它里面有空闲区时,就把该空闲区一分为二:一个分配出去给进程使用;余下的一半.排到它上面的空闲区队列中去。
在内存页面释放时。系统将做为空闲页面看待。然后检查是否存在与这些页面相邻的其它空闲页块,若存在,则合为一 个连续的空闲区按Buddy算法重新分组。
利用JavaScript的对象数据类型和数组来存储相应的内容。
// 空闲块
let free_area = [
{
index: 0,
size: 1024
}
]
// 当前内存使用状况
let ram = [
{
state: false,
size: 1024
}
]
// 剩余空间总和
let free_ram = 1024;
其中free_area表示空闲块数组,数组中的每一个对象表示空闲块信息,index对应当前内存ram数组中空闲块的分块的下标,size表示该空闲块大小。
其中ram表示内存使用状态数组,数组中的每一个对象表示分块,state表示该块是否被使用,state为true表示已使用,反之为未使用。
其中free_ram表示当前未使用内存的大小。
后端到前端的渲染均依靠维护这三个变量。
主要算法代码
1 | let free_area = [ |