嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx

上传人:b****6 文档编号:7578710 上传时间:2023-01-25 格式:DOCX 页数:13 大小:18.41KB
下载 相关 举报
嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx_第1页
第1页 / 共13页
嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx_第2页
第2页 / 共13页
嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx_第3页
第3页 / 共13页
嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx_第4页
第4页 / 共13页
嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx

《嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx(13页珍藏版)》请在冰豆网上搜索。

嵌入式操作系统内核原理和开发最快最优最差内存分配算法.docx

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

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

前面我们说到了基于链表的内存分配算法。

但是之前我们也说过,其实内存分配一般有三个原则,最快、最优和最差。

最快比较好理解,就是寻找到合适的节点就立即分配内存,我们在前面一篇博客采用的就是这个方法。

最优呢,就是寻找可以满足当前内存分配的最小节点,这样不会有很大的浪费,但是有可能会产生碎片节点。

最后一种就是最差分配算法,说是最差效果未必最差。

因为在大的内存分配的时候至少不会很快产生内存碎片,对整个系统的稳定来说有可能是好事。

所以这三种方法很难说哪一种好,哪一种不好,需要结合具体的应用场景客观进行分析。

不过话说回来,内存碎片是无论如何都避免不了的。

 

首先,为了灵活对这三种分配算法进行配置,我们定义了宏开关,需要哪个就把那个开关放开。

暂时默认打开的算法的是最快分配算法。

 

[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->sizesize)

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=(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}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 药学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1