嵌入式操作系统内核原理和开发.docx
嵌入式操作系统内核原理和开发(最快、最优、最差内存安排算法)前面我们说到了基于链表的内存安排算法。但是之前我们也说过,其实内存安排一般有三个原则,最快、最优和最差。最快比较好理解,就是查找到合适的节点就马上安排内存,我们在前面一篇博客采纳的就是这个方法。最优呢,就是查找可以满意当前内存安排的最小节点,这样不会有很大的铺张,但是有可能会产生碎片节点。最终一种就是最差安排算法,说是最差效果未必最差。由于在大的内存安排的时候至少不会很快产生内存碎片,对整个系统的稳定来说有可能是好事。所以这三种方法很难说哪一种好,哪一种不好,需要结合详细的应用场景客观进行分析。不过话说回来,内存碎片是无论如何都避开不了的。首先,为了敏捷对这三种安排算法进行配置,我们定义了宏开关,需要哪个就把那个开关放开。临时默认打开的算法的是最快安排算法。1 ffdefineMAX_SPEED_MALLOC12 ffdefineMIN_SIZE_MALLOC03 #defineMAX_SIZE_MALLOC0由于之前已经争论过最快安排算法,所以这里着重争论的最优安排算法和最差安排算法。又由于两者的差别微小,所以单独分析其中一种算法也行。就拿最优安排算法来说,为了查找到最小的节点,我们需要对整个链表进行遍历,这个还是比较消耗时间的。4 while(pCur)5 (6 if(pCur->size>(size+sizeof(MNG_NODE)7 if(NULL=pFindpFind->size>pCur->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->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=pList;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*/5051ffinclude<string.h>52#include<malloc.h>5354/*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(0xl«24)8II£11fq.xau<-puTdd=PUHd911fpujd=suddu)til(3N9NW)j3zs+azs)>zs<-pujd龈PUwd)"nm£11ZWfpI3d=SJdd*aa0N9NWIIIfseajdd=pujd*3a0N9NWOII)601(zsuPaU即SUn)加0广)工厂4四-PllIJ*gaN9NWgoI£01/*901pds-xeujuspouj.)saqpuj.:uoyq.Dunj.*Sol*/t,0IDOTlWa33dS-XVW£01301IOI(001f3p0Nd=ISlldd*66f)S11dd*=)3u<-ap0Nd$6)L6QSlldd*3a0N9NW'apoNd*3aN9NW)pea-is-oupouppepes96S6/*%4.s,peqoq.uapouPPe:uof”Unj*£6*/361606f()S11dToON-E)NWrP0NdTOON-E)NW)Sn一“一即OirSnOIAaJerPUH*3Q0N9NW6888/*Z>8UOneJBaPUOn)U3*98*/§8£8fs11Divd+3aN9NW不平”秀fs11JddTGONFnw>Re)S"eeaqi9dpo086L/*8Z.UOIleJenapaqejeeqo9*LL*/9Z.SLif(NULL=pFind)returnNULL;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)if(NULL=pFindpFind->size>pCur->size)pFind=pCur;)pPre=pCur;pCur=pCur->next;)if(NULL=pFind)returnNULL;pPre=find_previous_node_in_list(pFind,pFreeList);if(NULL=pPre)119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162pFreeList=pFreeList->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)if(pCur->size>(size+sizeof(MNG_NODE)if(NULL=pFindpFind->size<pCur->size)pFind=pCur;)pPre=pCur;pCur=pCur->next;if(NULL=pFind)returnNULL;pPre=find-previous-node-in-list(pFind,pFreeList);if(NULL=pPre)pFreeList=pFreeList->next;elsepPre->next=pFind->next;returnpFind;6%8KZ.Kf(zs)ooeu-uiiu-UJn)a泯f11NUJrUaJt3(3QON9NW)oazs-H19N31-H3dJ8W3W)<zs)4J£忆ZPZMlNUJruaJ【代(zs=0)丹0代)6£Z(azsupauSsun)ooieu-uiiu*po§£乙1.iZ*9£3Uone)O11eAJOuIaWruoq,ounj.*S*/>£Z£1ZiZMZ(30N9NW)÷oazs+MaNd(*jep)(*ppA)UJruaJ0£Z6ZZf()S11D011vdgfMNd)peaqs"ou-pouppeg江f(lsJdd>8fpod)peq-s-ou-apou-ppeE91ZfazS+(3aN-9NW)j-oazs=-ezs<-podzzfzs=azs<-MNdPZZJ(zs+(3a0N-DNW)zs)-ezs<-pod+GaoN-9NW)3OaZIS+PlOd(*jep)(tqonFnw)=MaNd£%ZZZ1NUJruaJIZZ(PTod=IlnN)HOZZf(azTS)epou-iTj._iS9q_puTj,=PTOd6忆813fid3Q0N9NWLZPTOd*3aN9NW912S忆(ezs4,uPaUSUn)OTTeUl-UlauJ-poz£1Z/*ZlZuo4,eooeAJoWauJuauidu:uoxq.Dunj.*z*/OlZ60Z803HPUa#LOZfujn4,aj£61f(isddd>8rapoNd)peM-s-ou-apou-ppezZf)xau<-apoNd=4×u<-poN9Jdd6Z06Zfujnisj687(apoNJdd=IlnN)H883f()Spo11vd,叩ONd)Sl-UiFPOLI-SnOAajcpu)=poNJddLZ981(斯fujnj咻f(211。":IdgrapoNd)peM-siu"pouppe£8Zfixau<s!po11vd=Spo11vdZ8Z)I8(21"OnVd=poNd)0826LZfapNJdd*3Q0N_9NWUZ)LLZ(apoNd*3aN-9NW)J4-weupQLZ/*PLZjj.Xjoujuj)U3W3dw:Uol):5Unj*ZUl*/ZLZLZOLZ697f3vddUJrUaJg%1.9ZMlNUJn划993(PUIdd=IlnN)HS9Zt9Z£9Zfq.xeu<-puTdd=PUHdZ9Zfpujd=dd19Z)09Z(epoNd=ipujd.pudd)3iqM6SZ8SZflinN=SJdd*3Q0N9NWLZf)Sd=PUHd*aaN9NW9SZ)双QSIIdT。OhrE)NWfepNdTGON-9顺)”11一5"即OlrSnOIAaJCrPU叫TeJON-9NWTSZ£SZ/*epouSnOlAaJdPiJIj:uoizpunj*2*/OSZf(=eoq9d)aajj(SeGqT9d=jIInN)H9££)S££()4.Txe-uiaujpo,£££££/*Z££JaJJnqXjouiwjj.ruoq,ounj.*££*/0££6Z£8况(LZ£f11nN=ISIl:>OnVd9在f(30N9NW)loazs-H19N31-y3dd9-W三W=azs<-¾s9Jdd,比feeaqi9d(#300N-9NW)=ISII33J=Id出£(H±9N31d3dd8W3Wf0feeaqi9d)isuiiu£乙£ZZfujnq.9jz(eeaqi9d=IlnN)H0Z£(H±9N31d3dd9W3W)3ieu(*p)=eeaqT9d6l£)8l£():HUl-U三pZJ£9I£/*SI£j3j4nqAJOuIauIq,3uoq.3unj.*刀£*/£l£ZI£IK(Ol£J(3a0N9NW)lozs-eead(*Jeip)(*m。ON-E)NW)asJ:%uT60£mfujnq.auz,0£(HIE)Nml一纲:Hng-WmW+eeoq9d(*Jep)(*pA)=<Bleedeeaqi9d>eead)190£So£fujnq,j>()£(eead=N)i£0£Z(K(eead+p)9J4uupoio£00£/*663UOlaUnJAJouJaIUjj.:iJOn)UnJ*86Z*/L()Z96Z$6Z%ZPFreeList=NULL;PAllocList=NULL;)/*function:filestartshere*intmain(intargc,char*argv)mem_init();mem_exit();return1;338339340341342343344345346347348349350351352353