嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx
- 文档编号:7578710
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:13
- 大小:18.41KB
嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx
《嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx(13页珍藏版)》请在冰豆网上搜索。
嵌入式操作系统内核原理和开发最快最优最差内存分配算法
嵌入式操作系统内核原理和开发(最快、最优、最差内存分配算法)
前面我们说到了基于链表的内存分配算法。
但是之前我们也说过,其实内存分配一般有三个原则,最快、最优和最差。
最快比较好理解,就是寻找到合适的节点就立即分配内存,我们在前面一篇博客采用的就是这个方法。
最优呢,就是寻找可以满足当前内存分配的最小节点,这样不会有很大的浪费,但是有可能会产生碎片节点。
最后一种就是最差分配算法,说是最差效果未必最差。
因为在大的内存分配的时候至少不会很快产生内存碎片,对整个系统的稳定来说有可能是好事。
所以这三种方法很难说哪一种好,哪一种不好,需要结合具体的应用场景客观进行分析。
不过话说回来,内存碎片是无论如何都避免不了的。
首先,为了灵活对这三种分配算法进行配置,我们定义了宏开关,需要哪个就把那个开关放开。
暂时默认打开的算法的是最快分配算法。
[cpp]viewplaincopy
1#defineMAX_SPEED_MALLOC1
2#defineMIN_SIZE_MALLOC0
3#defineMAX_SIZE_MALLOC0
因为之前已经讨论过最快分配算法,所以这里着重讨论的最优分配算法和最差分配算法。
又由于两者的差别极小,所以单独分析其中一种算法也行。
就拿最优分配算法来说,为了寻找到最小的节点,我们需要对整个链表进行遍历,这个还是比较消耗时间的。
[cpp]viewplaincopy
4while(pCur)
5{
6if(pCur->size>(size+sizeof(MNG_NODE)))
7{
8if(NULL==pFind||pFind->size>pCur->size)
9{
10pFind=pCur;
11}
12}
13
14pPre=pCur;
15pCur=pCur->next;
16}
寻找到pFind这个我们需要的节点之后,还需要从pFreeList中删除该节点。
所以,我们需要进一步的判断和分析,
[cpp]viewplaincopy
17if(NULL==pFind)
18returnNULL;
19
20pPre=find_previous_node_in_list(pFind,pFreeList);
21if(NULL==pPre)
22pFreeList=pFreeList->next;
23else
24pPre->next=pFind->next;
25
26returnpFind;
首先判断pFind前面有没有节点,如果没有表示pFreeList就是pFind,那么pFreeList需要自行向后退缩;当然如果当前的pFind节点是有前节点的,那么只需要把前节点的next指针重新更改一下即可。
当然,这里还对原来的查找节点函数作了一下修改,使之更合理更通用。
[cpp]viewplaincopy
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->next;
40}
41
42if(NULL==pFind)
43returnNULL;
44
45returnpPre;
46}
上面也只是说了个大概,具体的内容可以参见下面的源代码。
既可以在VC上编译,也可以在GCC上面编译,都没有问题。
当然,如果本地os没有编译器,可以选择网上在线编译,也是个不错的选择。
[cpp]viewplaincopy
47/*************************************************
48*malloc&freeinlinknodealgorithm
49**************************************************/
50
51#include
52#include
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<(size+sizeof(MNG_NODE)))
114{
115pPre=pFind;
116pFind=pFind->next;
117}
118
119if(NULL==pFind)
120returnNULL;
121
122if(pFreeList==pFind)
123pFreeList=pFreeList->next;
124else
125pPre->next=pFind->next;
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->size>(size+sizeof(MNG_NODE)))
146{
147if(NULL==pFind||pFind->size>pCur->size)
148{
149pFind=pCur;
150}
151}
152
153pPre=pCur;
154pCur=pCur->next;
155}
156
157if(NULL==pFind)
158returnNULL;
159
160pPre=find_previous_node_in_list(pFind,pFreeList);
161if(NULL==pPre)
162pFreeList=pFreeList->next;
163else
164pPre->next=pFind->next;
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->size>(size+sizeof(MNG_NODE)))
185{
186if(NULL==pFind||pFind->size
187{
188pFind=pCur;
189}
190}
191
192pPre=pCur;
193pCur=pCur->next;
194}
195
196if(NULL==pFind)
197returnNULL;
198
199pPre=find_previous_node_in_list(pFind,pFreeList);
200if(NULL==pPre)
201pFreeList=pFreeList->next;
202else
203pPre->next=pFind->next;
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:
findpreviousnode
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&&pFind!
=pNode)
260{
261pPre=pFind;
262pFind=pFind->next;
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->next;
283add_node_into_list_head(pNode,&pFreeList);
284return;
285}
286
287pPreNode=find_previous_node_in_list(pNode,pAllocList);
288if(NULL==pPreNode)
289return;
290
291pPreNode->next=pNode->next;
292add_node_into_list_head(pNode,&pFreeList);
293return;
294}
295
296
297/*************************************************
298*function:
freememoryfunction
299**************************************************/
300
301voidmem_free(void*pData)
302{
303if(NULL==pData)
304return;
305
306if(pData
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)