RTOS内存模块分析


RTOS内存模块分析

内存模块是操作系统中的重要的模块,也是编码时运用较多的,本文讲述内存的实现,分析实时嵌入式操作系统内存模块的实现,如常见的nucleus plus, threadx

一.    实时嵌入式操作系统的内存分配

1.1概述

实时嵌入式操作系统,如nucleus plus, threadx中一般具有两种内存的分配方式,把它归纳为块内存和池内存:块内存在每个内存池中分配的内存大小是相同的,由于应用需要不同大小的内存块,所以具有不同大小内存块的内存池,如果所需的内存大小小于内存池中内存块的大小,它也是分配给你该池的大小,容易造成浪费,但是分配的效率较高;对于池内存,初始化时是一个整体的内存块,分配时可以按照需要在该内存块中分配不同大小的内存,所以在分配一段时间后该原来一个整体的内存块变成某些部分分配,某些部分空闲,空闲的大小也不一致,容易造成内存碎片。

1.2内存的实现

内存的实现可以有多种方法,块内存可以采用链表结构,本文以nucleus为例;池内存也可以采用不同的算法,如首次适配法,最佳适配法,最差适配法。

1.2.1块内存

在块内存初始化之前,是一块完整的内存块区:

块内存初始化完成以后,如下所示:


土黄色部分是链表结构,将整个单独的内存块连接起来,红色部分是返回给调用者,供用户


实际使用到的内存块。每个红色部分的内存块大小相同。


   当内存分配的时候,从链表中取出一个节点分配给用户;当内存释放的时候,该节点又重新挂载到链表上。


1.2.2池内存


   池内存的分配可以有不同的算法,不同的算法对内存的分配和内存碎片具有不同的效果,如下文阐述有最佳适配法,最差适配法,首次适配法等。


最佳适配法,扫描链表,找出大小最接近所需内存的内存块进行分配,该种分配方法,系统中存在一些较小的内存碎片,也有较大的内存块;


最差适配法,找出链表中最大的内存块,从该块内存中进行分配,该种分配方法使内存块的大小趋于一致;


首次适配法,扫描链表,找出第一个符合要求的内存块(只要比所需的内存块大小大即可),然后分配,该种分配方法内存布局介于最佳适配法和最差适配法之间。


以下图示以首次适配法为例:


1.初始化一块完整的内存区,假设为1024k;


2.分配100k


3.分配300k


4.分配100k


5.释放300k


6分配400k400k超出300k,搜索到524k是从524k块中分配


7分配50K,首先找到300k的大小,从中分成50k250k两块内存


常见问题


在内存使用过程中容易出现一些问题,如内存泄漏和内存越界。内存泄漏,即该块内存丢失,操作系统无法收回,以后就找不到了。内存越界,该块内存比如说分配给他24个字节,但是它写了26个字节,多了两个字节,有可能是其他内存块的地址;假设是块内存中的越界,它会破坏块内存中的链表结构,导致该内存池的链表结构直接崩溃,无法再释放和分配内存。








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值