内存管理作业练习
2010-12-11 18:16
405 查看
#define MEM_BLOCK_ITEM_64_BLOCK_NUM 2048
#define MEM_BLOCK_ITEM_128_BLOCK_NUM 512
#define MEM_BLOCK_ITEM_256_BLOCK_NUM 128
#define BLOCK_SIZE_64 64
#define BLOCK_SIZE_128 128
#define BLOCK_SIZE_256 256
#define MAX_BLOCKS_NUM 3
#define MAX_BLOCK_SIZE 256
typedef struct MEMBLOCKITEM64{
struct MEMBLOCKITEM64 *pNext;
int nBlockSize;
int flag; // free/use
int memory[32];
}MEM_BLOCK_ITEM_64;
typedef struct MEMBLOCKITEM128{
struct MEMBLOCKITEM128 *pNext;
int nBlockSize;
int flag; // free/use
int memory[128];
}MEM_BLOCK_ITEM_128;
typedef struct MEMBLOCKITEM256 {
struct MEMBLOCKITEM256 *pNext;
int nBlockSize;
int flag; // free/use
int memory[256];
}MEM_BLOCK_ITEM_256;
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_64 * pBlockHead64;
char text[16];
}MEM_APP_BLOCK_64;
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_128 * pBlockHead64;
char text[16];
}MEM_APP_BLOCK_128;
/*
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_256 * pBlockHead64;
char text[16];
}MEM_APP_BLOCK_256;
*/
typedef struct {
int nBlockSize;
int nBlockNum;
union {
MEM_BLOCK_ITEM_64 * pBlockHead64;
MEM_BLOCK_ITEM_128 * pBlockHead128;
MEM_BLOCK_ITEM_256 * pBlockHead256;
} MEM_BLOCK_ITEM;
char text[16];
}MEM_APP_BLOCK;
/*
typedef struct {
int nBlockSize; //每个内存块的大小
int nBlocksNum; //内存池中内存块的个数
MEM_BLOCK_ITEM_64 * pBlockHead64;
char text[16];
}MEM_APP_BLOCK_64;
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_128 * pBlockHead128;
char text[16];
}MEM_APP_BLOCK_128;
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_256 *pBlockHead256;
char text[16];
}MEM_APP_BLOCK_256;
*/
/*
typedef struct MEM_BLOCK_POOL {
MEM_APP_BLOCK_64 *memAppBlock64; // 采用指针,便于后面的赋值,否则后面由于只能通过赋值的方式给结构体赋值,将会造成很大的空间浪费
MEM_APP_BLOCK_128 *memAppBlock128;
MEM_APP_BLOCK_256 *memAppBlock256;
}MEMBLOCKPOOL;
MEMBLOCKPOOL memBlockPool;
*/
typedef struct MEM_BLOCK_POOL {
MEM_APP_BLOCK *pMemAppBlock[3];
}MEMBLOCKPOOL;
MEMBLOCKPOOL memBlockPool;
/////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include "mem_block.h"
void mem_block_init();
int * mem_block_alloc();
void mem_block_free();
void mem_block_uninit();
void main()
{
int *pMemBlockAddr = NULL;
mem_block_init();
pMemBlockAddr =mem_block_alloc(5 * sizeof(int));
memset(pMemBlockAddr,5,5*sizeof(int));
//printf("%s/n",memBlockPool.pMemAppBlock[0]->text);
printf("%d/n",memBlockPool.pMemAppBlock[0]->MEM_BLOCK_ITEM.pBlockHead64->memory[0]);
}
void mem_block_init()
{
/***************************************************************************
分配得到2048个64 byte大小的内存块, 512 * 128 byte 大小的内存块 128 * 256
byte的心的内存块
****************************************************************************/
int i = 0;
MEM_BLOCK_ITEM_64 *pMemBlockItem64;
MEM_BLOCK_ITEM_64 *pTempMemBlockItem64;
MEM_BLOCK_ITEM_128 *pMemBlockItem128;
MEM_BLOCK_ITEM_128 *pTempMemBlockItem128;
MEM_BLOCK_ITEM_256 *pMemBlockItem256;
MEM_BLOCK_ITEM_256 *pTempMemBlockItem256;
/*
MEM_BLOCK_ITEM memAppBlock[3] = {
{64,MEM_BLOCK_ITEM_128_BLOCK_NUM,pMemBlockItem64,"Block Pool 64"},
{128,MEM_BLOCK_ITEM_128_BLOCK_NUM,pMemBlockItem128,"Block Pool 128"},
{256,MEM_BLOCK_ITEM_256_BLOCK_NUM,pMemBlockItem256,"Block Pool 256"}
};
*/
MEM_APP_BLOCK memAppBlock[3] = {
{64,MEM_BLOCK_ITEM_128_BLOCK_NUM,NULL,"Block Pool 64"},
{128,MEM_BLOCK_ITEM_128_BLOCK_NUM,NULL,"Block Pool 128"},
{256,MEM_BLOCK_ITEM_256_BLOCK_NUM,NULL,"Block Pool 256"}
};
/*
MEM_APP_BLOCK_64 memAppBlock64 = {64,MEM_BLOCK_ITEM_128_BLOCK_NUM,pMemBlockItem64,"Block Pool 64"};
MEM_APP_BLOCK_128 memAppBlock128 = {128,MEM_BLOCK_ITEM_128_BLOCK_NUM,pMemBlockItem128,"Block Pool 128"};
MEM_APP_BLOCK_256 memAppBlock256 = {256,MEM_BLOCK_ITEM_256_BLOCK_NUM,pMemBlockItem256,"Block Pool 256"};
*/
pMemBlockItem64 = (MEM_BLOCK_ITEM_64 *)malloc (MEM_BLOCK_ITEM_64_BLOCK_NUM * sizeof(MEM_BLOCK_ITEM_64));
pMemBlockItem128 = (MEM_BLOCK_ITEM_128 *)malloc (MEM_BLOCK_ITEM_128_BLOCK_NUM * sizeof(MEM_BLOCK_ITEM_128));
pMemBlockItem256 = (MEM_BLOCK_ITEM_256 *)malloc (MEM_BLOCK_ITEM_256_BLOCK_NUM * sizeof(MEM_BLOCK_ITEM_256));
memAppBlock[0].MEM_BLOCK_ITEM.pBlockHead64 = pMemBlockItem64;
memAppBlock[1].MEM_BLOCK_ITEM.pBlockHead128 = pMemBlockItem128;
memAppBlock[2].MEM_BLOCK_ITEM.pBlockHead256 = pMemBlockItem256;
/*
memBlockPool.memAppBlock64 = &memAppBlock64; //将数组中的值赋予memBlockPool
memBlockPool.memAppBlock128 = &memAppBlock128;
memBlockPool.memAppBlock256 = &memAppBlock256;
*/
memBlockPool.pMemAppBlock[0] = &memAppBlock[0]; //将数组中的值赋予memBlockPool 但是这些值只是在当前函数内有用,脱离该函数后便失效,因为他说数组
memBlockPool.pMemAppBlock[1] = &memAppBlock[1];
memBlockPool.pMemAppBlock[2] = &memAppBlock[2];
for (i = 0; i < MEM_BLOCK_ITEM_64_BLOCK_NUM - 1; i++)
{
pTempMemBlockItem64 = (MEM_BLOCK_ITEM_64 *) (pMemBlockItem64 + i);
pTempMemBlockItem64->pNext = NULL;
pMemBlockItem64->flag = 0;
pMemBlockItem64->nBlockSize = BLOCK_SIZE_64;
memset(pMemBlockItem64->memory,0,pMemBlockItem64->nBlockSize);
pMemBlockItem64->pNext = pTempMemBlockItem64;
}
/*初始化最后一个块*/
pTempMemBlockItem64->flag = 0;
pTempMemBlockItem64->nBlockSize = BLOCK_SIZE_64;
memset(pTempMemBlockItem64->memory,0,pMemBlockItem64->nBlockSize);
for (i = 0; i < MEM_BLOCK_ITEM_128_BLOCK_NUM-1; i++)
{
pTempMemBlockItem128 = (MEM_BLOCK_ITEM_128 *) (pMemBlockItem128 + i);
pTempMemBlockItem128->pNext = NULL;
pMemBlockItem128->flag = 0;
pMemBlockItem128->nBlockSize = BLOCK_SIZE_128;
memset(pMemBlockItem128->memory,0,pMemBlockItem128->nBlockSize);
pMemBlockItem128->pNext = pTempMemBlockItem128;
}
/*初始化最后一个块*/
pTempMemBlockItem128->flag = 0;
pTempMemBlockItem128->nBlockSize = BLOCK_SIZE_128;
memset(pTempMemBlockItem128->memory,0,pMemBlockItem128->nBlockSize);
for (i = 0; i < MEM_BLOCK_ITEM_256_BLOCK_NUM-1; i++)
{
pTempMemBlockItem256 = (MEM_BLOCK_ITEM_256 *) (pMemBlockItem256 + i);
pTempMemBlockItem256->pNext = NULL;
pMemBlockItem256->flag = 0;
pMemBlockItem256->nBlockSize = BLOCK_SIZE_256;
memset(pMemBlockItem256->memory,0,pMemBlockItem256->nBlockSize);
pMemBlockItem256->pNext = pTempMemBlockItem256;
}
/*初始化最后一个块*/
pTempMemBlockItem256->flag = 0;
pTempMemBlockItem256->nBlockSize = BLOCK_SIZE_256;
memset(pTempMemBlockItem256->memory,0,pMemBlockItem256->nBlockSize);
}
int * mem_block_alloc(int nSize)
{
int i = 0;
int j = 0;
MEM_BLOCK_ITEM_64 * pMemBlockItem64 = NULL;
MEM_BLOCK_ITEM_128 * pMemBlockItem128 = NULL;
MEM_BLOCK_ITEM_256 * pMemBlockItem256 = NULL;
if (nSize <= MAX_BLOCK_SIZE)
{
for (i = 0; i < MAX_BLOCKS_NUM; i++)
{
if (nSize > memBlockPool.pMemAppBlock[i]->nBlockSize)
{
continue;
}
else
{
switch(i)
{
case 0:
pMemBlockItem64 = (MEM_BLOCK_ITEM_64 *)memBlockPool.pMemAppBlock[i]->MEM_BLOCK_ITEM.pBlockHead64; //前面不需要强制类型转换
break;
case 1:
pMemBlockItem128 = (MEM_BLOCK_ITEM_128 *)memBlockPool.pMemAppBlock[i]->MEM_BLOCK_ITEM.pBlockHead128;
break;
case 2:
pMemBlockItem256 = (MEM_BLOCK_ITEM_256 *)memBlockPool.pMemAppBlock[i]->MEM_BLOCK_ITEM.pBlockHead256;
break;
default:
printf("Error: No Blocks already!/n");
return NULL;
}
for (j = 0; j < memBlockPool.pMemAppBlock[i]->nBlockSize; j++)
{
if (0 == i)
{
if (pMemBlockItem64->flag == 0)
{
pMemBlockItem64->flag = 1;
return pMemBlockItem64->memory;
}
else
{
pMemBlockItem64 = pMemBlockItem64->pNext;
continue;
}
}
if (1 == i)
{
if (pMemBlockItem128->flag == 0)
{
pMemBlockItem128->flag = 1;
return pMemBlockItem128->memory;
}
else
{
pMemBlockItem128 = pMemBlockItem128->pNext;
continue;
}
}
if (2 == i)
{
if (pMemBlockItem256->flag == 0)
{
pMemBlockItem256->flag = 1;
return pMemBlockItem256->memory;
}
else
{
pMemBlockItem256 = pMemBlockItem256->pNext;
continue;
}
}
}
}
}
}
else
{
printf("can not alloc memory in Blocks Pool/n");
return NULL;
}
}
/*如何确定其所在结构的类型*/
void mem_block_free(int *p)
{
int nBlockSize = 0;
int flag = 0;
int *pMemBlockAddr = NULL;
int *pMemBlockSize = NULL;
pMemBlockAddr = (int)p - sizeof(int);
*pMemBlockAddr = 1; //这一点移植性不好
pMemBlockSize = (int)p - 2*sizeof(int); //得到结构体成员nBlockSize的值
nBlockSize = *pMemBlockSize;
memset(p,0,nBlockSize);
}
void mem_block_uninit()
{
free(memBlockPool.pMemAppBlock[0]);
free(memBlockPool.pMemAppBlock[1]);
free(memBlockPool.pMemAppBlock[2]);
memBlockPool.pMemAppBlock[0] = NULL;
memBlockPool.pMemAppBlock[1] = NULL;
memBlockPool.pMemAppBlock[2] = NULL;
}
/////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include "mem_byte.h"
myPOOL pool;
int main()
{
pool = my_mem_init();
}
myPOOL my_mem_init()
{
myPOOL pool;
mySTARTCB *pStartcbFirst;
myENDCB *pEndcbFirst;
pStartcbFirst = (mySTARTCB *)malloc(DEFAULT_MEM_SIZE);
memset((int *)pStartcbFirst,0,DEFAULT_MEM_SIZE);
pStartcbFirst->pStartCbBegin = (int *)pStartcbFirst; /*字节池首地址*/
pStartcbFirst->flag = 0;
pStartcbFirst->nSize = DEFAULT_MEM_SIZE - 28; /*真正内存的大小*/
pStartcbFirst->pFront = NULL;
pStartcbFirst->pNext = NULL;
pEndcbFirst = (myENDCB *)((int *)pStartcbFirst + DEFAULT_MEM_SIZE -20);
pEndcbFirst->nCRC = 0;
pEndcbFirst->pEndCbToMemBegin = (int *)pStartcbFirst + 20;
pStartcbFirst->pEndCb = pEndcbFirst;
pool.pHeapBegin = (int *)pStartcbFirst; /*会不会有问题*/
pool.headPOOL = pStartcbFirst;
pool.nMemSize = DEFAULT_MEM_SIZE;
return pool;
}
int * my_mem_alloc(int nSize)
{
mySTARTCB *pTemp = NULL;
mySTARTCB *pTempSTARTCB;
myENDCB *pTempENDCB;
mySTARTCB *pTempNewSTARTCB;
myENDCB *pTempNewENDCB;
for (pTemp = pool.headPOOL; NULL != pTemp; pTemp = pTemp->pNext)
{
if (nSize > pTemp->nSize) /* 如果申请的内存大于当前字节池的容量,则放弃 */
{
continue;
}
else
{
/*分给它,然后看是否把当前字节池分解为两部分*/
pTemp->flag = 1;
if (pTemp->nSize - nSize > MIN_MEM_SIZE) /* 如果剩余的空间大于最小内存空间则将其进行分解 */
{
/* 为分解得到的段的前一段的末尾字段赋值 */
pTempNewENDCB = (myENDCB *)(pTemp->pStartCbBegin + nSize + 20);
pTempNewENDCB->nCRC = 0;
pTempNewENDCB->pEndCbToMemBegin = pTemp->pStartCbBegin + 20;
/* 为分解得到的段的后一段的首字段赋值 */
pTempNewSTARTCB->flag = 0;
pTempNewSTARTCB->nSize = pTemp->nSize - nSize - 28;
pTempNewSTARTCB->pEndCb = pTemp->pEndCb;
pTempNewSTARTCB->pFront = pTemp;
pTempNewSTARTCB->pNext = pTemp->pNext;
pTempNewSTARTCB->pStartCbBegin = pTemp->pStartCbBegin + nSize + 48;
/* 为分解得到的后一段的末尾字段赋值 */
pTemp->pEndCb->nCRC = 0;
pTemp->pEndCb->pEndCbToMemBegin = pTempNewSTARTCB->pStartCbBegin + 20;
pTemp->pNext = pTempNewSTARTCB;
pTemp->nSize = nSize;
pTemp->pEndCb = pTempNewENDCB;
}
/* 分配内存成功,返回分配内存的首地址 */
return pTemp->pStartCbBegin + 20;
}
/* 找不到合适的内存块,申请内存失败,返回-1 */
if (NULL == pTemp->pNext)
{
return -1;
}
}
}
void my_mem_free(void *p)
{
mySTARTCB * pTemp;
for (pTemp = pool.headPOOL; pTemp != NULL && (int *)p != pTemp->pStartCbBegin + 20; pTemp = pTemp ->pNext)
{
pTemp->flag = 0;
if (pTemp->pFront->flag == 0 && NULL == pTemp->pFront && pTemp->pNext->flag == 0 && NULL !=pTemp->pNext ) /* 如果前后内存均为使用,则合并*/
{
pTemp = pTemp->pFront;
pTemp->nSize = pTemp->nSize + pTemp->pNext->nSize + pTemp->pNext->pNext->nSize;
pTemp->pNext->pNext->pEndCb->nCRC = 0;
pTemp->pNext->pNext->pEndCb->pEndCbToMemBegin = pTemp->pStartCbBegin + 20;
}
else if (pTemp->pNext != NULL && pTemp->pNext->flag == 0)/* 如果后面的内存未使用,则合并 */
{
pTemp->nSize = pTemp->nSize + pTemp->pNext->nSize + 28;
pTemp->pNext = pTemp->pNext->pNext;
pTemp->pNext->pEndCb->pEndCbToMemBegin = pTemp->pStartCbBegin + 20;
pTemp->pEndCb = pTemp->pNext->pEndCb;
}
else if(pTemp->pFront->flag == 0 && pTemp->pFront != NULL)/* 如果前面的内存未使用,则合并 */
{
pTemp = pTemp->pFront;
pTemp->nSize = pTemp->nSize + pTemp->pNext->nSize + 28;
pTemp->pNext = pTemp->pNext->pNext;
pTemp->pNext->pEndCb->pEndCbToMemBegin = pTemp->pStartCbBegin + 20;
pTemp->pEndCb = pTemp->pNext->pEndCb;
}
memset((int *)(pTemp->pStartCbBegin + 20),0,pTemp->nSize);
return 0;
}
if (NULL == pTemp)
{
return -1;
}
}
void my_mem_deinit()
{
free(pool->pHeapBegin);
pool->pHeapBegin = NULL;
}
//////////////////////////////
#define DEFAULT_MEM_SIZE 4096
#define DEFAULT_MEM_START 0
#define MIN_MEM_SIZE 44
//typedef U32 unsigned int;
//typedef U8 unsigned char;
typedef struct START_CB {
int * pStartCbBegin; //指向申请内存的首地址,实际自由内存开始的位置为pStartCbBegin - 5 * 4
struct START_CB * pFront;
struct START_CB * pNext;
struct END_CB *pEndCb;
int flag;
int nSize;
}mySTARTCB;
typedef struct END_CB {
int *pEndCbToMemBegin; //指向内存块首地址 ? 内存块首地址指的是什么
int nCRC;
}myENDCB;
typedef struct POOL {
int *pHeapBegin;
mySTARTCB * headPOOL;
int nMemSize;
}myPOOL;
myPOOL my_mem_init();
void my_mem_alloc();
void my_mem_free();
void my_mem_deinit();
#define MEM_BLOCK_ITEM_128_BLOCK_NUM 512
#define MEM_BLOCK_ITEM_256_BLOCK_NUM 128
#define BLOCK_SIZE_64 64
#define BLOCK_SIZE_128 128
#define BLOCK_SIZE_256 256
#define MAX_BLOCKS_NUM 3
#define MAX_BLOCK_SIZE 256
typedef struct MEMBLOCKITEM64{
struct MEMBLOCKITEM64 *pNext;
int nBlockSize;
int flag; // free/use
int memory[32];
}MEM_BLOCK_ITEM_64;
typedef struct MEMBLOCKITEM128{
struct MEMBLOCKITEM128 *pNext;
int nBlockSize;
int flag; // free/use
int memory[128];
}MEM_BLOCK_ITEM_128;
typedef struct MEMBLOCKITEM256 {
struct MEMBLOCKITEM256 *pNext;
int nBlockSize;
int flag; // free/use
int memory[256];
}MEM_BLOCK_ITEM_256;
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_64 * pBlockHead64;
char text[16];
}MEM_APP_BLOCK_64;
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_128 * pBlockHead64;
char text[16];
}MEM_APP_BLOCK_128;
/*
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_256 * pBlockHead64;
char text[16];
}MEM_APP_BLOCK_256;
*/
typedef struct {
int nBlockSize;
int nBlockNum;
union {
MEM_BLOCK_ITEM_64 * pBlockHead64;
MEM_BLOCK_ITEM_128 * pBlockHead128;
MEM_BLOCK_ITEM_256 * pBlockHead256;
} MEM_BLOCK_ITEM;
char text[16];
}MEM_APP_BLOCK;
/*
typedef struct {
int nBlockSize; //每个内存块的大小
int nBlocksNum; //内存池中内存块的个数
MEM_BLOCK_ITEM_64 * pBlockHead64;
char text[16];
}MEM_APP_BLOCK_64;
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_128 * pBlockHead128;
char text[16];
}MEM_APP_BLOCK_128;
typedef struct {
int nBlockSize;
int nBlockNum;
MEM_BLOCK_ITEM_256 *pBlockHead256;
char text[16];
}MEM_APP_BLOCK_256;
*/
/*
typedef struct MEM_BLOCK_POOL {
MEM_APP_BLOCK_64 *memAppBlock64; // 采用指针,便于后面的赋值,否则后面由于只能通过赋值的方式给结构体赋值,将会造成很大的空间浪费
MEM_APP_BLOCK_128 *memAppBlock128;
MEM_APP_BLOCK_256 *memAppBlock256;
}MEMBLOCKPOOL;
MEMBLOCKPOOL memBlockPool;
*/
typedef struct MEM_BLOCK_POOL {
MEM_APP_BLOCK *pMemAppBlock[3];
}MEMBLOCKPOOL;
MEMBLOCKPOOL memBlockPool;
/////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include "mem_block.h"
void mem_block_init();
int * mem_block_alloc();
void mem_block_free();
void mem_block_uninit();
void main()
{
int *pMemBlockAddr = NULL;
mem_block_init();
pMemBlockAddr =mem_block_alloc(5 * sizeof(int));
memset(pMemBlockAddr,5,5*sizeof(int));
//printf("%s/n",memBlockPool.pMemAppBlock[0]->text);
printf("%d/n",memBlockPool.pMemAppBlock[0]->MEM_BLOCK_ITEM.pBlockHead64->memory[0]);
}
void mem_block_init()
{
/***************************************************************************
分配得到2048个64 byte大小的内存块, 512 * 128 byte 大小的内存块 128 * 256
byte的心的内存块
****************************************************************************/
int i = 0;
MEM_BLOCK_ITEM_64 *pMemBlockItem64;
MEM_BLOCK_ITEM_64 *pTempMemBlockItem64;
MEM_BLOCK_ITEM_128 *pMemBlockItem128;
MEM_BLOCK_ITEM_128 *pTempMemBlockItem128;
MEM_BLOCK_ITEM_256 *pMemBlockItem256;
MEM_BLOCK_ITEM_256 *pTempMemBlockItem256;
/*
MEM_BLOCK_ITEM memAppBlock[3] = {
{64,MEM_BLOCK_ITEM_128_BLOCK_NUM,pMemBlockItem64,"Block Pool 64"},
{128,MEM_BLOCK_ITEM_128_BLOCK_NUM,pMemBlockItem128,"Block Pool 128"},
{256,MEM_BLOCK_ITEM_256_BLOCK_NUM,pMemBlockItem256,"Block Pool 256"}
};
*/
MEM_APP_BLOCK memAppBlock[3] = {
{64,MEM_BLOCK_ITEM_128_BLOCK_NUM,NULL,"Block Pool 64"},
{128,MEM_BLOCK_ITEM_128_BLOCK_NUM,NULL,"Block Pool 128"},
{256,MEM_BLOCK_ITEM_256_BLOCK_NUM,NULL,"Block Pool 256"}
};
/*
MEM_APP_BLOCK_64 memAppBlock64 = {64,MEM_BLOCK_ITEM_128_BLOCK_NUM,pMemBlockItem64,"Block Pool 64"};
MEM_APP_BLOCK_128 memAppBlock128 = {128,MEM_BLOCK_ITEM_128_BLOCK_NUM,pMemBlockItem128,"Block Pool 128"};
MEM_APP_BLOCK_256 memAppBlock256 = {256,MEM_BLOCK_ITEM_256_BLOCK_NUM,pMemBlockItem256,"Block Pool 256"};
*/
pMemBlockItem64 = (MEM_BLOCK_ITEM_64 *)malloc (MEM_BLOCK_ITEM_64_BLOCK_NUM * sizeof(MEM_BLOCK_ITEM_64));
pMemBlockItem128 = (MEM_BLOCK_ITEM_128 *)malloc (MEM_BLOCK_ITEM_128_BLOCK_NUM * sizeof(MEM_BLOCK_ITEM_128));
pMemBlockItem256 = (MEM_BLOCK_ITEM_256 *)malloc (MEM_BLOCK_ITEM_256_BLOCK_NUM * sizeof(MEM_BLOCK_ITEM_256));
memAppBlock[0].MEM_BLOCK_ITEM.pBlockHead64 = pMemBlockItem64;
memAppBlock[1].MEM_BLOCK_ITEM.pBlockHead128 = pMemBlockItem128;
memAppBlock[2].MEM_BLOCK_ITEM.pBlockHead256 = pMemBlockItem256;
/*
memBlockPool.memAppBlock64 = &memAppBlock64; //将数组中的值赋予memBlockPool
memBlockPool.memAppBlock128 = &memAppBlock128;
memBlockPool.memAppBlock256 = &memAppBlock256;
*/
memBlockPool.pMemAppBlock[0] = &memAppBlock[0]; //将数组中的值赋予memBlockPool 但是这些值只是在当前函数内有用,脱离该函数后便失效,因为他说数组
memBlockPool.pMemAppBlock[1] = &memAppBlock[1];
memBlockPool.pMemAppBlock[2] = &memAppBlock[2];
for (i = 0; i < MEM_BLOCK_ITEM_64_BLOCK_NUM - 1; i++)
{
pTempMemBlockItem64 = (MEM_BLOCK_ITEM_64 *) (pMemBlockItem64 + i);
pTempMemBlockItem64->pNext = NULL;
pMemBlockItem64->flag = 0;
pMemBlockItem64->nBlockSize = BLOCK_SIZE_64;
memset(pMemBlockItem64->memory,0,pMemBlockItem64->nBlockSize);
pMemBlockItem64->pNext = pTempMemBlockItem64;
}
/*初始化最后一个块*/
pTempMemBlockItem64->flag = 0;
pTempMemBlockItem64->nBlockSize = BLOCK_SIZE_64;
memset(pTempMemBlockItem64->memory,0,pMemBlockItem64->nBlockSize);
for (i = 0; i < MEM_BLOCK_ITEM_128_BLOCK_NUM-1; i++)
{
pTempMemBlockItem128 = (MEM_BLOCK_ITEM_128 *) (pMemBlockItem128 + i);
pTempMemBlockItem128->pNext = NULL;
pMemBlockItem128->flag = 0;
pMemBlockItem128->nBlockSize = BLOCK_SIZE_128;
memset(pMemBlockItem128->memory,0,pMemBlockItem128->nBlockSize);
pMemBlockItem128->pNext = pTempMemBlockItem128;
}
/*初始化最后一个块*/
pTempMemBlockItem128->flag = 0;
pTempMemBlockItem128->nBlockSize = BLOCK_SIZE_128;
memset(pTempMemBlockItem128->memory,0,pMemBlockItem128->nBlockSize);
for (i = 0; i < MEM_BLOCK_ITEM_256_BLOCK_NUM-1; i++)
{
pTempMemBlockItem256 = (MEM_BLOCK_ITEM_256 *) (pMemBlockItem256 + i);
pTempMemBlockItem256->pNext = NULL;
pMemBlockItem256->flag = 0;
pMemBlockItem256->nBlockSize = BLOCK_SIZE_256;
memset(pMemBlockItem256->memory,0,pMemBlockItem256->nBlockSize);
pMemBlockItem256->pNext = pTempMemBlockItem256;
}
/*初始化最后一个块*/
pTempMemBlockItem256->flag = 0;
pTempMemBlockItem256->nBlockSize = BLOCK_SIZE_256;
memset(pTempMemBlockItem256->memory,0,pMemBlockItem256->nBlockSize);
}
int * mem_block_alloc(int nSize)
{
int i = 0;
int j = 0;
MEM_BLOCK_ITEM_64 * pMemBlockItem64 = NULL;
MEM_BLOCK_ITEM_128 * pMemBlockItem128 = NULL;
MEM_BLOCK_ITEM_256 * pMemBlockItem256 = NULL;
if (nSize <= MAX_BLOCK_SIZE)
{
for (i = 0; i < MAX_BLOCKS_NUM; i++)
{
if (nSize > memBlockPool.pMemAppBlock[i]->nBlockSize)
{
continue;
}
else
{
switch(i)
{
case 0:
pMemBlockItem64 = (MEM_BLOCK_ITEM_64 *)memBlockPool.pMemAppBlock[i]->MEM_BLOCK_ITEM.pBlockHead64; //前面不需要强制类型转换
break;
case 1:
pMemBlockItem128 = (MEM_BLOCK_ITEM_128 *)memBlockPool.pMemAppBlock[i]->MEM_BLOCK_ITEM.pBlockHead128;
break;
case 2:
pMemBlockItem256 = (MEM_BLOCK_ITEM_256 *)memBlockPool.pMemAppBlock[i]->MEM_BLOCK_ITEM.pBlockHead256;
break;
default:
printf("Error: No Blocks already!/n");
return NULL;
}
for (j = 0; j < memBlockPool.pMemAppBlock[i]->nBlockSize; j++)
{
if (0 == i)
{
if (pMemBlockItem64->flag == 0)
{
pMemBlockItem64->flag = 1;
return pMemBlockItem64->memory;
}
else
{
pMemBlockItem64 = pMemBlockItem64->pNext;
continue;
}
}
if (1 == i)
{
if (pMemBlockItem128->flag == 0)
{
pMemBlockItem128->flag = 1;
return pMemBlockItem128->memory;
}
else
{
pMemBlockItem128 = pMemBlockItem128->pNext;
continue;
}
}
if (2 == i)
{
if (pMemBlockItem256->flag == 0)
{
pMemBlockItem256->flag = 1;
return pMemBlockItem256->memory;
}
else
{
pMemBlockItem256 = pMemBlockItem256->pNext;
continue;
}
}
}
}
}
}
else
{
printf("can not alloc memory in Blocks Pool/n");
return NULL;
}
}
/*如何确定其所在结构的类型*/
void mem_block_free(int *p)
{
int nBlockSize = 0;
int flag = 0;
int *pMemBlockAddr = NULL;
int *pMemBlockSize = NULL;
pMemBlockAddr = (int)p - sizeof(int);
*pMemBlockAddr = 1; //这一点移植性不好
pMemBlockSize = (int)p - 2*sizeof(int); //得到结构体成员nBlockSize的值
nBlockSize = *pMemBlockSize;
memset(p,0,nBlockSize);
}
void mem_block_uninit()
{
free(memBlockPool.pMemAppBlock[0]);
free(memBlockPool.pMemAppBlock[1]);
free(memBlockPool.pMemAppBlock[2]);
memBlockPool.pMemAppBlock[0] = NULL;
memBlockPool.pMemAppBlock[1] = NULL;
memBlockPool.pMemAppBlock[2] = NULL;
}
/////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include "mem_byte.h"
myPOOL pool;
int main()
{
pool = my_mem_init();
}
myPOOL my_mem_init()
{
myPOOL pool;
mySTARTCB *pStartcbFirst;
myENDCB *pEndcbFirst;
pStartcbFirst = (mySTARTCB *)malloc(DEFAULT_MEM_SIZE);
memset((int *)pStartcbFirst,0,DEFAULT_MEM_SIZE);
pStartcbFirst->pStartCbBegin = (int *)pStartcbFirst; /*字节池首地址*/
pStartcbFirst->flag = 0;
pStartcbFirst->nSize = DEFAULT_MEM_SIZE - 28; /*真正内存的大小*/
pStartcbFirst->pFront = NULL;
pStartcbFirst->pNext = NULL;
pEndcbFirst = (myENDCB *)((int *)pStartcbFirst + DEFAULT_MEM_SIZE -20);
pEndcbFirst->nCRC = 0;
pEndcbFirst->pEndCbToMemBegin = (int *)pStartcbFirst + 20;
pStartcbFirst->pEndCb = pEndcbFirst;
pool.pHeapBegin = (int *)pStartcbFirst; /*会不会有问题*/
pool.headPOOL = pStartcbFirst;
pool.nMemSize = DEFAULT_MEM_SIZE;
return pool;
}
int * my_mem_alloc(int nSize)
{
mySTARTCB *pTemp = NULL;
mySTARTCB *pTempSTARTCB;
myENDCB *pTempENDCB;
mySTARTCB *pTempNewSTARTCB;
myENDCB *pTempNewENDCB;
for (pTemp = pool.headPOOL; NULL != pTemp; pTemp = pTemp->pNext)
{
if (nSize > pTemp->nSize) /* 如果申请的内存大于当前字节池的容量,则放弃 */
{
continue;
}
else
{
/*分给它,然后看是否把当前字节池分解为两部分*/
pTemp->flag = 1;
if (pTemp->nSize - nSize > MIN_MEM_SIZE) /* 如果剩余的空间大于最小内存空间则将其进行分解 */
{
/* 为分解得到的段的前一段的末尾字段赋值 */
pTempNewENDCB = (myENDCB *)(pTemp->pStartCbBegin + nSize + 20);
pTempNewENDCB->nCRC = 0;
pTempNewENDCB->pEndCbToMemBegin = pTemp->pStartCbBegin + 20;
/* 为分解得到的段的后一段的首字段赋值 */
pTempNewSTARTCB->flag = 0;
pTempNewSTARTCB->nSize = pTemp->nSize - nSize - 28;
pTempNewSTARTCB->pEndCb = pTemp->pEndCb;
pTempNewSTARTCB->pFront = pTemp;
pTempNewSTARTCB->pNext = pTemp->pNext;
pTempNewSTARTCB->pStartCbBegin = pTemp->pStartCbBegin + nSize + 48;
/* 为分解得到的后一段的末尾字段赋值 */
pTemp->pEndCb->nCRC = 0;
pTemp->pEndCb->pEndCbToMemBegin = pTempNewSTARTCB->pStartCbBegin + 20;
pTemp->pNext = pTempNewSTARTCB;
pTemp->nSize = nSize;
pTemp->pEndCb = pTempNewENDCB;
}
/* 分配内存成功,返回分配内存的首地址 */
return pTemp->pStartCbBegin + 20;
}
/* 找不到合适的内存块,申请内存失败,返回-1 */
if (NULL == pTemp->pNext)
{
return -1;
}
}
}
void my_mem_free(void *p)
{
mySTARTCB * pTemp;
for (pTemp = pool.headPOOL; pTemp != NULL && (int *)p != pTemp->pStartCbBegin + 20; pTemp = pTemp ->pNext)
{
pTemp->flag = 0;
if (pTemp->pFront->flag == 0 && NULL == pTemp->pFront && pTemp->pNext->flag == 0 && NULL !=pTemp->pNext ) /* 如果前后内存均为使用,则合并*/
{
pTemp = pTemp->pFront;
pTemp->nSize = pTemp->nSize + pTemp->pNext->nSize + pTemp->pNext->pNext->nSize;
pTemp->pNext->pNext->pEndCb->nCRC = 0;
pTemp->pNext->pNext->pEndCb->pEndCbToMemBegin = pTemp->pStartCbBegin + 20;
}
else if (pTemp->pNext != NULL && pTemp->pNext->flag == 0)/* 如果后面的内存未使用,则合并 */
{
pTemp->nSize = pTemp->nSize + pTemp->pNext->nSize + 28;
pTemp->pNext = pTemp->pNext->pNext;
pTemp->pNext->pEndCb->pEndCbToMemBegin = pTemp->pStartCbBegin + 20;
pTemp->pEndCb = pTemp->pNext->pEndCb;
}
else if(pTemp->pFront->flag == 0 && pTemp->pFront != NULL)/* 如果前面的内存未使用,则合并 */
{
pTemp = pTemp->pFront;
pTemp->nSize = pTemp->nSize + pTemp->pNext->nSize + 28;
pTemp->pNext = pTemp->pNext->pNext;
pTemp->pNext->pEndCb->pEndCbToMemBegin = pTemp->pStartCbBegin + 20;
pTemp->pEndCb = pTemp->pNext->pEndCb;
}
memset((int *)(pTemp->pStartCbBegin + 20),0,pTemp->nSize);
return 0;
}
if (NULL == pTemp)
{
return -1;
}
}
void my_mem_deinit()
{
free(pool->pHeapBegin);
pool->pHeapBegin = NULL;
}
//////////////////////////////
#define DEFAULT_MEM_SIZE 4096
#define DEFAULT_MEM_START 0
#define MIN_MEM_SIZE 44
//typedef U32 unsigned int;
//typedef U8 unsigned char;
typedef struct START_CB {
int * pStartCbBegin; //指向申请内存的首地址,实际自由内存开始的位置为pStartCbBegin - 5 * 4
struct START_CB * pFront;
struct START_CB * pNext;
struct END_CB *pEndCb;
int flag;
int nSize;
}mySTARTCB;
typedef struct END_CB {
int *pEndCbToMemBegin; //指向内存块首地址 ? 内存块首地址指的是什么
int nCRC;
}myENDCB;
typedef struct POOL {
int *pHeapBegin;
mySTARTCB * headPOOL;
int nMemSize;
}myPOOL;
myPOOL my_mem_init();
void my_mem_alloc();
void my_mem_free();
void my_mem_deinit();
相关文章推荐
- 内存管理作业练习
- 内存管理作业练习
- 内存管理作业练习
- 内存管理作业练习
- 内存管理作业练习
- 内存管理作业练习
- 高级编程技术作业第四周 第七章课后练习
- 黑马作业(基础班d25)io流的练习
- SQL查询基本练习1:(作业)
- 高级编程技术作业第五周 第九章课后练习
- Linux 第30天: (08月5日) 练习和作业
- 作业综合练习-配置+自定义函数设置
- Java中 数组作业的练习
- Linux 第12天: (08月19日) 练习和作业
- C语言练习作业(六)
- 作业以及平时练习时出现的异常.(一)(转)
- 作业8:单元测试练习
- linux运维实战练习-2015年8月27日课程作业
- 2015.8.25作业(练习):用户管理各命令的使用
- linux运维实战练习-2015年8月30日课程作业