CS130 操作系统I Project 4 File Systems | 文件系统
恭喜你来到了 Pintos 整个项目的最后一关!在 Project 2 和 3 中,我们一直在“白嫖”现有的文件系统,而这一次,我们要亲手重写它。Project 4 是整个 Pintos 项目代码量最大的部分。
Project 4 File Systems 的核心目标是将那个“简陋”的文件系统(只能创建固定大小文件、没有子目录、磁盘访问极慢)改造成一个类 Unix 的现代文件系统。
根据官方建议,可以基于 Project 2 的代码开始,但是如果你对自己的 Project 3 较为自信,也可以基于 Proj 3,但调试难度较大。(笔者的队友是基于笔者写的 Project 3 开始的,似乎也没有发生什么问题)
先下载设计文档模板。
文件介绍
filesys 目录下的重要文件
inode.c/inode.h- 管理文件在磁盘上的布局。你需要将原来的“连续分配”改为“索引分配”(类似 Linux 的 Ext2)。
directory.c/directory.h- 将文件名映射到 Inode。你需要将其改为支持层级结构(子目录)。
filesys.c/filesys.h- 文件系统的顶层接口。
cache.c/cache.h(需新建)- 块缓存 (Buffer Cache):为了减少磁盘 I/O,你需要实现一个 64 扇区限制的内存缓存。
free-map.c/free-map.h- 管理磁盘空闲块(位图)。
任务要求
1. Buffer Cache (块缓存)
目前的 Pintos 每次读写文件都直接操作磁盘,效率极低。
- 64 扇区限制:你最多只能在内存里缓存 64 个扇区的代码。
- 置换算法:实现类似 Clock 或 LRU 的算法。
- Write-behind:修改数据先写到缓存,稍后再异步写回磁盘(或是进程结束时写回)。
- Read-ahead:预读下一个块。
2. Indexed and Extensible Files (索引与可扩展文件)
原来的文件系统是“连续存储”的,容易产生碎片,且文件大小在创建时就固定了。
- Inode 改造:实现直接块、一级间接块和二级间接块,支持最大 8MB 的文件。
- 动态增长:文件最初大小为 0,随着
write自动增长。 - 空洞文件 (Sparse Files):支持
seek到文件末尾之后再写入。
3. Subdirectories (多级子目录)
现在所有文件都挤在根目录下,这显然不行。
- 路径解析:支持
/a/b/c这种绝对路径和../../d这种相对路径。 - CWD (当前工作目录):每个进程需要记录自己当前在哪。
- 特殊目录:支持
.(当前) 和..(父目录)。 - 新系统调用:
chdir,mkdir,readdir,isdir,inumber。
4. Fine-grained Synchronization (细粒度同步)
原来的文件系统是用一个大锁一把抓的。
- 并发访问:要求支持多个进程同时读取同一个文件。
- 独立操作:对不同文件的操作不应该互相阻塞。
执行建议
由于 Project 4 的测试极其依赖 tar 工具的稳定性,建议按照以下顺序:
- Buffer Cache:首先实现它并集成。完成后,Project 2 的测试应该依然全部 Pass。
- Inode 索引化:修改
inode.c以支持不连续存储和文件增长。这是最硬的骨头。 - 子目录基础:修改
directory.c,让目录项可以指向另一个目录。 - 路径解析与 Syscalls:在
syscall.c中实现chdir,mkdir等。 - 同步与持久性优化:处理并发 Bug,确保
pintos poweroff后数据能正确写入磁盘。
代码量参考值
这是官方参考实现的 diffstat。由于需要实现缓存和复杂的索引结构,代码量再次刷新记录(约 2700 行):
1 | filesys/cache.c | 473 +++++++++++++++++++++++++ |
到这里,恭喜你完成了整个 Pintos 系列 Project!你对操作系统的理解已经进入了一个新的等级了!
- 标题: CS130 操作系统I Project 4 File Systems | 文件系统
- 作者: aaaaa
- 创建于 : 2026-07-04 23:00:00
- 更新于 : 2026-07-04 21:11:46
- 链接: https://redefine.ohevan.com/2026/07/04/零基础速通系列/CS130 操作系统I/零基础速通:CS130 操作系统I_Proj_4/
- 版权声明: 版权所有 © aaaaa,禁止转载。