内存管理的读书笔记

我继续我的任务!今天获得的信息对论文可能没有生命帮助,但是对于将来也许有跟总要的作用。因为我相信MyOS(51)如果能够长大,它见来一定需要内存管理机制的。
[size=5]内存管理[/size]
知道内存管理系统的能力可以辅助应用设计并且有助于避免陷阱。如果使用到动态的进程建立,就需要分配给进程一定的资源,其中包括内存资源。还有在其它时刻,有的系统支持动态的建立数据结点或者其它什么动态变量。就需要面对几个问题,就是分配出去的如何收回?分配的时候产生了碎片怎么办?回收的时候如何将相邻的两块合并成为一个大块?如何处理嵌套调用后上级被回收,而下级被遗忘成为即无用又不死的东西?
使用其余的内存进行动态内存分配,此内存区域被称为堆(heap)。这里要提出一个要引入数据字典的对象——控制块(control block),用来维护内存区域堆的内部信息。信息包括:其实地址、大小、分配表。
一个有效的内存管理者必须快速的进行以下的零散工作。
*判定空闲的内存是否已经满足分配的要求。
*更改内部管理信息。
*判断刚刚释放的块是否可以与相邻的空闲块合并成一大块。
涉及到的对象有分配数组(allocation array),用来实现分配映射。找出最适合分配空间位置的用堆,用来做堆排序。

书中提到了两个操作,分配malloc和释放free。
[color=Red]Malloc[/color]
在分配块的时候,空闲或使用的区域用分配数组来记录。表示空闲区域的首个单元与最后一个单元填入空闲区的个数。如果分配出了块,则在第一个分配单元中赋值为负数的分配长度,最后一个单元赋值为0来表示边界。为了找出最适合的空闲块区域,使用建堆的方式记录所有空闲块的大小和位置。无论是分配了还是释放了内存块,都要在这里登记在案。
[color=Red]Free[/color]
在释放块的时候,除了更改掉被释放块的首尾单元的值。还要判断相邻的单元是否可以合并。如果可以合并,要将两个单元的空闲块总数相加,赋值给这个空闲块的首尾单元。之后还要在堆上加入一个新的结点,把合并掉的结点删除。再次建堆!

再说说碎片的问题。碎块分为内部碎块和外部碎块。为了便于管理大面积的内存,所以将堆按照一定字节分配为一个个等面积的块。分配掉的块不可能完整的用完,块内部属于的存储空间被称为[color=Red]内部碎片[/color]。另一种是由于不断的分配和释放在占用的块之间形成了一个个过于小而无法分配出去的零散的块。这些空间被成为[color=Red]外部碎片[/color]。

[size=4]嵌入式系统中固定尺寸的内存管理[/size]

在那些具有可预测环境,在运行开始角知道运行任务的个数并且初始化时知道所要求的内存尺寸的应用系统,就比较适合使用[color=Red]内存池[/color]。它的结构是一个单向链表。链表上的结点是尺寸相同的块。为了处理不同大小的应用,使用多条链表。所以这个只适合可预知的环境中,用户操作固定或次数少的系统。它普遍用于嵌入式网络编程,如嵌入式协议栈的实现。

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值