内存文件系统使用指南(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. 陷阱
- Sparse 映射写时差:视图写 Flush/Dispose 才写回——实时可见用 Reserved 或 Write 路径。
Default全局共享:路径空间跨实例共享——测试隔离一律私有卷。- 拔盘后操作:已开句柄抛
ObjectDisposedException;槽复用/强制转移后操作抛FileIOException(NotFound)(代际防护——清晰异常非静默串数据)。 - 扇区对齐:DIO 对齐基 = 512 模拟几何(行为保真,非真实设备)。
6. 想深入?指路
| 想懂什么 | 去哪 |
|---|---|
| 公共契约(打开/读写/FileExtra/句柄池) | io.md |
| 性能(双模式/并发扩展) | perf/io-performance.md §10 |
原生内存与池(AlignedMemoryManager/PinnedBufferPool——注意不是本文件系统) |
memory.md |