嵌入式操作系统内核原理和开发最快最优最差内存分配算法Word文档格式.docx
- 文档编号:20694363
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:13
- 大小:18.41KB
嵌入式操作系统内核原理和开发最快最优最差内存分配算法Word文档格式.docx
《嵌入式操作系统内核原理和开发最快最优最差内存分配算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发最快最优最差内存分配算法Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
17if(NULL==pFind)
18returnNULL;
19
20pPre=find_previous_node_in_list(pFind,pFreeList);
21if(NULL==pPre)
22pFreeList=pFreeList->
23else
24pPre->
next=pFind->
25
26returnpFind;
首先判断pFind前面有没有节点,如果没有表示pFreeList就是pFind,那么pFreeList需要自行向后退缩;
当然如果当前的pFind节点是有前节点的,那么只需要把前节点的next指针重新更改一下即可。
当然,这里还对原来的查找节点函数作了一下修改,使之更合理更通用。
27/*************************************************
28*function:
findpreviousnode
29**************************************************/
30
31MNG_NODE*find_previous_node_in_list(MNG_NODE*pNode,MNG_NODE*pList)
32{
33MNG_NODE*pFind=pList;
34MNG_NODE*pPre=NULL;
35
36while(pFind&
&
pFind!
=pNode)
37{
38pPre=pFind;
39pFind=pFind->
40}
41
42if(NULL==pFind)
43returnNULL;
44
45returnpPre;
46}
上面也只是说了个大概,具体的内容可以参见下面的源代码。
既可以在VC上编译,也可以在GCC上面编译,都没有问题。
当然,如果本地os没有编译器,可以选择网上在线编译,也是个不错的选择。
47/*************************************************
48*malloc&
freeinlinknodealgorithm
49**************************************************/
50
51#include<
string.h>
52#include<
malloc.h>
53
54/*************************************************
55*structdefinition
56**************************************************/
57
58typedefstruct_MNG_NODE
59{
60struct_MNG_NODE*next;
61unsignedintsize;
62}MNG_NODE;
63
64
65/*************************************************
66*macrodeclaration
67**************************************************/
68
69#defineMAX_SPEED_MALLOC1
70#defineMIN_SIZE_MALLOC0
71#defineMAX_SIZE_MALLOC0
72
73#defineMEM_BUFFER_LENGTH(0x1<
<
24)
74
75
76/*************************************************
77*globalvariabledeclaration
78**************************************************/
79
80staticvoid*pGlbData;
81staticMNG_NODE*pFreeList;
82staticMNG_NODE*pAllocList;
83
84
85/*************************************************
86*functiondeclaration
87**************************************************/
88
89MNG_NODE*find_previous_node_in_list(MNG_NODE*pNode,MNG_NODE*pList);
90
91
92/*************************************************
93*function:
addnodeintoheadlist
94**************************************************/
95
96staticvoidadd_node_into_list_head(MNG_NODE*pNode,MNG_NODE**ppList)
97{
98pNode->
next=*ppList;
99*ppList=pNode;
100}
101
102
103#ifMAX_SPEED_MALLOC
104/*************************************************
105*function:
findbestfitnodeinmax_speed
106**************************************************/
107
108staticMNG_NODE*find_best_fit_node(unsignedintsize)
109{
110MNG_NODE*pFind=pFreeList;
111MNG_NODE*pPre=pFind;
112
113while(pFind&
pFind->
size<
114{
115pPre=pFind;
116pFind=pFind->
117}
118
119if(NULL==pFind)
120returnNULL;
121
122if(pFreeList==pFind)
123pFreeList=pFreeList->
124else
125pPre->
126
127returnpFind;
128}
129#endif
130
131
132#ifMIN_SIZE_MALLOC
133/*************************************************
134*function:
findbestfitnodeinminsize
135**************************************************/
136
137MNG_NODE*find_best_fit_node(unsignedintsize)
138{
139MNG_NODE*pCur=pFreeList;
140MNG_NODE*pPre=pCur;
141MNG_NODE*pFind=NULL;
142
143while(pCur)
144{
145if(pCur->
146{
147if(NULL==pFind||pFind->
148{
149pFind=pCur;
150}
151}
152
153pPre=pCur;
154pCur=pCur->
155}
156
157if(NULL==pFind)
158returnNULL;
159
160pPre=find_previous_node_in_list(pFind,pFreeList);
161if(NULL==pPre)
162pFreeList=pFreeList->
163else
164pPre->
165
166returnpFind;
167}
168#endif
169
170
171#ifMAX_SIZE_MALLOC
172/*************************************************
173*function:
findbestfitnodeinmaxsize
174**************************************************/
175
176MNG_NODE*find_best_fit_node(unsignedintsize)
177{
178MNG_NODE*pCur=pFreeList;
179MNG_NODE*pPre=pCur;
180MNG_NODE*pFind=NULL;
181
182while(pCur)
183{
184if(pCur->
185{
186if(NULL==pFind||pFind->
187{
188pFind=pCur;
189}
190}
191
192pPre=pCur;
193pCur=pCur->
194}
195
196if(NULL==pFind)
197returnNULL;
198
199pPre=find_previous_node_in_list(pFind,pFreeList);
200if(NULL==pPre)
201pFreeList=pFreeList->
202else
203pPre->
204
205returnpFind;
206}
207#endif
208
209
210/*************************************************
211*function:
implementmemoryallocation
212**************************************************/
213
214staticvoid*_mem_malloc(unsignedintsize)
215{
216MNG_NODE*pOld;
217MNG_NODE*pNew;
218
219pOld=find_best_fit_node(size);
220if(NULL==pOld)
221returnNULL;
222
223pNew=(MNG_NODE*)((char*)pOld+sizeof(MNG_NODE)+pOld->
size-(sizeof(MNG_NODE)+size));
224pNew->
size=size;
225pOld->
size-=sizeof(MNG_NODE)+size;
226
227add_node_into_list_head(pOld,&
pFreeList);
228add_node_into_list_head(pNew,&
pAllocList);
229
230return(void*)((char*)pNew+sizeof(MNG_NODE));
231}
232
233
234/*************************************************
235*function:
memoryallocation
236**************************************************/
237
238void*mem_malloc(unsignedintsize)
239{
240if(0==size)
241returnNULL;
242
243if(size>
(MEM_BUFFER_LENGTH-sizeof(MNG_NODE)))
244returnNULL;
245
246return_mem_malloc(size);
247}
248
249
250/*************************************************
251*function:
252**************************************************/
253
254MNG_NODE*find_previous_node_in_list(MNG_NODE*pNode,MNG_NODE*pList)
255{
256MNG_NODE*pFind=pList;
257MNG_NODE*pPre=NULL;
258
259while(pFind&
260{
261pPre=pFind;
262pFind=pFind->
263}
264
265if(NULL==pFind)
266returnNULL;
267
268returnpPre;
269}
270
271
272/*************************************************
273*function:
implementmemoryfree
274**************************************************/
275
276staticvoid_mem_free(MNG_NODE*pNode)
277{
278MNG_NODE*pPreNode;
279
280if(pNode==pAllocList)
281{
282pAllocList=pAllocList->
283add_node_into_list_head(pNode,&
284return;
285}
286
287pPreNode=find_previous_node_in_list(pNode,pAllocList);
288if(NULL==pPreNode)
289return;
290
291pPreNode->
next=pNode->
292add_node_into_list_head(pNode,&
293return;
294}
295
296
297/*************************************************
298*function:
freememoryfunction
299**************************************************/
300
301voidmem_free(void*pData)
302{
303if(NULL==pData)
304return;
305
306if(pData<
pGlbData||pData>
=(void*)((char*)pGlbData+MEM_BUFFER_LENGTH))
307return;
308
309_mem_free((MNG_NODE*)((char*)pData-sizeof(MNG_NODE)));
310}
311
312
313/*************************************************
314*function:
getmemorybuffer
315**************************************************/
316
317voidmem_init()
318{
319pGlbData=(void*)malloc(MEM_BUFFER_LENGTH);
320if(NULL==pGlbData)
321return;
322
323memset(pGlbData,0,MEM_BUFFER_LENGTH);
324pFreeList=(MNG_NODE*)pGlbData;
325pFreeList->
size=MEM_BUFFER_LENGTH-sizeof(MNG_NODE);
326pAllocList=NULL;
327}
328
329
330/*************************************************
331*function:
freememorybuffer
332**************************************************/
333
334voidmem_exit()
335{
336if(NULL!
=pGlbData)
337free(pGlbData);
338
339pFreeList=NULL;
340pAllocList=NULL;
341}
342
343
344/*************************************************
345*function:
filestartshere
346**************************************************/
347
348intmain(intargc,char*argv[])
349{
350mem_init();
351mem_exit();
352return1;
353}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 操作系统 内核 原理 开发 最快 最优 最差 内存 分配 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)