嵌入式操作系统内核原理和开发(最快、最优、最差内存分配算法)-2
上一篇 / 下一篇 2012-06-29 13:54:30 / 个人分类:杂谈
#if MAX_SIZE_MALLOC
)S8t7m6s4b0/*************************************************
d!w-b5a!O2[^5Ta0* function: find best fit node in max size51Testing软件测试网a/Vxxat.\#NN
**************************************************/
(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+A5sa`0 MNG_NODE* pFind = NULL;51Testing软件测试网`K4p%?v
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软件测试网/p QHZ\:}?oW
{51Testing软件测试网cp*p:yF;R#u
pFind = pCur;
*R-c$T2G%i%aU;l0 }
\^2G$E-B,e0 }51Testing软件测试网 |pNR pSN.fT
9b
~_(c7Ef9c/z?$c0 pPre = pCur;51Testing软件测试网/a3j h$tEb#no0Y)h
pCur = pCur->next;51Testing软件测试网-Yq6Psj]8XG
} 51Testing软件测试网3{@S sC
6Dp5_(Pa0 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
"QH.`F?#q5W3|0 pPre->next = pFind->next;
return pFind;51Testing软件测试网wYR:yku#}4N
l
}
d&`1bK}Vb"M0#endif51Testing软件测试网"y@C,A|4i4p t
"p4r-d:`$A8J&uf051Testing软件测试网$PNS;BC7j!U
/*************************************************51Testing软件测试网 {^ nx1]
{e%CB
* function: implement memory allocation51Testing软件测试网dmblnDF2X
**************************************************/
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;
?"Lu;mn#e0 pOld = find_best_fit_node(size);
;V |*x@F8S2\w0 if(NULL == pOld)
.ay4w
eV1yi0 return NULL;51Testing软件测试网2S)DY$bsdH
pNew = (MNG_NODE*)((char*)pOld + sizeof(MNG_NODE) + pOld->size - (sizeof(MNG_NODE) + size));
L
Y!pBX"P8h3{9K)hM9`0 pNew->size = size;
$[} VKo$G0 pOld->size -= sizeof(MNG_NODE) + size;51Testing软件测试网p,GQN*`|,X
add_node_into_list_head(pOld, &pFreeList);51Testing软件测试网/n,}Ag_A
add_node_into_list_head(pNew, &pAllocList);
return (void*)((char*)pNew + sizeof(MNG_NODE));
}qe*k"Q t W|-ii0}51Testing软件测试网$J$Y{
HPb
i$A|(G$f'[-u|0/*************************************************51Testing软件测试网ys:nP4WrC
* function: memory allocation51Testing软件测试网/wq1l'|Z
**************************************************/
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软件测试网en0ARja#o
AO
if(size > (MEM_BUFFER_LENGTH - sizeof(MNG_NODE)))
{$N
S
m9ro[6uE
l]0 return NULL;51Testing软件测试网s.dI'F_a
7Jv hK2L0 return _mem_malloc(size);
`*K7T
j([
t7c0}
!}7aa*Rg Gn`0
D+I$n`F{#d0/*************************************************51Testing软件测试网3n kJ)TQ9_!@l(S#@+Z
* function: find previous node
Gei1W%Y/A J0**************************************************/
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_
KmB g q0 {
wE1g"Kz6pq&|6@ C5K0 pPre = pFind;
Lkh_2p#{0 pFind = pFind->next;
%H CZf@+a*n
g3I0 }
if(NULL == pFind)
W0cY XV[6e0 return NULL;
MBP-aJ8_
mA[)M0 return pPre;
{ |6g3Q GW0}51Testing软件测试网+\ PwR*m%dQ(E
NM,E lI ?+Dd\`0/*************************************************
#BM8a,Xqyuq0* function: implement memory free51Testing软件测试网B~J w;~
**************************************************/
static void _mem_free(MNG_NODE* pNode)51Testing软件测试网G#R%Ub;{n9^W tU'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
}
pPreNode = find_previous_node_in_list(pNode, pAllocList);
SZ4IY#d#LlZP0 if(NULL == pPreNode)
-z
tj&L/F.EV7WD0 return;
']%c(Z`.V dL0 pPreNode->next = pNode->next;
@&Pq{*w
XP#rg0 add_node_into_list_head(pNode, &pFreeList);51Testing软件测试网'Nm|M#R(D!bm1|
return;
&~0dQ*Ar0}
]*J&c+F`yo0
WRz!d8iR^i k ~@4{|T0/*************************************************51Testing软件测试网3~GW q5PP
* function: free memory function
|b%F/hl0**************************************************/51Testing软件测试网cR,k|s6p6aA.U+L
void mem_free(void* pData)51Testing软件测试网Y0|N??4Y*[
{
o7t:Dxz jF6E+a0PU0 if(NULL == pData)51Testing软件测试网
Pc,Gq
m%~'J*LS
return;
N~,OQ&uJo0 if(pData < pGlbData || pData >= (void*)((char*)pGlbData + MEM_BUFFER_LENGTH))
v5`I$r$ns2?1Pb0 return;51Testing软件测试网VQcfClV
p1s,? XgS]E Q$Q0 _mem_free((MNG_NODE*)((char*)pData - sizeof(MNG_NODE)));51Testing软件测试网;P}h)t%K8d:M
}
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;
memset(pGlbData, 0, MEM_BUFFER_LENGTH);51Testing软件测试网L.{$fjO
y
pFreeList = (MNG_NODE*)pGlbData;
.{D!f+t)m?@\Zr0 pFreeList->size = MEM_BUFFER_LENGTH - sizeof(MNG_NODE);51Testing软件测试网/c/xe8Zw{gl
pAllocList = NULL;51Testing软件测试网L0|AF8S~6l9f{
}51Testing软件测试网&a3G7m}ba2{
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);
pFreeList = NULL;
j^'PDmx[%ay8]&Q0 pAllocList = NULL;
Au1v3g zcp'aH0}51Testing软件测试网4N+}!@-x"_u
WL
*}
u4D;H
F+o&c0/*************************************************51Testing软件测试网(S"V/h`9NbO
* function: file starts here
Qs,m
L*SzW ]3a0**************************************************/
6}A p9Lf W,o0int main(int argc, char* argv[])
P`J
Q;dU#L0{
#] xDg G0 mem_init();
'X1V*qy+}} y9c0 mem_exit();51Testing软件测试网:Kwh^pdhx7u'f+tMdD
return 1;
:_2Ou.Lv-s4\5@ K0}
相关链接:51Testing软件测试网 NCZw-xB S*}g
^*|KqW1ro'Wa z0嵌入式操作系统内核原理和开发(cpu的那些事)51Testing软件测试网%jH+OkRv/|wj
嵌入式操作系统内核原理和开发(中断)51Testing软件测试网@y NS)O/@O
嵌入式操作系统内核原理和开发(地址空间)51Testing软件测试网{7t.jvH*|Ihy&O
嵌入式操作系统内核原理和开发(系统中断仿真)51Testing软件测试网DH*z[@7U2\/JWS
v,ml;^xN |!xi0w n,]vU+r0嵌入式操作系统内核原理和开发(多线程轮转)51Testing软件测试网I L Z*INhq6Tq
嵌入式操作系统内核原理和开发(通用优先级调度)51Testing软件测试网#@ i*I Dl`;NN
嵌入式操作系统内核原理和开发(抢占式优先级调度)51Testing软件测试网Qr`.`cKpm#g!os%m
)Kh H,Q|_O&dJ @0嵌入式操作系统内核原理和开发(内存分配算法)51Testing软件测试网"cq!By5q^k2s"m0k
2Dn}[#z U0 HxD+i/u/t0TAG:
不要让那些真正对你好的人,慢慢的从你的生活中消失,无论爱情还是友情,都需要用心经营。
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | ||||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 |
我的存档
数据统计
- 访问量: 3337704
- 日志数: 1640
- 建立时间: 2011-12-07
- 更新时间: 2019-12-24