关于内存的分配问题

现在我所知道的有两种 第一种是边界标志法 和在Linux底下内存机制分配方法 就是伙伴系统


什么叫边界标志法 内存可以分配当然也回收

有3种方式分配 

第一种叫做首次拟合法 

第二种叫做最佳拟合法

第三种叫做最差拟合法


比如说是一块这样的内存

我想申请150的内存 那么如何申请

首次拟合法就是 100放不下就看下一个块 比如是300那么就把300给 划分给用户

最佳就是找一遍发现150刚刚够 那么就把150给划分给用户

最差拟合法就是找到了500就把500划分给用户(并不是说最差,最差只是一种方式可以说名字叫最差而已)


那么边界标记法就是管理你分配的内存

我们来拿300举例子

首先想要管理分配出去想要得到位置 那么就一定要有东西可以识别 那么 可以定义一个标记 flag 来表示有没有分配出去

如何找到这个块那么 就应该有头地址

如何找到下一块的位置那么就应该有尾地址

结构如图

foot的tag可能还不知道有什么用把

但是还得想一下 其实从本质上讲你管理内存的时候是通过一个链表管理的 我们分了模块对吧 (ps如果用数组感觉其实也可以只是你得遍历这个数组 还得一个一个判断 是否被标记了(个人觉得就是这样的))

如果你申请了 300的内存块 那么 但是实际上只用了100 那么是不是还有200剩余。。。 太浪费了 那么我们也可能再一次分配50个出去 那么如何还所以这个时候head和foot排上用处了  如果说我们还的是之前的100 那么我们就直接叉入到150的后面也就是rlink->100 然后再100 的link->150; 如果这个时候我们还回了50 那么我们如何找到之前的100呢

就是通过foot的tag 如果是1那么就说明前面是占用的你就直接又在100rlink后面接就是了 (其实也可以通过uplink获取tag)因为uplink指向的就是这个节点的首元素地址 意思是说基本上能通过 后面节点了解前面节点的信息

 而边界标志就是这个foot的tag咯

伙伴系统则是一个二倍的 是不需要这个foot节点 因为可以直接通过加size或者减size 如何知道是加size还是减size 你就要看 相对地址/大小如果是个单数那么就是左块如果是个偶数就是一个右块


比如

找下规律就知道了 是通过这样来合并两个项的 其他的和边界标志法没有区别  所以说伙伴系统都是二的倍数咯







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值