Linux内存管理之三 页的分配和释放

Linux对内存区内的页框的分配和释放,采用的算法是伙伴系统。


如上图,Linux分配页时,只能分配2^n个页。内核维护MAX_ORDER个链表,每个链表记录着连续的空闲页。第一个链表中的每一项为1个空闲页,第二个链表中的每一项为2个空闲页,第三个链表中的每一项为4个空闲页。。。,依次类推。分配页时,从对应的链表上摘除空闲页;释放页时,将对应的页归还到对应的链表。分配释放页的过程中,可能伴随着内存页的拆分和合并。比如要分配16个空闲页,但是对应的链表为空,这时如果32个空闲页对应的链表如果不为空,则从链表中摘除32个空闲页,并将其一分为二,其中16个页用于内存分配,剩余16个页则插入到16个页对应的链表中。

尽管页的分配算法是简单的,但是实际过程却非常复杂。这是因为分配页式必须考虑一下几点:
1 备用内存区。当从一个内存区无法得到内存时,系统会从同一内存节点的其它内存区或者从另一个内存节点中的内存区中获取内存。
2 页的换入和换出,在没有足够多的空闲页时,可能需要将页换出以获取空闲内存。
3 页的回收,对一些缓冲区的不再使用的页进行回收,以获取空闲页。
4 系统中必须保持一定“水位”的空闲页,以应付对内存的紧急分配。如果系统将页分配完,在急需内存时,再进行页的回收或换出,无疑是非常糟糕的设计。系统中必须保持一定量的内存页。
5 不同的分配策略。不同的分配策略可能采用的方法有区别。
总之,页的分配和释放需要考虑许多因素,尽量满足内存分配的同时,要保证系统的稳定性和健壮性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内存管理中的分配器是负责分配和管理物理面(Page)的一种机制。在内核中,物理面是以固定大小的块进行管理的,通常被称为面帧(Page Frame)。分配器的主要任务是从可用的物理内存分配面帧,并在需要时释放这些面帧。 Linux中有多种分配器,其中最常用的是伙伴系统(Buddy System)。伙伴系统将可用的物理内存划分为不同大小的块,每个块都是2的幂次方大小。当需要分配一块n个面帧大小的内存时,伙伴系统会找到一个大小为2的幂次方,并且大于等于n的最小块。如果找到的块大于n,则将该块分裂成两个小块,其中一个块将被分配,另一个块将被留作备用。如果找到的块恰好是n,则将该块分配出去。如果没有合适的块可用,则会尝试从内存释放一些面帧来获得可用的内存。 伙伴系统的优点是效率高,分配释放内存的速度都很快。它还可以避免内存碎片的问题,因为它只分配大小为2的幂次方的块,这些块可以非常有效地组合在一起,而不会留下任何碎片。但是,伙伴系统的缺点是它会浪费一些内存。当一个块被分割成两个小块时,其中一个块可能永远不会被使用,从而浪费了一些内存。 除了伙伴系统之外,Linux还提供了其他的分配器,如SLAB和SLUB。这些分配器适用于不同的场景,具有不同的优缺点。在实际应用中,应该根据具体的需求选择适合的分配器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值