Skip to content

meta(head)区与 data 区各自独立 shm 文件映射 + 分区独立动态扩容 #2

Description

@miaobyte

背景(现状事实)

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 两块独立 malloctutorial/05_multiprocess.c:19-22 两块独立 mmap

因此"拆分"在数据结构层已经成立。真正缺失的是两件事

  1. 库本身不做任何 shm 生命周期——全仓无 shm_open/ftruncate/mremap;tutorial 用的是 MAP_ANONYMOUS,不是命名 shm 文件。把 meta 区与 data 区各自落到独立命名 shm 文件的映射/命名/attach/校验层不存在。
  2. 无动态扩容data_size 在 init 时固定且必须为 8 × 64^ksbo_init:466-469 校验 2 的幂 + 64 的幂);head 区 per_slot_meta 一次算定(:479);底层 blockmalloc 池满即返回 -1(blockmalloc.h:308-315),无 grow/remap。

目标

  1. 各自独立 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 格式。
  2. 各区独立动态扩容(grow/remap)
    • data 区满(sbo_alloc 返回 -1)→ 扩 data shm(ftruncate + mremap)。
    • meta 区满(blockmalloc 池满)→ 扩 head shm。
    • 扩容后更新 sbo_meta_t 内的 head_size/data_size,保证偏移语义不依赖绝对基址(现已满足:block-id + offset)。

影响面

关联

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions