Bootstrap

Linux 池化组件之二:Memory Pool

1.Memory Pool

        上文说到线程池的核心思想都是,减少用户层向内核操作系统申请资源的频率,从而减少了线程创建和销毁的开销。内存池的思想和其类似,也是减少用户层向内核操作系统申请存储资源的频率,同时其还具有防止程序长时间运行,产生过多的内存碎片导致的计算终止。内存池的做法是向操作系统一次申请一块较大的内存,然后由由用户层对该块内存进行管理。内存池的实现有多种根据不同的需求可以定制化设计不同的内存池,本文采用采用在内存池分配固定大小的内存空间的方式实现内存池。

2.内存池的代码



#include <stdio.h>
#include <stdlib.h>

#include <string.h>


#define MEM_PAGE_SIZE	0x1000  // 

typedef struct mempool_s {

	int blocksize;
	int freecount;
	char *free_ptr;
	char *mem;

} mempool_t; 



// 2^n, page_size 4096, block_size: 16, 32, 64, 128 
int memp_create(mempool_t *m, int block_size) {

	if (!m) return -1;

	m->blocksize = block_size;
	m->freecount = MEM_PAGE_SIZE / block_size;

	m->mem = (char *)malloc(MEM_PAGE_SIZE); //
	if (!m->mem) {  //NULL
		return -2;
	}
	memset(m->mem, 0, MEM_PAGE_SIZE); // 

	m->free_ptr = m->mem;

	int i = 0;
	char *ptr = m->mem;
	for (i = 0;i < m->freecount;i ++) {
		*(char **)ptr = ptr + block_size;
		ptr = ptr + block_size;
	} 
	*(char **)ptr = NULL;

	return 0;
}

void memp_destory(mempool_t *m) {

	if (!m) return ;

	free(m->mem);

}


void *memp_alloc(mempool_t *m) {

	if (!m || m->freecount == 0) return NULL;

	void *ptr = m->free_ptr;

	m->free_ptr = *(char **)ptr;
	m->freecount --;
	
	return ptr;
}

void memp_free(mempool_t *m, void *ptr) {

	*(char **)ptr = m->free_ptr;
	m->free_ptr = (char *)ptr;

	m->freecount ++;
}

// memp_strcpy
// memp_memcpy

int main() {

	mempool_t m;

	memp_create(&m, 32);

	void *p1 = memp_alloc(&m);
	printf("memp_alloc : %p\n", p1);

	void *p2 = memp_alloc(&m);
	printf("memp_alloc : %p\n", p2);

	void *p3 = memp_alloc(&m);
	printf("memp_alloc : %p\n", p3);

	memp_free(&m, p2);
	
	

}




专属学习链接:https://xxetb.xetslk.com/s/4cnbDc

;