JavaScript实现linux内存分配的buddy算法

操作系统课程设计

要求

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值