文件系统实现

文件的实现

  • 文件 = “虚拟” 磁盘
  • API: read, write, ftruncate, ...

目录的实现

  • 目录 = 文件/目录的集合
  • API: mkdir, rmdir, readdir, link, unlink, ...

思考题:mount 如何实现?

  • 最好由操作系统统一管理 (而不是由具体的文件系统实现)

如果是《数据结构》课?

我们可以借助 RAM (Random Access Memory) 自由布局目录和文件

  • FileSystem 就是一个 Abstract DataType (ADT)
  • Memory Hierarchy 在苦苦支撑 “random access” 的假象
class FSObject {
};

class File: FSObject {
  std::vector<char> content;
};

class Directory: FSObject {
  std::map<std::string,FSObject*> children;
};
  • 实现上面的 API 完全就是个课后习题

回到《操作系统》课

我们没有 Random Access Memory

  • 我们只有 block device
  • 两个 API
    • bread(int bid, struct block *b);
    • bwrite(int bid, struct block *b);

实现:

  • read, write, ftruncate, ...
  • mkdir, rmdir, readdir, link, unlink, ...
    • 如果用 block device 模拟 RAM,就会出现严重的读/写放大
    • 我们需要更适合磁盘的数据结构

我们的敌人和朋友

敌人:读/写放大

  • 被迫读写连续的一块数据

朋友:局部性 + 缓存

  • 适当地排布数据,使得临近的数据有 “一同访问” 的倾向
  • 数据暂时停留在内存,延迟写回