嵌入式操作系统内核原理和开发(最快、最优、最差内存分配算法)-2

上一篇 / 下一篇  2012-06-29 13:54:30 / 个人分类:杂谈

51Testing软件测试网4q }?vk e$TMx\ y

#if MAX_SIZE_MALLOC
)S8t7m6s4b0/*************************************************
d!w-b5a!O2[^5Ta0* function: find best fit node in max size51Testing软件测试网a/Vxx at.\#NN
**************************************************/

jc:m7UI RB0W0

(Y&i(j2f%sL9N0MNG_NODE* find_best_fit_node(unsigned int size)
qo{ {$@g0{51Testing软件测试网 a,v x-yyA;P
    MNG_NODE* pCur = pFreeList;51Testing软件测试网_u o)Pr
    MNG_NODE* pPre = pCur;
%H/qLy+A5s a`0 MNG_NODE* pFind = NULL;
51Testing软件测试网` K4p%?v

51Testing软件测试网&y-z*]&WksJ?K

    while(pCur)51Testing软件测试网RO#q` L:wa&K
    {51Testing软件测试网)lx,OS S
  if(pCur->size > (size + sizeof(MNG_NODE)))
,u7V#_%Z8iP^!R0  {51Testing软件测试网q7`,wz-J)wg
      if(NULL == pFind || pFind->size < pCur->size)51Testing软件测试网/pQH Z\:}?oW
   {51Testing软件测试网cp*p:yF;R#u
       pFind = pCur;
*R-c$T2G%i%aU;l0   }
\^2G$E-B,e0  }
51Testing软件测试网 |pNR pSN.f T

9b ~_(c7Ef9c/z?$c0        pPre = pCur;51Testing软件测试网/a3j h$tEb#no0Y)h
        pCur = pCur->next;51Testing软件测试网-Y q6Psj]8XG
    }  
