磁盘上的数据结构

磁盘上的数据结构

2024 南京大学《操作系统:设计与实现》
磁盘上的数据结构

文件系统实现

文件的实现

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

目录的实现

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

mount 的实现

  • 最好由操作系统统一管理 (而不是由具体的文件系统实现)
2024 南京大学《操作系统:设计与实现》
磁盘上的数据结构

如果是《数据结构》课?

借助 RAM 自由布局目录和文件

  • 文件系统就是一个 Abstract DataType (ADT)
class FSObject {
};

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

class Directory: FSObject {
  std::map<std::string,FSObject*> children;
};
2024 南京大学《操作系统:设计与实现》
磁盘上的数据结构

回到《操作系统》课

对不起,没有 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, ...
    • 用 bread/bwrite 模拟 RAM → 严重的读/写放大
    • 我们需要更适合磁盘的数据结构
2024 南京大学《操作系统:设计与实现》
磁盘上的数据结构

我们的敌人和朋友

敌人:读/写放大

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

朋友:局部性 + 缓存

  • 适当地排布数据,使得临近的数据有 “一同访问” 的倾向
  • 数据暂时停留在内存,延迟写回
2024 南京大学《操作系统:设计与实现》