4.16 實現自己的堆管理器
4.16 實現自己的堆管理器
功能要求
管理16個記憶體塊,大小範圍[8,128]
使用bitmap陣列對16個記憶體塊進行管理
可以申請的記憶體大小[1,128]
實現介面函式
pool_malloc:記憶體申請
pool_free: 釋放記憶體
pool_info: 查詢堆記憶體使用情況
程式碼
mempool.c
/************************************************
* Copyright(C) zhaixue.cc. All rights reserved
*
* Filename: mempool.c
* Author: litao.wang
* E-mail: 3284757626@qq.com
* Description:
* Create: 2017-11-08 18:55:16
* Last Modified: 2017-11-25 17:27:06
************************************************/
#include<stdio.h>
#define POOL_SIZE 1088
#define CHUNK_NUM 16
struct chunk{
unsigned char *addr;
char used;
unsigned char size;
};
char mempool[POOL_SIZE];
struct chunk bitmap[CHUNK_NUM];
void pool_init(void)
{
int i;
char *p = &mempool[0];
for(int i=0;i<CHUNK_NUM;i++)
{
p = p + i*8;
bitmap[i].addr = p;
bitmap[i].size = 8 *(i+1);
bitmap[i].used = 0;
}
}
int bitmap_index(int nbytes)
{
if(nbytes%8==0)
return nbytes/8 -1;
else
return nbytes/8;
}
void* pool_malloc(int nbytes)
{
int i;
int index;
index = bitmap_index(nbytes);
for( i=index;i<CHUNK_NUM;i++)
{
if(bitmap[i].used == 0){
bitmap[i].used = 1;
return bitmap[i].addr;
}
else
continue;
}
return (void *)0;
}
void pool_free(void *p)
{
int i;
for(i=0;i<CHUNK_NUM;i++)
{
if(bitmap[i].addr == p)
bitmap[i].used = 0;
}
}
void pool_info(void)
{
int frees = 0;
int used_size = 0;
int i;
for(i=0;i<CHUNK_NUM;i++)
{
if(bitmap[i].used ==1)
used_size = used_size + bitmap[i].size;
else
frees++;
}
printf("------------------------------\n");
printf(" memory info \n\n");
printf("Total size: %d\tBytes\n",POOL_SIZE);
printf("Used size: %d\tBytes\n",used_size);
printf("Free size: %d\tBytes\n",POOL_SIZE-used_size);
printf("Used Chunks: %d\n",CHUNK_NUM-frees);
printf("Free Chunks: %d\n",frees);
printf("Pool usage: %d\%\n",(used_size*100/POOL_SIZE));
printf("------------------------------\n");
}
宣告檔案
/************************************************
* Copyright(C) zhaixue.cc. All rights reserved
*
* Filename: mempool.h
* Author: litao.wang
* E-mail: 3284757626@qq.com
* Description:
* Create: 2017-11-25 16:36:59
* Last Modified: 2017-11-25 16:37:57
************************************************/
#ifndef __MEMPOOL_H
#define __MEMPOOL_H
void pool_init(void);
void *pool_malloc(int nbytes);
void pool_free(void *p);
void pool_info(void);
#endif
main.c
/************************************************
* Copyright(C) zhaixue.cc. All rights reserved
*
* Filename: main.c
* Author: litao.wang
* E-mail: 3284757626@qq.com
* Description:
* Create: 2017-11-08 22:23:16
* Last Modified: 2017-11-25 16:38:33
************************************************/
#include<stdio.h>
#include<string.h>
#include "mempool.h"
int main(void)
{
pool_init();
char *p=NULL;
char *q=NULL;
p =(char *)pool_malloc(100);
q =(char *)pool_malloc(24);
memcpy(p,"hello world\n",15);
printf("%s\n",p);
pool_info();
pool_free(p);
pool_free(q);
pool_info();
return 0;
}
相關文章
- 堆和索引堆的python實現索引Python
- 堆的原理與實現
- 4.16
- 大頂堆的python實現Python
- PHP 實現堆, 堆排序以及索引堆PHP排序索引
- 實現自己的promisePromise
- 堆的原理以及實現O(lgn)
- 4.16總結
- 堆的定義、特點及實現
- 自己實現AJAX
- 堆疊的實現(1)--靜態陣列陣列
- Rust 中的Box型別實現堆分配Rust型別
- 實現一個自己的mvvmMVVM
- Python實現堆疊與佇列Python佇列
- 基於"堆"的底層實現和應用
- 大根堆和堆排序的原理與實現排序
- 如何實現自己的Spring Boot StarterSpring Boot
- 使用Runtime來實現自己的KVO
- 自己實現一個java的arraylistJava
- Flume 實現自己的實時日誌(2)
- 4.16java學習Java
- DIY 實現 ThinkPHP 核心框架(六)實現自己的 Composer 包PHP框架
- 實用演算法系列之RT-Thread連結串列堆管理器演算法thread
- 自己動手實現OkHttpHTTP
- 自己實現鬥地主引擎
- 自己實現HTML-BeautifyHTML
- 幽默:恭喜,您將單堆疊的單體變成了n個微服務,然後您發現自己的微服務緊密耦合,現在已經有43個不同的堆疊,每個堆疊都有自己的故障模式,您玩得開心!- Ian Miell微服務模式
- 如何實現自己的SpringBoot自動配置Spring Boot
- [翻譯] 使用JavaScript實現自己的PromisesJavaScriptPromise
- 二叉堆實現優先佇列佇列
- 使用C#實現資料結構堆C#資料結構
- react同構實踐——實現自己的同構模板React
- java使用PriorityQueue即優先佇列實現大根堆和小根堆Java佇列
- 自己動手實現Java中的StringBuffer類Java
- 自己實現陣列的 `map`、`filter`、`find` 方法陣列Filter
- strlen strcat strcpy strcmp 自己實現
- 使用 Hooks 實現一個簡單的狀態管理器Hook
- [Unity] 實現AssetBundle資源載入管理器Unity