《嵌入式操作系统内核原理和开发.docx》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发.docx(12页珍藏版)》请在优知文库上搜索。
1、嵌入式操作系统内核原理和开发(最快、最优、最差内存安排算法)前面我们说到了基于链表的内存安排算法。但是之前我们也说过,其实内存安排一般有三个原则,最快、最优和最差。最快比较好理解,就是查找到合适的节点就马上安排内存,我们在前面一篇博客采纳的就是这个方法。最优呢,就是查找可以满意当前内存安排的最小节点,这样不会有很大的铺张,但是有可能会产生碎片节点。最终一种就是最差安排算法,说是最差效果未必最差。由于在大的内存安排的时候至少不会很快产生内存碎片,对整个系统的稳定来说有可能是好事。所以这三种方法很难说哪一种好,哪一种不好,需要结合详细的应用场景客观进行分析。不过话说回来,内存碎片是无论如何都避开不
2、了的。首先,为了敏捷对这三种安排算法进行配置,我们定义了宏开关,需要哪个就把那个开关放开。临时默认打开的算法的是最快安排算法。1 ffdefineMAX_SPEED_MALLOC12 ffdefineMIN_SIZE_MALLOC03 #defineMAX_SIZE_MALLOC0由于之前已经争论过最快安排算法,所以这里着重争论的最优安排算法和最差安排算法。又由于两者的差别微小,所以单独分析其中一种算法也行。就拿最优安排算法来说,为了查找到最小的节点,我们需要对整个链表进行遍历,这个还是比较消耗时间的。4 while(pCur)5 (6 if(pCur-size(size+sizeof(MNG
3、_NODE)7 if(NULL=pFindpFind-sizepCur-size)9 10 pFind=pCur;H)12 )1314 pPre=PCUr;15 pCur=pCur-next;16 )查找到PFind这个我们需要的节点之后,还需要从PFreeLiSt中删除该节点。所以,我们需要进一步的推断和分析,17 if(NULL=pFind)18 returnNULL;1920 pPre=find_previous_node_in_list(pFind,pFreeList);21 if(NULL=pPre)22 pFreeList=pFreeList-next;23 else24 pPre
4、-next=pFind-next;2526returnpFind;首先推断pFind前面有没有节点,假如没有表示pFreeList就是pFind,那么pFreeList需要自行向后退缩;当然假如当前的PFind节点是有前节点的,那么只需要把前节点的next指针重新更改一下即可。当然,这里还对原来的查找节点函数作了一下修改,使之更合理更通用。27/*28*function:findpreviousnode29*/3031MNG_NODE*find_previous_node_in_list(MNG_NODE*pNode,MNG_N0DE*pList)3233MNG_NODE*pFind=pLis
5、t;34MNG_NODE*pPre=NULL;3536 while(pFind&pFind!=pNode)37 (38 pPre=pFind;39 pFind=pFind-next;40 )42if(NULL=pFind)43returnNULL;4445returnpPre;46)上面也只是说了个也许,详细的内容可以参见下面的源代码。既可以在VC上编译,也可以在GCC上面编译,都没有问题。当然,假如本地OS没有编译器,可以选择网上在线编译,也是个不错的选择。47/*48*malloc&freeinlinknodealgorithm49*/5051ffinclude52#include5354
6、/*55structdefinition56*5758 typedefstruct_MNG_N0DE59 (60 struct_MNG_N0DE*next;61 unsignedintsize;62 MNG_N0DE;636465/*66*macrodeclaration67*/6869#defineMAX_SPEED_MALLOC170ffdefineMIN_SIZE_MALLOC071#defineMAX_SIZE_MALLOC07273#defineMEM_BUFFER_LENGTH(0xl24)8II11fq.xauzs-pujd龈PUwd)nm11ZWfpI3d=SJdd*aa0N9
7、NWIIIfseajdd=pujd*3a0N9NWOII)601(zsuPaU即SUn)加0广)工厂4四-PllIJ*gaN9NWgoI01/*901pds-xeujuspouj.)saqpuj.:uoyq.Dunj.*Sol*/t,0IDOTlWa33dS-XVW01301IOI(001f3p0Nd=ISlldd*66f)S11dd*=)3u8UOneJBaPUOn)U3*98*/88fs11Divd+3aN9NW不平”秀fs11JddTGONFnwRe)Seeaqi9dpo086L/*8Z.UOIleJenapaqejeeqo9*LL*/9Z.SLif(NULL=pFind)returnN
8、ULL;if(pFreeList=pFind)PFreeList=pFreeList-next;elsepPre-next=pFind-next;returnpFind;)#endif#ifMIN_SIZE_MALLOC/*function:findbestfitnodeinminsize*/MNG_NODE*find_best_fit_node(unsignedintsize)MNG_NODE*pCur=pFreeList;MNG_NODE*pPre=pCur;MNG_NODE*pFind=NULL;while(pCur)if(pCur-size(size+sizeof(MNG_NODE)i
9、f(NULL=pFindpFind-sizepCur-size)pFind=pCur;)pPre=pCur;pCur=pCur-next;)if(NULL=pFind)returnNULL;pPre=find_previous_node_in_list(pFind,pFreeList);if(NULL=pPre)119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162pFreeList=p
10、FreeList-next;163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205elsepPre-next=pFind-next;returnpFind;)#endif#ifMAX_SIZE_MALLOC/*function:findbestfitnodeinmaxsize*/MNG_NODE*find_best_fit_node(unsignedintsize)MNG_NODE*pCur=pFreeList;MNG_NODE*pPre=pCur;MNG_NODE*pFind=NULL;while(pCur)