面向嵌入式实时系统的动态内存管理方法研究
扫描二维码
随时随地手机看文章
进入20世纪90年代,嵌入式技术全面展开,目前已成为通信和消费类产品的共同发展方向。在通信领域,数字技术正在全面取代模拟技术。在广播电视领域,美国已开始由模拟电视向数字电视转变,欧洲的DVB(数字电视广播)技术已在全球大多数国家推广。数字音频广播(DAB)也已进入商品化试播阶段。而软件、集成电路和新型元器件在产业发展中的作用日益重要。
动态内存管理的基本任务就是有效地对动态内存进行分配、回收,并同时保证系统的快速性、可靠性和稳定性。当系统请求分配内存时,系统需要从所有空闲块中找到一个合适的空闲块进行分配;当用户不再使用而将某块内存释放时,系统需要回收这一内存块,以备在新的请求产生时重新进行分配。为此,系统需要建立一个与内存当前使用情况相对应的内存描述,用来记录所有与内存分配、回收相关的信息。而如何记录这些信息并进行分配与回收,便成为各种算法的最根本区别。
1 嵌入式系统中内存管理技术的特点
实时系统分为硬实时系统和软实时系统。硬实时系统是指系统中各任务不仅要执行无误而且要做到准时;软实时系统是指系统中各任务运行的越快越好,并不要求限定某一任务必须在多长时间内完成。可以看出动态内存分配是绝对不能用于硬实时系统的,因为动态分配具有时间不确定性(分配时间与内存块数量有关),而且动态分配可能产生分配不成功的情况。所以对于硬实时系统,只能采用静态内存分配方式。静态分配是指在编译或链接时将程序所需的内存空间分配好,这样不会出现分配失败的情况。
1.1 静态分配与动态分配
静态分配为系统提供了最好的可靠性与实时性。对于那些对实时性和可靠性要求极高的需求,就只能采用静态分配方式。但采用静态分配就必然会使系统失去灵活性。因此必须在设计阶段考虑所有可能的情况,并对所有的需求做出相应的空间分配。一旦出现没有考虑到的情况,系统就无法处理。此外静态分配方式也必然导致很大的浪费,因为必须按照最坏情况进行最大的配置,而在实际运行中可能只用到其中的一小部分。
动态分配为系统提供了很大的灵活性,而且在内存的利用率和系统功能扩展等方面也都明显地优于静态分配。
大多数系统采用静态分配和动态分配相结合的方式。由于嵌入式系统本身各个任务的可靠性、实时性要求不尽相同,通常会有一部分任务对可靠性与实时性没有特别严格的要求。这些任务对一定的延时与失败是可以接受的。因此对于这样的一部分任务,就可以采用动态分配方式来满足它们部分或全部的内存需求。而对于那些有严格时限要求的任务,为了保证任务的可靠性和实时性,就应采用静态分配方式。
1.2 动态分配的技术要求
(1)快速性:由于嵌入式系统对实时性要求较高,所以内存分配过程要尽可能地快。在嵌入式系统中,由于还不能采用通用操作系统中复杂而完善的内存分配策略,所以一般都采用简单、快速的内存分配方案。
(2)可靠性:由于嵌入式系统对可靠性的要求较高,所以内存分配过程也要具备高可靠性。但由于各个嵌入式系统之间对可靠性的要求不尽相同,对内存分配的可靠性要求也就各不相同。通常,可靠性要求极高的系统不采用动态分配。
(3)高效性:由于在嵌入式系统中内存资源都相对有限,所以为了保证程序的正常运行,内存管理系统要尽可能高效地使用内存,减少不必要的浪费。
2 伙伴系统
2.1 伙伴系统原理
伙伴(buddy)系统的基本原理就是按照2的幂次方大小对内存进行分配,以此得到很高的分配速度和回收速度。例如:对于10KB的空间请求,伙伴系统会分配16KB的空间来满足。因为内存空闲块大小均为2的幂次方,所以需要16KB,这是满足10KB的最小空间;同样对于70KB的空间请求,伙伴系统会分配128KB的空间来满足。
2.2 伙伴系统存在的问题
伙伴系统比那些按大小而不按块的整数倍地址分配的算法有更多的优点。其优点为当一个大小为2的K次幂的块被释放后,存储管理只需要搜索2的K次幂字节大小的块以判定是否需要合并。那些允许内存块以任意形式分割的策略需要搜索所有的空闲块表。相比之下,伙伴系统更快。
但是对于内存利用率来说,伙伴系统是极其低效的。问题出自所有的内存请求都必须以2的幂次方大小的空间来满足,一个35KB的请求需要分配64KB的空间,其余的29KB被浪费了。在极端情况下内存资源有近50%被浪费。
3 连续的内存分配
3.1 问题提出
伙伴系统的内存管理方式对空间的使用存在极大的浪费。在某些情况下还会由于资源的浪费,导致后继的内存请求得不到满足,进而严重地影响程序的正常功能。
试考虑:系统共有1MB内存空间可用,采用伙伴系统进行管理。有如下请求:请求A,300KB;请求B,300KB;请求C,50KB.结果如表1所示。
由表1中可以看出:伙伴系统对空间的浪费是极其严重的,即使在物理内存充足(1MB)的情况下,也会产生请求(650KB)无法满足的情况。
由于在嵌入式系统中,一般都没有虚拟内存的支持,所以当内存请求无法得到满足时,将严重影响程序的正常功能。因此为了保证程序的正常功能,就要提高内存的利用率,尽可能地满足程序的内存请求。所以在对伙伴系统进行分析的基础上,提出了连续的内存分配方式。