本文主要展示“实用程序中内存分配策略的实例分析”,简单易懂,条理清晰,希望能帮你解开疑惑。让边肖带领大家学习和研究文章《效用中的内存分配策略实例分析》。
从系统内存池(即堆)分配内存主要使用ANSI定义的这些函数,typedofensindingsize _ t;void * malloc(size _ tnBytes);void*calloc(size_telemNum,size _ telemSize);void*realloc(void*pBlock,size _ tnewSize);无空隙(void * ptr);
VxWorks还实现了一个与calloc()特别匹配的cf REE()typedefinet _ Vx _ STatus;typedef _ Vx _ STATUSSTATUSstatus free(char * pBlock);
堆中存储的内存块是如何管理的?
在Vx5中使用的策略是First Fit,可以翻译为第一种分配算法。在这种策略下,所有的空闲存储块从最低到最高地址排列。当需要申请内存时,从低位地址开始搜索,分配第一个满足需求的内存块。因此,当系统申请内存次数较多时,低位地址会留下大量的小内存,导致后期搜索时间略长。大致代码如下
void*memXxxAlloc(PART_IDpartId,/* memory partitionto allocatefrom */unsignednBytes,/* number of bytes allocate */unsignedalignment/* boundaryto alignto */){ 0.DL _ NODE * pNode=DLL _ FIRST(partId-freeList);while(pNode!=NULL){/* fitsif : *-blocksizerequestedsize extroom for alignmentor,*-blockisalreadyaignedandedxactlyrightsize */if((NODE _ TO _ HDR(pNode)-nWordsnWordsExtra)| |((NODE _ TO _ HDR(pNode)-nWords==nWords)
nbsp; (ALIGNED (HDR_TO_BLOCK(NODE_TO_HDR(pNode)), alignment)))) break; pNode = DLL_NEXT (pNode); } ... }
Best Fit,可以翻译为最优分配算法。在这种策略下,所有的空闲内存块按照尺寸从小到大排列,并使用AVL(平衡二叉树)维护。当需要申请内存时,从Root节点开始查找,满足需求且尺寸最小的内存块被分配。这种算法会保留大的内存块,提高了整体的分配成功几率,但会多出一些非常小的碎片,不过时间复杂度只有o(ln(N))。大致代码如下AVLU_NODE *avlXxxGet ( AVLU_TREE root, /* root node pointer */ UINT key /* search key */ ) { AVLU_NODE *pNode; AVLU_NODE *pSuccessor; pNode = root; pSuccessor = NULL; while (pNode != NULL) { if (key >= pNode->key) { pNode = pNode->right; } else { pSuccessor = pNode; pNode = pNode->left; } } return (pSuccessor); }
计算机专业的童鞋应该知道还有一种策略叫Worst Fit,可以翻译为最差分配算法。在这种策略下,所有的空闲内存块按照尺寸从大到小排列。当需要申请内存时,要么分配第一块,要是失败。所以这种算法的分配速度最快,而且很少有小碎片,但是容易造成大块内存申请失败,所以适合待分配内存块比较统一的情况。
以上是“Utility中内存分配策略的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155166.html