文件系统与 IO

官官方信息技术老师·8 页·深入(追求细节与边界)·0 次浏览·33 天前
信息技术大学

文件系统与 IO

计算机基础面试八股 · 第 2 章 操作系统

按 空格/→ 演示下一步

问一句
1 / 8 页

全部页面点击任意一页,跳回舞台从这页播放

信息技术大学

文件系统与 IO

计算机基础面试八股 · 第 2 章 操作系统

1第 1 页 · 文件系统与 IO

inode 与软硬链接

文件在磁盘上的身份证是 inode:名字只是目录表里的一个指向。

inode
存元数据与数据块指针,文件名不在其中
硬链接
多个名字指同一 inode,删一个不减数据
软链接
独立 inode 存路径,原文件删除即悬空
计数释放
硬链接计数归零才真正回收数据块
2第 2 页 · inode 与软硬链接

删除即释放?

点击作答

执行 rm 删除文件后,磁盘空间会立刻释放吗?

3第 3 页 · 删除即释放?

文件描述符与上限

一切皆文件的把手是 fd:0/1/2 是标准输入输出,每个连接都占一个。

fd 是什么
进程打开文件的整数句柄,0/1/2 系统预留
上限
ulimit -n 限制进程 fd 数,高并发必须调大
泄漏
打开不关,fd 耗尽后 accept 直接报错
4第 4 页 · 文件描述符与上限

缓冲 IO 与直接 IO

缓冲换来合并与复用,直接 IO 牺牲缓存换确定性——数据库偏爱后者。

页缓存
内核按页缓存,读命中免磁盘,写合并落盘
缓冲 IO
走页缓存,通用场景吞吐更优
直接 IO
绕过页缓存直写磁盘,自管缓存者专用
fsync
强制刷盘开关,事务日志的保命符
5第 5 页 · 缓冲 IO 与直接 IO

零拷贝(mmap/sendfile)

传统「读文件发网络」要多次拷贝与切换:零拷贝让数据不过应用之手。

传统路径
磁盘→页缓存→用户区→socket 缓冲→网卡
sendfile
数据全程内核态流转,砍掉用户态拷贝
mmap
文件映射进地址空间,少一次显式拷贝
收益
Kafka、Nginx 高吞吐的标配武器
6第 6 页 · 零拷贝(mmap/sendfile)

本节要点

  • ✓inode 是文件本体,名字只是链接
  • ✓fd 上限要调优,泄漏拖垮服务
  • ✓数据库绕页缓存,日志必 fsync
  • ✓sendfile/mmap 省拷贝,高吞吐标配
延伸主题:stat 看一次 inode对比 cat 与 sendfile 路径
7第 7 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

1日志文件删掉了,df 看空间却没变,为什么?

参考答案还有进程(往往是日志写入方)持有该文件的 fd,inode 链接计数不为零,数据块不回收。正确做法是清空或轮转日志,而不是先删文件再改配置。

2为什么数据库不用页缓存,偏爱直接 IO?

参考答案数据库有自己的缓冲池和淘汰算法,比内核页缓存更懂数据访问模式;双重缓存浪费内存还可能互拖后腿,直接 IO 把缓存控制权收回自己手里。

3零拷贝为什么能显著提升 Kafka 的吞吐?

参考答案消费路径正是「读文件发网卡」,sendfile 让数据全程留在内核态,免去用户态往返拷贝与上下文切换;CPU 被解放,同样的机器能扛更大流量。

8第 8 页 · 课后思考