admin 管理员组文章数量: 1086019
heap
heap_5
小狼@
heap_5是将.bss段的mem作为内存管理基础(一大片全局变量),支持多个不连续的内存块,经过函数vPortDefineHeapRegions()执行后,将多个block按地址从小到大使用链表串联起来,如下图所示:
内存申请使用pvPortMalloc()函数,该函数在内存块链表中依次查找size大于待申请长度的block,如果存在这样的block,将该block从链表中取出,在该block中取出需要长度的mem,将剩余的mem变成链表节点插入到链表中。取出的mem带有链表头,返回给用户时向后偏移链表头的长度即可。
内存释放使用pvPortFree()函数,由于申请mem时,返回指针前面带有链表头,释放时,使用该链表头插入到链表中,插入时会找到按照mem从小到大的顺序找到插入点。
碎片管理:
碎片管理在prvInsertBlockIntoFreeList()函数中执行,在插入链表之前会按照mem从小到大顺序找到插入点,然后判断插入点的block末尾地址是不是新插入点的起始地址,如果是,直接在插入点末尾延长插入节点的长度为新插入点的长度,如果新插入点的末位地址是插入点下个节点的起始地址,则在这个节点前面延长新插入点的长度,这样实际就不会新插入链表节点,而是延长原有节点,减少内存碎片;如果以上两个条件都不满足,则将新插入点插入到链表中。
本文标签: heap
版权声明:本文标题:heap 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1686502904a3034.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论