51Testing软件测试网3{ @SsC

6Dp5_(P a0    if(NULL == pFind)51Testing软件测试网(wT @_I(fRAJ
        return NULL;
51Testing软件测试网~eW RV:Em

6[Le4B y%G0 pPre = find_previous_node_in_list(pFind, pFreeList);
%g#F G.i)];G0    if(NULL == pPre)51Testing软件测试网f;g.m^ ]#d4N7u
        pFreeList = pFreeList->next;51Testing软件测试网&[4E?*p~IDl
    else
"Q H.`F?#q5W3|0        pPre->next = pFind->next;

h;|C:qiOoLX4M051Testing软件测试网(C|\:]i@ny0s^

    return pFind;51Testing软件测试网wYR:yk u#}4N l
}
d&`1bK }Vb"M0#endif
51Testing软件测试网"y@C,A|4i4p t

"p4r-d:`$A8J&uf051Testing软件测试网$PNS;BC7j!U
/*************************************************51Testing软件测试网 {^ nx1] { e%CB
* function: implement memory allocation51Testing软件测试网dmblnDF2X
**************************************************/

E*nIGa051Testing软件测试网@,P u p W1S eCt

static void* _mem_malloc(unsigned int size)
^oRK)p;z&n@;Y0{
2d2s(V Y]0    MNG_NODE* pOld;
c&Nlk:FV^C)e0    MNG_NODE* pNew;

-\y#ZkvN2uA0

?"Lu;mn#e0    pOld = find_best_fit_node(size);
;V|*x@F8S2\ w0    if(NULL == pOld)
.ay4w eV1yi0        return NULL;
51Testing软件测试网2S)DY$bsdH

51Testing软件测试网pmVUA{c T

    pNew = (MNG_NODE*)((char*)pOld + sizeof(MNG_NODE) + pOld->size - (sizeof(MNG_NODE) + size));
L Y!pBX"P8h3{9K)hM9`0    pNew->size = size;
$[} V Ko$G0    pOld->size -= sizeof(MNG_NODE) + size;
51Testing软件测试网p,G QN*`|,X

51Testing软件测试网w/o)Z$E%o5d L5lQ5Fb

    add_node_into_list_head(pOld, &pFreeList);51Testing软件测试网/n,}Ag_A
    add_node_into_list_head(pNew, &pAllocList);

@5H;Ivz-d051Testing软件测试网i;BWQYRM

    return (void*)((char*)pNew + sizeof(MNG_NODE));
}qe*k"Q tW|-ii0}
51Testing软件测试网$J$Y{ HPb

51Testing软件测试网j(n)K*mD[uR*{ |


i$A|(G$f'[-u|0/*************************************************51Testing软件测试网ys:nP4WrC
* function: memory allocation51Testing软件测试网/wq1l'|Z
**************************************************/

bS+wj,P G051Testing软件测试网t-uD!P8F+HJoT

void* mem_malloc(unsigned int size)51Testing软件测试网K)o/z$}t;\
{51Testing软件测试网Hy ~7O @i+GY;m
    if(0 == size)
5_)]"x?j j0\0        return NULL;
51Testing软件测试网 en0ARj a#o AO

51Testing软件测试网"@7j}ru [ ^y

    if(size > (MEM_BUFFER_LENGTH - sizeof(MNG_NODE)))
{$N S m9ro[6u E l]0        return NULL;
51Testing软件测试网s.dI'F_a

7Jv hK2L0    return _mem_malloc(size);
`*K7T j([ t7c0}

6[f_j.I0mv.Ga0

!}7aa*Rg Gn`0
D+I$n`F{#d0/*************************************************51Testing软件测试网3n kJ)TQ9_!@l(S#@+Z
* function: find previous node
G ei1W%Y/A J0**************************************************/

-BS^{U?9K5H9YX051Testing软件测试网v1[4aII9@ Leh

MNG_NODE* find_previous_node_in_list(MNG_NODE* pNode, MNG_NODE* pList)
P!f8GD [Du5Nk0{51Testing软件测试网5prj,CE |
    MNG_NODE* pFind = pList;
+rTmbt*U?3d0    MNG_NODE* pPre = NULL;51Testing软件测试网XFfoh(x {:V
   51Testing软件测试网4}m(mZ;NP"X0PV V
    while(pFind && pFind != pNode)
]1_ Km B g q0    {
wE1g"Kz6pq&|6@ C5K0        pPre = pFind;
Lkh_2p#{0        pFind = pFind->next;
%H CZf@+a*n g3I0    }

8IF&?8\ v\051Testing软件测试网y"Y%fhEx4?

    if(NULL == pFind)
W0cYXV[6e0        return NULL;

})k H!e9M(nW i#^k0

MBP-aJ8_ mA[)M0    return pPre;
{|6g3QGW0}
51Testing软件测试网+\P wR*m%dQ(E

NM,E lI?+Dd\`0/*************************************************
#BM8a,X qyuq0* function: implement memory free51Testing软件测试网B~J w;~
**************************************************/

SX]jr+tf051Testing软件测试网Y kZ$Q,T"Z3IIz:G

static void _mem_free(MNG_NODE* pNode)51Testing软件测试网G#R%Ub;{n9^WtU'J
{51Testing软件测试网e'p ^R]t
    MNG_NODE* pPreNode;
51Testing软件测试网(X ~7^U]3T{

@~:zh%M#J:O0    if(pNode == pAllocList)
:}u]\[0    {
D'XJ"ly7ez0        pAllocList = pAllocList->next;51Testing软件测试网6yF.H@ v4D6\+EG
        add_node_into_list_head(pNode, &pFreeList);
~D5|qF^)NS0        return;51Testing软件测试网K!y ]~ w
    }   

kseg+v|X'_051Testing软件测试网2~*I:r.J{0{

    pPreNode = find_previous_node_in_list(pNode, pAllocList);
SZ4IY#d#LlZP0    if(NULL == pPreNode)
-z tj&L/F.E V7WD0        return;

%gp:c\w t&j;eL0

']%c(Z`.VdL0    pPreNode->next = pNode->next;
@&Pq {*w XP#rg0    add_node_into_list_head(pNode, &pFreeList);51Testing软件测试网'Nm|M#R(D!bm1|
    return;
&~0dQ*A r0}

!Bp%u/nIM P0

]*J&c+F`yo0
WRz!d8iR^ik~@4{|T0/*************************************************51Testing软件测试网3~G W q5PP
* function: free memory function
|b%F/hl0**************************************************/
51Testing软件测试网 c R,k|s6p6aA.U+L

51Testing软件测试网8l.`i.F R kWy3c

void mem_free(void* pData)51Testing软件测试网Y0|N??4Y*[
{
o7t:D xz jF6E+a0PU0    if(NULL == pData)51Testing软件测试网 Pc,Gq m%~'J*LS
        return;

Y0w1T1P aA&YS]0

N ~,OQ&uJo0    if(pData < pGlbData || pData >= (void*)((char*)pGlbData + MEM_BUFFER_LENGTH))
v5`I$r$ns2?1Pb0        return;
51Testing软件测试网VQcfClV

p1s,? Xg S]E Q$Q0    _mem_free((MNG_NODE*)((char*)pData - sizeof(MNG_NODE)));51Testing软件测试网;P}h)t%K8d:M
}

'KY7Q!j B9o&pm3YAHZ051Testing软件测试网l8i'|y(g$Z6qfl ?

51Testing软件测试网m m3R6r:vAq/e
/*************************************************51Testing软件测试网1MED%i1@pN+v
* function: get memory buffer
1D_#o/{|#v0**************************************************/
51Testing软件测试网:U(|5p!_2by%^G7@ M4Y4nI

+my"~5__0HZ0void mem_init()
2Y d3f5P\7w0{
C#^8c$z#x0    pGlbData = (void*)malloc(MEM_BUFFER_LENGTH);51Testing软件测试网(s[1zD+? iz d7z'l
    if(NULL == pGlbData)51Testing软件测试网0N5aZKR/wl6?k|
        return;

SW@F moPWa051Testing软件测试网b%\ fo#x(T%yY

    memset(pGlbData, 0, MEM_BUFFER_LENGTH);51Testing软件测试网L.{$fj O y
    pFreeList = (MNG_NODE*)pGlbData;
.{ D!f+t)m?@\Z r0    pFreeList->size = MEM_BUFFER_LENGTH - sizeof(MNG_NODE);51Testing软件测试网/c/xe8Zw{gl
    pAllocList = NULL;51Testing软件测试网L0|AF8S~6l9f{
}
51Testing软件测试网&a3G7m}ba2{

51Testing软件测试网6E4Opj!Gv S}`6d5?

51Testing软件测试网Y uOU1q
/*************************************************51Testing软件测试网Qn2L^Tf
* function: free memory buffer51Testing软件测试网o/Cj%H7g@? X @
**************************************************/
51Testing软件测试网 aT7Rf P2C? z

5Z$Bn2j{mr:HK(q0void mem_exit()51Testing软件测试网l.R4t_A:T jC
{
}._OtB0    if(NULL != pGlbData)
MI B$@~ `*h5v6d!N0        free(pGlbData);  

*iP hV|Y{6M VP051Testing软件测试网/h,XH@ Mhy

    pFreeList = NULL;
j^'PDmx[%ay8]&Q0    pAllocList = NULL;
Au1v3g zcp'aH0}
51Testing软件测试网4N+}!@-x"_u WL

51Testing软件测试网oJ"\/{([!JbGk n


*} u4D;H F+o&c0/*************************************************51Testing软件测试网(S"V/h `9NbO
* function: file starts here
Qs,m L*SzW ]3a0**************************************************/

{5H*BZ?s(`av0

6}Ap9LfW,o0int main(int argc, char* argv[])
P` J Q;dU#L0{
#] xDg G0    mem_init();
'X1V*qy+}}y9c0    mem_exit();51Testing软件测试网:Kwh^p dhx7u'f+tMdD
    return 1;
:_2Ou.Lv-s4\5@ K0}

(cx*d$l B-o0

相关链接:51Testing软件测试网 NCZ w-xB S*}g

嵌入式操作系统内核原理和开发(开篇)

^*|KqW1ro'Wa z0

嵌入式操作系统内核原理和开发(cpu的那些事)51Testing软件测试网%jH+O kRv/|wj

嵌入式操作系统内核原理和开发(中断)51Testing软件测试网@yNS)O/@O

嵌入式操作系统内核原理和开发(地址空间)51Testing软件测试网{7t.jvH*|Ihy&O

嵌入式操作系统内核原理和开发(系统中断仿真)51Testing软件测试网DH*z[@7U2\/JWS

嵌入式操作系统内核原理和开发(线程切换)

v,ml;^xN |!xi0

嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查)

w n,]vU+r0

嵌入式操作系统内核原理和开发(多线程轮转)51Testing软件测试网IL Z*INhq6Tq

嵌入式操作系统内核原理和开发(通用优先级调度)51Testing软件测试网#@ i*I Dl`;N N

嵌入式操作系统内核原理和开发(抢占式优先级调度)51Testing软件测试网Qr`.`cKpm#g!o s%m

嵌入式操作系统内核原理和开发(头文件调整)

)Kh H,Q |_O&dJ@0

嵌入式操作系统内核原理和开发(内存分配算法)51Testing软件测试网"cq!By5q^k2s"m0k

嵌入式操作系统内核原理和开发(固定内存分配算法)

2Dn}[#z U0

嵌入式操作系统内核原理和开发(基于链表节点的内存分配算法)

HxD+i/u/t0

TAG:

 

评分:0

我来说两句

Open Toolbar