固定存储量分配程序很容易实现,而且便于计算内存碎片,至少在块存储量的数量较少时是这样 。但这种分配程序的局限性在于要有一个它可以分配的最大存储量 。固定存储量分配程序速度快,并可在任何状况下保持速度 。这些分配程序可能会产生大量的内部内存碎片,但对某些系统而言,它们的优点会超过缺点 。
减少内存碎片
内存碎片是因为在分配一个内存块后,使之空闲,但不将空闲内存归还给最大内存块而产生的 。最后这一步很关键 。如果内存分配程序是有效的,就不能阻止系统分配内存块并使之空闲 。即使一个内存分配程序不能保证返回的内存能与最大内存块相连接(这种方法可以彻底避免内存碎片问题),但你可以设法控制并限制内存碎片 。所有这些作法涉及到内存块的分割 。每当系统减少被分割内存块的数量,确保被分割内存块尽可能大时,你就会有所改进 。
这样做的目的是尽可能多次反复使用内存块,而不要每次都对内存块进行分割,以正好符合请求的存储量 。分割内存块会产生大量的小内存碎片,犹如一堆散沙 。以后很难把这些散沙与其余内存结合起来 。比较好的办法是让每个内存块中都留有一些未用的字节 。留有多少字节应看系统要在多大
程度上避免内存碎片 。对小型系统来说,增加几个字节的内部碎片是朝正确方向迈出的一步 。当系统请求1字节内存时,你分配的存储量取决于系统的工作状态 。
如果系统分配的内存存储量的主要部分是 1 ~ 16 字节,则为小内存也分配 16字节是明智的 。只要限制可以分配的最大内存块,你就能够获得较大的节约效果 。但是,这种方法的缺点是,系统会不断地尝试分配大于极限的内存块,这使系统可能会停止工作 。减少最大和最小内存块存储量之间内存存储量的数量也是有用的 。采用按对数增大的内存块存储量可以避免大量的碎片 。例如,每个存储量可能都比前一个存储量大20% 。在嵌入式系统中采用“一种存储量符合所有需要”对于嵌入式系统中的内存分配程序来说可能是不切实际的 。这种方法从内部碎片来看是代价极高的,但系统可以彻底避免外部碎片,达到支持的最大存储量 。
将相邻空闲内存块连接起来是一种可以显著减少内存碎片的技术 。如果没有这一方法,某些分配算法(如最先适合算法)将根本无法工作 。然而,效果是有限的,将邻近内存块连接起来只能缓解由于分配算法引起的问题,而无法解决根本问题 。而且,当内存块存储量有限时,相邻内存块连接可能很难实现 。
有些内存分配器很先进,可以在运行时收集有关某个系统的分配习惯的统计数据,然后,按存储量将所有的内存分配进行分类,例如分为小、中和大三类 。系统将每次分配指向被管理内存的一个区域,因为该区域包括这样的内存块存储量 。较小存储量是根据较大存储量分配的 。这种方案是最先适合算法和一组有限的固定存储量算法的一种有趣的混合,但不是实时的 。
有效地利用暂时的局限性通常是很困难的,但值得一提的是,在内存中暂时扩展共处一地的分配程序更容易产生内存碎片 。尽管其它技术可以减轻这一问题,但限制不同存储量内存块的数目仍是减少内存碎片的主要方法 。
现代软件环境业已实现各种避免内存碎片的工具 。例如,专为分布式高可用性容错系统开发的 OSE 实时操作系统可提供三种运行时内存分配程序:内核alloc(),它根据系统或内存块池来分配;堆 (),根据程序堆来分配; OSE 内存管理程序,它根据内存管理程序内存来分配 。
- 外部碎片内部碎片
- MOS管的工艺和工作原理
- 古埃及动物木乃伊内部结构豺狼体内含人骨
- 揭秘:义字当头的梁山内部是怎样的派系丛生
- 历史上诸葛亮北伐的真实目标:清除内部异己李严
- 生命力碎片有什么用 生命力碎片怎么获得
- 暗夜精灵考古碎片 暗夜精灵考古
- 秦始皇陵内部竟藏数万蝙蝠:考古学家竟不敢动
- 熔火之心的传送门 熔火碎片 熔火之心的传送门
- 清洗微波炉内部小妙招 ?不用钢丝球,简单一招就干净