背景(现状事实)
slotsboxmalloc 当前已在 API 层把 meta(head)区与 data 区解耦为两块独立缓冲,偏移互不换算:
sbo_init(void *metaptr, size_t head_size, size_t data_size)(include/slotsboxmalloc/slotsboxobj.h:461)只初始化 meta 区,从不映射或写入 data 区。
sbo_alloc(metaptr, size) 只返回 data 区内的字节偏移(:523);数据落地必须由调用者持有独立的 data_base,经 sbo_data_ptr(meta, data_base, off) = data_base + off(:579)换算。
- meta/树节点寻址(
sbo_pool_mem/sbo_child 等)全部相对 metaptr;data 偏移相对 data 区起点。二者没有"head 在前 data 在后"的单块布局,也没有跨区偏移换算。
- 零绝对指针、全 block-id + offset,fork/mmap 安全(arch 图与 header 注释一致)。
- tutorial 已示范分离:
tutorial/01_basic.c:12-13 两块独立 malloc;tutorial/05_multiprocess.c:19-22 两块独立 mmap。
因此"拆分"在数据结构层已经成立。真正缺失的是两件事:
- 库本身不做任何 shm 生命周期——全仓无
shm_open/ftruncate/mremap;tutorial 用的是 MAP_ANONYMOUS,不是命名 shm 文件。把 meta 区与 data 区各自落到独立命名 shm 文件的映射/命名/attach/校验层不存在。
- 无动态扩容:
data_size 在 init 时固定且必须为 8 × 64^k(sbo_init:466-469 校验 2 的幂 + 64 的幂);head 区 per_slot_meta 一次算定(:479);底层 blockmalloc 池满即返回 -1(blockmalloc.h:308-315),无 grow/remap。
目标
- 各自独立 shm 文件映射:为 meta(head)区与 data 区提供各自映射到独立命名 shm 文件的封装/约定——命名规则、attach/detach、格式与尺寸校验。
- head shm 大小由
sbo_meta_size(data_size, per_slot_pool)(:582)决定;data shm 大小须满足 8 × 64^k。
sbo_meta_t 内已冗余保存 head_size/data_size(:135-136),可作 attach 时的尺寸校验源;magic(:33)校验 head shm 格式。
- 各区独立动态扩容(grow/remap):
- data 区满(
sbo_alloc 返回 -1)→ 扩 data shm(ftruncate + mremap)。
- meta 区满(blockmalloc 池满)→ 扩 head shm。
- 扩容后更新
sbo_meta_t 内的 head_size/data_size,保证偏移语义不依赖绝对基址(现已满足:block-id + offset)。
影响面
关联
背景(现状事实)
slotsboxmalloc 当前已在 API 层把 meta(head)区与 data 区解耦为两块独立缓冲,偏移互不换算:
sbo_init(void *metaptr, size_t head_size, size_t data_size)(include/slotsboxmalloc/slotsboxobj.h:461)只初始化 meta 区,从不映射或写入 data 区。sbo_alloc(metaptr, size)只返回 data 区内的字节偏移(:523);数据落地必须由调用者持有独立的data_base,经sbo_data_ptr(meta, data_base, off) = data_base + off(:579)换算。sbo_pool_mem/sbo_child等)全部相对metaptr;data 偏移相对 data 区起点。二者没有"head 在前 data 在后"的单块布局,也没有跨区偏移换算。tutorial/01_basic.c:12-13两块独立malloc;tutorial/05_multiprocess.c:19-22两块独立mmap。因此"拆分"在数据结构层已经成立。真正缺失的是两件事:
shm_open/ftruncate/mremap;tutorial 用的是MAP_ANONYMOUS,不是命名 shm 文件。把 meta 区与 data 区各自落到独立命名 shm 文件的映射/命名/attach/校验层不存在。data_size在 init 时固定且必须为8 × 64^k(sbo_init:466-469校验 2 的幂 + 64 的幂);head 区per_slot_meta一次算定(:479);底层 blockmalloc 池满即返回 -1(blockmalloc.h:308-315),无 grow/remap。目标
sbo_meta_size(data_size, per_slot_pool)(:582)决定;data shm 大小须满足8 × 64^k。sbo_meta_t内已冗余保存head_size/data_size(:135-136),可作 attach 时的尺寸校验源;magic(:33)校验 head shm 格式。sbo_alloc返回 -1)→ 扩 data shm(ftruncate+mremap)。sbo_meta_t内的head_size/data_size,保证偏移语义不依赖绝对基址(现已满足:block-id + offset)。影响面
sbo_alloc:523、sbo_data_ptr:579、sbo_pool_mem/sbo_child/sbo_find_obj_node各自相对独立基址,天然支持两文件。per_slot_meta/data_size)。sbo_alloc在blocks_alloc死循环)一并考虑,避免 reopen/grow 后 pool meta 状态不一致再次触发自旋。关联