Table of Contents

内存文件系统使用指南(MemoryFileSystem · memory:

给谁看:要极速吞吐(直址零拷贝、纳秒级元数据)或测试隔离的人。 回答什么:怎么构造、双分配模式怎么选、Dispose 语义、怎么持久化、模拟边界在哪。 四类文件系统的公共契约(IFileSystem/IFileHandle 打开/读写/FileExtra/句柄池)见 io.md ——本篇只讲内存文件系统的差异面。⚠️ 与 memory.md(原生内存与池)是两回事。


0. 一句话定位

内存文件系统 = 生产级极速文件系统——直址零拷贝、纳秒级元数据,引擎端到端 ~0.5 µs/op。 "易失"是机制属性不是概念缺席:持久化 = 运行时导出镜像RootSpaceImage,四类文件系统全部支持, 见 io.md §5.2)。需要极速吞吐、数据生命周期 = 进程生命周期的场景(缓存、计算中间态、 高频写临时区)首选;单元测试/CI 无需本地盘也是它的主场。

1. 构造

using var mem = TierFs.Open("memory:");                  // 私有卷(测试隔离——推荐)
using var mem2 = TierFs.Open("memory:?label=test-a");    // 命名卷
using var fs = TierFs.New("memory:");                    // New = 建空镜像

// 全局共享盘(⚠️ 路径空间跨实例共享——测试隔离一律用私有卷)
using var g = MemoryFileSystem.Default;
  • fs.Dispose = "拔盘":销毁卷(数据内存可能复用,必须失效)——已开句柄抛 ObjectDisposedException(与本地/网络的"离开目录"语义相反,最反直觉的一条)。
  • 测试隔离一律 TierFs.Open("memory:") 私有卷;TC_TEST_FS_SPEC 可零重编译切换介质。

2. 双分配模式(选型)

Sparse Reserved
分配 按页占用(页粒度记账) 创建即占(全量预留)
物化映射 / 页粒度 直址零拷贝(无锁数据面:epoch 读者 + freeze 屏障,读写双高)
per-file RW Gate(读共享写独占)+ 免清零租借(整页覆写零清零税)+ 预分配物理化PreallocateSize = 物理预留纯 memcpy 热道) 锁外读写
映射 物化副本(Flush/Dispose 才写回) 直址实时可见(Memory<byte> 无法只读化——静默写透,已知平权偏差)
适合 通用、需要映射视图 高并发写密集同文件、极速读写

实测(io-performance §10):Reserved 锁外读写 6× 扩展;Sparse 2-8 线程读写并存可用。 高并发写密集同文件选 Reserved。

3. 持久化("Dispose 即丢"?不)

内存文件系统无原地持久化层(介质内没有比进程内存更持久的层)——持久化点 = 运行时导出:

using (var out_ = File.Create("snapshot.tca"))
    RootSpaceImage.Capture(mem, out_);            // 导出存档(静默快照,稀疏/Extra 全保真)
using var disk = TierFs.New("local:///data/x");
RootSpaceImage.Restore(File.OpenRead("snapshot.tca"), disk);   // 还原到任意文件系统

"易失" ≠ "非生产":内存态运行 + 导出成档 = 与"运行 + fsync"同一概念的两个投影 (详见 io.md §5.2——4 源 × 4 目标 16 格全成立)。

4. 模拟边界(诚实表达)

  • 已支持:目录树、文件时间戳(目录时间不追踪,Stat 诚实 MinValue/null)、DIO 行为保真 (512 模拟几何——测试期抓对齐 bug,防切本地文件系统生产爆炸)、范围锁(进程内区间表)、 卷锁(进程内真锁——自旋互斥,行为保真)。
  • 不模拟:跨进程可见性、ACL、符号链接、大小写不敏感(Ordinal 对齐 Linux)。

5. 陷阱

  1. Sparse 映射写时差:视图写 Flush/Dispose 才写回——实时可见用 Reserved 或 Write 路径。
  2. Default 全局共享:路径空间跨实例共享——测试隔离一律私有卷。
  3. 拔盘后操作:已开句柄抛 ObjectDisposedException;槽复用/强制转移后操作抛 FileIOException(NotFound)(代际防护——清晰异常非静默串数据)。
  4. 扇区对齐:DIO 对齐基 = 512 模拟几何(行为保真,非真实设备)。

6. 想深入?指路

想懂什么 去哪
公共契约(打开/读写/FileExtra/句柄池) io.md
性能(双模式/并发扩展) perf/io-performance.md §10
原生内存与池(AlignedMemoryManager/PinnedBufferPool——注意不是本文件系统) memory.md