diff --git a/rt-thread-version/rt-thread-standard/programming-manual/memory/figures/08smem_work4.png b/rt-thread-version/rt-thread-standard/programming-manual/memory/figures/08smem_work4.png new file mode 100644 index 0000000000000000000000000000000000000000..92544169d0328f49a1d2753f1ad54f817b37f4c5 Binary files /dev/null and b/rt-thread-version/rt-thread-standard/programming-manual/memory/figures/08smem_work4.png differ diff --git a/rt-thread-version/rt-thread-standard/programming-manual/memory/memory.md b/rt-thread-version/rt-thread-standard/programming-manual/memory/memory.md index da409353ade8378c026932f86c1ea10c3756826f..5e55d3c17e67c2fa784576880e69cb312bb132ee 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/memory/memory.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/memory/memory.md @@ -43,7 +43,13 @@ RT-Thread 操作系统在内存管理上,根据上层应用及系统资源的 ### 小内存管理算法 -小内存管理算法是一个简单的内存分配算法。初始时,它是一块大的内存。当需要分配内存块时,将从这个大的内存块上分割出相匹配的内存块,然后把分割出来的空闲内存块还回给堆管理系统中。每个内存块都包含一个管理用的数据头,通过这个头把使用块与空闲块用双向链表的方式链接起来,如下图所示: +小内存管理算法是一个简单的内存分配算法。初始时,它是一块大的内存。当需要分配内存块时,将从这个大的内存块上分割出相匹配的内存块,然后把分割出来的空闲内存块还回给堆管理系统中。每个内存块都包含一个管理用的数据头,通过这个头把使用块与空闲块用双向链表的方式链接起来。 + + + +**在4.1.0之前使用此实现** + +如下图所示: ![小内存管理工作机制图](figures/08smem_work.png) @@ -56,6 +62,22 @@ RT-Thread 操作系统在内存管理上,根据上层应用及系统资源的 内存管理的表现主要体现在内存的分配与释放上,小型内存管理算法可以用以下例子体现出来。 + + +**4.1.0及以后版本使用此实现** + +如下图所示: + +![](figures/08smem_work4.png) + +**堆开始**:堆起始地址存储内存使用信息,堆起始地址指针,堆结束地址指针,最小堆空闲地址指针和内存大小。 + +每个内存块(无论是已分配的内存块还是空闲的内存块)都包含一个数据头,包括: + +**pool_ptr**:小内存对象地址。如果内存块的最后一位为1,则标记为使用。如果内存块的最后一位为0,则标记为未使用。可以通过该地址计算快速获得小内存算法结构体成员。 + + + 如下图所示的内存分配情况,空闲链表指针 lfree 初始指向 32 字节的内存块。当用户线程要再分配一个 64 字节的内存块时,但此 lfree 指针指向的内存块只有 32 字节并不能满足要求,内存管理器会继续寻找下一内存块,当找到再下一块内存块,128 字节时,它满足分配的要求。因为这个内存块比较大,分配器将把此内存块进行拆分,余下的内存块(52 字节)继续留在 lfree 链表中,如下图分配 64 字节后的链表结构所示。 ![小内存管理算法链表结构示意图 1](figures/08smem_work2.png)