MVFF manually manages variable-sized, unformatted objects. It uses the first fit allocation policy for blocks allocated via mps_alloc().
Johnstone (1997) found that in his test cases:
No version of best fit had more than 5% actual fragmentation. This is also true for all versions of first fit that used an address-ordered free list, and the two versions of first fit that used a FIFO free list. This strongly suggests that the basic best-fit algorithm and the first-fit algorithm with an address-ordered free list are very robust algorithms.
The MVFF pool class also supports buffered allocation (that is, allocation via allocation points), and in this case, the allocation policy is different: the buffers are filled according to the worst fit policy, and allocation always proceeds upwards from the base.
Buffered and unbuffered allocation can be used at the same time, but the first allocation point must be created before any call to mps_alloc().
It is usually not advisable to use buffered and unbuffered allocation on the same pool, because the worst-fit policy of buffer filling will grab all the large blocks, leading to severe fragmentation. If you need both forms of allocation, use two separate pools.
#include "mpscmvff.h"
Return the pool class for an MVFF (Manual Variable First Fit) pool.
When creating an MVFF pool, mps_pool_create_k() accepts seven optional keyword arguments:
| [1] | (1, 2) Allocation points are not affected by MPS_KEY_MVFF_SLOT_HIGH or MPS_KEY_MVFF_FIRST_FIT. They use a worst-fit policy in order to maximise the number of in-line allocations. |
The defaults yield a a simple first-fit allocator. Specify MPS_KEY_MVFF_ARENA_HIGH and MPS_KEY_MVFF_SLOT_HIGH true, and MPS_KEY_MVFF_FIRST_FIT false to get a first-fit allocator that works from the top of memory downwards. Other combinations may be useful in special circumstances.
For example:
MPS_ARGS_BEGIN(args) {
MPS_ARGS_ADD(args, MPS_KEY_EXTEND_BY, 1024 * 1024);
MPS_ARGS_ADD(args, MPS_KEY_MEAN_SIZE, 32);
MPS_ARGS_ADD(args, MPS_KEY_ALIGN, 8);
MPS_ARGS_ADD(args, MPS_KEY_MVFF_ARENA_HIGH, 1);
MPS_ARGS_ADD(args, MPS_KEY_MVFF_SLOT_HIGH, 1);
MPS_ARGS_ADD(args, MPS_KEY_MVFF_FIRST_FIT, 0);
res = mps_pool_create_k(&pool, arena, mps_class_mvff(), args);
} MPS_ARGS_END(args);
A debugging version of the MVFF pool class.
When creating a debugging MVFF pool, mps_pool_create_k() accepts eight optional keyword arguments: MPS_KEY_EXTEND_BY, MPS_KEY_MEAN_SIZE, MPS_KEY_ALIGN, MPS_KEY_SPARE, MPS_KEY_MVFF_ARENA_HIGH, MPS_KEY_MVFF_SLOT_HIGH, and MPS_KEY_MVFF_FIRST_FIT are as described above, and MPS_KEY_POOL_DEBUG_OPTIONS specifies the debugging options. See mps_pool_debug_option_s.