Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Memory pools implementation in C

I am looking for a good memory pool implementation in C.

it should include the following:

  1. Anti fragmentation.
  2. Be super fast :)
  3. Ability to "bundle" several allocations from different sizes under some identifier and delete all the allocations with the given identifier.
  4. Thread safe
like image 572
Avi Zrachya Avatar asked Aug 15 '11 00:08

Avi Zrachya


People also ask

What is memory pool in C?

A memory pool is a logical division of main memory or storage that is reserved for processing a job or group of jobs. On your system, all main storage can be divided into logical allocations called memory pools. By default, the system manages the transfer of data and programs into memory pools.

Does C have memory management?

The C programming language provides several functions for memory allocation and management. These functions can be found in the <stdlib. h> header file.

What is Mempool C?

A memory pool (mempool) is a method for tracking memory consumption. Memory pools represent the memory consumption of C++ classes and containers, and they are used to assess memory leaks and other insights around memory usage with low overhead. Each memory pool tracks the number of bytes and items it contains.

How does C memory management work?

In C, the library function malloc is used to allocate a block of memory on the heap. The program accesses this block of memory via a pointer that malloc returns. When the memory is no longer needed, the pointer is passed to free which deallocates the memory so that it can be used for other purposes.


2 Answers

Have you looked into

  • nedmalloc http://www.nedprod.com/programs/portable/nedmalloc/
  • ptmalloc http://www.malloc.de/en/

Both leverage a memory pool but keep it mostly transparent to the user.

In general, you will find best performance in your own custom memory pool (you can optimize for your pattern). I ended up writing a few for different access patterns.

like image 36
Foo Bah Avatar answered Nov 15 '22 21:11

Foo Bah


I think the excellent talloc, developed as part of samba might be what you're looking for. The part I find most interesting is that any pointer returned from talloc is a valid memory context. Their example is:

struct foo *X = talloc(mem_ctx, struct foo);
X->name = talloc_strdup(X, "foo");
// ...
talloc_free(X); // frees memory for both X and X->name

In response to your particular points:

(1) Not sure what anti-fragmentation is in this case. In C you're not going to get compacting garbage collection anyway, so I think your choices are somewhat limited.

(2) It advertises being only 4% slower than plain malloc(3), which is quite fast.

(3) See example above.

(4) It is thread safe as long as different threads use different contexts & the underlying malloc is thread safe.

like image 144
Bobby Powers Avatar answered Nov 15 '22 19:11

Bobby Powers