c语言基于固定块链表的内存池 (转)
来源:互联网 发布:淘宝购买会计证被骗 编辑:程序博客网 时间:2024/04/30 16:55
内存池对于长时间运行的程序特别有用,可以减少内存碎片,提高效率,避免内存益处等众多好处,网上流传的内存池模型有很多种大致分为固定快大小的链表(本文采用的),这种内存池的优点是速度快,碎片少,缺点是灵活性不足,但对于搞定能的服务器端程序而言很多的数据都是已知的,为了追求速度这种牺牲是可以理解的;另外还有基于大块内存的可变长度内存分配方法,优点是对于字符串类似的应用提供了很好的解决方法,缺点是要自己管理碎片,相当于在系统的内存管理之上再构建一个内存管理,同样有查找合适内存快的开销;
本文采用的是固定内存快的内存池,当所要求分配的内存大于快的大小时则直接交由系统分配,以后才会采用其他的方式写出内存池,采取性能最优原则,另外对于多线程还需要系统锁,也会增加开销,如何权衡需要多种方案对比才能得出结论。
源代码如下,经测试直接分配达到测试的循环需求需要500毫秒左右,采用内存池在100毫秒左右
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "testStruct.h"
#define BLKSIZ 80 //回收块的大小
#define STKSIZ 4000 //每块内存大小
struct BLOCK
{
char *link;
char data[BLKSIZ];
};
static struct BLOCK * heap;
static struct BLOCK * top_of_heap;
static struct BLOCK * btm_of_heap;
int kint=0;
/*初始化*/
void Init_heap()
{
unsigned blk;
struct BLOCK *ptr;
heap=(struct BLOCK *)malloc(BLKSIZ);//第一个快
btm_of_heap=heap;
ptr=heap;
for(blk=0;blk<500;blk++)
{
ptr->link=(struct BLOCK *)malloc(BLKSIZ);
ptr=ptr->link;
}
ptr->link=NULL;
top_of_heap=ptr;
}
/*根据系统需求增加新的块*/
void expendMem()
{
unsigned blk;
struct BLOCK *ptr;
heap=(struct BLOCK *)malloc(BLKSIZ);//第一个快
top_of_heap=heap;
ptr=heap;
for(blk=0;blk<49;blk++)
{
ptr->link=(struct BLOCK *)malloc(BLKSIZ);
ptr=ptr->link;
}
ptr->link=NULL;
top_of_heap=ptr;
kint++;
printf(" %i ",kint);
}
/*释放一个区域的内存*/
void My_Free(struct BLOCK *ptr)
{
if(ptr>=btm_of_heap)
{
if(ptr<top_of_heap)
{
ptr->link=heap;
heap=ptr;
return;
}
else
{
free(ptr);
//printf("释放");
return;
}
}
puts("/nAttempt to free blocks ");
}
/*申请一块内存*/
void *Allocate(unsigned bytes)
{
void *ptr;
if(bytes<=BLKSIZ)
{
if(heap!=NULL)
{
ptr=heap;
heap=heap->link;
return ptr;
}
else
{
expendMem();
}
}
if(ptr=malloc(bytes))
{
return ptr;
}
puts("//Ins memory");
}
/*主函数*/
int main()
{
int j=0;
int lint=0;
struct BLOCK *p[1000];
char User[20] = {"xiaoming"} ;
// char Password[20] = "123456";
DWORD last,current;
last=GetTickCount();
Init_heap();
for(j=0;j<500;j++)
{
int i;
for(i=0;i<1000;i++)
{
p[i]=Allocate(20);// New(struct Login,1);
strcpy(p[i]->data,User);
// strcpy(p->Password,Password);
}
for(i=0;i<1000;i++)
My_Free(p[i]);
}
heap=btm_of_heap;
while(heap->link!=NULL)
{/*循环输出内存管理链表中的序列号,看看有没有断链*/
lint++;
printf("l:%i ",lint);
heap=heap->link;
}
current=GetTickCount();
printf("总共耗时 %d",current-last);
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/netpet/archive/2008/08/27/2836399.aspx
- c语言基于固定块链表的内存池 (转)
- [原创]:c语言基于固定块链表的内存池
- 固定块内存池c语言实现
- C语言-固定大小内存池
- C语言之访问固定的内存位置
- 一种固定内存池的实现(C++)
- 袖珍版固定大小 内存池1(c语言)
- 基于C语言的内存池的设计与实现
- 基于C语言的内存池的设计与实现
- 基于C语言的内存池的设计与实现
- 基于C语言的内存池的设计与实现
- 基于C语言的内存池的设计与实现
- 内存的管理艺术(基于C语言)1
- 内存的管理艺术(基于C语言)2
- 基于C语言的内存文件实现
- 【转】基于C语言的内存池的设计与实现
- 基于链表的C语言堆内存检测
- 固定长度的内存池
- 表头固定,内容可以滚动例子
- web和ftp服务器的架设
- Flex拓扑图的设计(一)
- 站在巨人的肩膀上
- js特效-震动下拉菜单、抖动窗口
- c语言基于固定块链表的内存池 (转)
- 变态
- Linux下rsync参数详解
- (转)u-boot-2009.08在2440上的移植详解(三)
- windows域控身份认证原理
- 常量指针、指针常量以及指向常量的指针常量
- java对时间的操作
- java对时间的操作
- (转)u-boot-2009.08在2440上的移植详解(四)