操作系统课程设计
要求
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表示当前未使用内存的大小。
后端到前端的渲染均依靠维护这三个变量。
主要算法代码
let free_area = [
{
index: 0,
size: 1024
}
]
// 当前内存使用状况
let ram = [
{
state: false,
size: 1024
}
]
// 剩余空间总和
let free_ram = 1024;
// 快速幂
var pow = function (x, n) {
let ans = 1;
for (let i = 0; i < n; i++) {
ans *= x;
}
return ans;
}
// console.log(pow(2, 10))
// 找到申请内存大小的二次幂
var findlistnum = function (size) {
for (var i = 0; i <= 10; i++) {
if (size > pow(2, i) && size < pow(2, i + 1)) {
return i + 1;
} else if (size == pow(2, i)) {
// console.log(i)
return i;
}
}
return false;
}
// 删除指定下标的数组元素并返回新数组
var deleteArrElement = function (index, arr) {
let newarr = {
deleteele: arr[index],
arr: arr
}
for (let i = index; i < arr.length; i++) {
arr[i] = arr[i + 1];
}
arr.length--;
newarr.arr = arr;
return newarr;
}
// 查找数组里面某对象的值是否是要找的值
var indexOfArrObj = function (value, arr) {
for (let i = 0; i < arr.length; i++) {
if (arr[i].size === value) {
return i;
}
}
return -1;
}
// 分配内存
// 参数为二次幂i,返回值为新的内存状态,空闲块状态,空闲内存大小;
var allocation = function (powi) {
// if(powi)
console.log(powi)
if (powi < 6) {
powi = 6;
}
let nowstate = {
ram: [],
free_area: [],
free_ram: 0
}
let blocksize = pow(2, powi)
// console.log(free_area)
if (free_area.length == 0) {
// 改成返回错误代码
return false;
} else if (free_area[0].size == 1024) {
let ramsize = 1024;
ram.pop()
free_area.pop()
for (let i = 10 - powi; i > 0; i--) {
ramsize = ramsize / 2;
let obj = {
index: i,
siz