信息技术大学
文件系统与 IO
计算机基础面试八股 · 第 2 章 操作系统
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
信息技术大学
文件系统与 IO
计算机基础面试八股 · 第 2 章 操作系统
inode 与软硬链接
文件在磁盘上的身份证是 inode:名字只是目录表里的一个指向。
inode
存元数据与数据块指针,文件名不在其中
硬链接
多个名字指同一 inode,删一个不减数据
软链接
独立 inode 存路径,原文件删除即悬空
计数释放
硬链接计数归零才真正回收数据块
删除即释放?
点击作答
执行 rm 删除文件后,磁盘空间会立刻释放吗?
文件描述符与上限
一切皆文件的把手是 fd:0/1/2 是标准输入输出,每个连接都占一个。
fd 是什么
进程打开文件的整数句柄,0/1/2 系统预留
上限
ulimit -n 限制进程 fd 数,高并发必须调大
泄漏
打开不关,fd 耗尽后 accept 直接报错
缓冲 IO 与直接 IO
缓冲换来合并与复用,直接 IO 牺牲缓存换确定性——数据库偏爱后者。
页缓存
内核按页缓存,读命中免磁盘,写合并落盘
缓冲 IO
走页缓存,通用场景吞吐更优
直接 IO
绕过页缓存直写磁盘,自管缓存者专用
fsync
强制刷盘开关,事务日志的保命符
零拷贝(mmap/sendfile)
传统「读文件发网络」要多次拷贝与切换:零拷贝让数据不过应用之手。
传统路径
磁盘→页缓存→用户区→socket 缓冲→网卡
sendfile
数据全程内核态流转,砍掉用户态拷贝
mmap
文件映射进地址空间,少一次显式拷贝
收益
Kafka、Nginx 高吞吐的标配武器
本节要点
- ✓inode 是文件本体,名字只是链接
- ✓fd 上限要调优,泄漏拖垮服务
- ✓数据库绕页缓存,日志必 fsync
- ✓sendfile/mmap 省拷贝,高吞吐标配
延伸主题:stat 看一次 inode对比 cat 与 sendfile 路径
课后思考
先自己回答,再展开参考答案——能讲出来才算真懂。
1日志文件删掉了,df 看空间却没变,为什么?
参考答案还有进程(往往是日志写入方)持有该文件的 fd,inode 链接计数不为零,数据块不回收。正确做法是清空或轮转日志,而不是先删文件再改配置。
2为什么数据库不用页缓存,偏爱直接 IO?
参考答案数据库有自己的缓冲池和淘汰算法,比内核页缓存更懂数据访问模式;双重缓存浪费内存还可能互拖后腿,直接 IO 把缓存控制权收回自己手里。
3零拷贝为什么能显著提升 Kafka 的吞吐?
参考答案消费路径正是「读文件发网卡」,sendfile 让数据全程留在内核态,免去用户态往返拷贝与上下文切换;CPU 被解放,同样的机器能扛更大流量。