9. MFS (Manual Fixed Small)¶
MFS is an manually managed pool class for small objects of fixed size.
Unlike other manual pool classes, it is not subject to internal fragmentation: if the population remains bounded, the memory usage remains bounded too. On the other hand, unlike MVT (Manual Variable Temporal) and MVFF (Manual Variable First Fit) it does not return unused memory to the arena for reuse by other pools.
The implementation is very simple: unlike most other pool
classes which store their control structures separately from the
allocated blocks, MFS maintains a stack of free blocks using a pointer
in the free block. mps_alloc()
pops this stack and
mps_free()
pushes it.
9.1. MFS properties¶
Supports allocation via
mps_alloc()
and deallocation viamps_free()
.Does not support allocation via allocation points.
Does not support allocation frames.
Supports segregated allocation caches (but using one would be pointless, since all blocks are the same size).
There are no garbage collections in this pool.
Blocks may not contain references to blocks in automatically managed pools (unless these are registered as roots).
Allocations are fixed in size.
The alignment of blocks is not configurable: it is the natural alignment of the platform (see
MPS_PF_ALIGN
).Blocks do not have dependent objects.
Blocks are not automatically reclaimed.
Blocks are not scanned.
Blocks are not protected by barriers (1).
Blocks do not move.
Blocks may not be registered for finalization.
Blocks must not belong to an object format.
9.2. MFS interface¶
#include "mpscmfs.h"
-
mps_pool_class_t
mps_class_mfs
(void)¶ Return the pool class for an MFS (Manual Fixed Small) pool.
When creating an MFS pool,
mps_pool_create_k()
requires one keyword argument:MPS_KEY_MFS_UNIT_SIZE
(typesize_t
) is the size of blocks that will be allocated from this pool, in bytes (1). It must be at least one word.
In addition,
mps_pool_create_k()
accepts one optional keyword argument:MPS_KEY_EXTEND_BY
(typesize_t
, default 65536) is the size of extent that the pool will request from the arena. For efficiency, this should be much larger thanMPS_KEY_MFS_UNIT_SIZE
, so that many blocks fit into each extent.
For example:
MPS_ARGS_BEGIN(args) { MPS_ARGS_ADD(args, MPS_KEY_MFS_UNIT_SIZE, 1024); MPS_ARGS_ADD(args, MPS_KEY_EXTEND_BY, 1024 * 1024); res = mps_pool_create_k(&pool, arena, mps_class_mfs(), args); } MPS_ARGS_END(args);