乔哈里视窗(Johari Window)模型
•
认知升级:从"背流程"到"懂原理"
•
面试突破:用乔哈里视窗模型理清思路
•
技术深度:Linux IO栈的底层机制
•
实用工具:认知模型在技术学习中的应用
面试官:
我看到你简历上写着 对 Linux 操作系统 有一定了解。
那你能不能谈一谈: 本地文件的 write 过程,
你是怎么理解的?
小青的回答:
如下图,IO栈的基本流程是:
应用程序
│
▼
系统调用 (read/write)
│
▼
虚拟文件系统 (VFS)
│
▼
文件系统层 (ext4)
│
▼
通用块层 (Block Layer)
│
▼
物理设备驱动层 (SATA/NVMe驱动)
│
▼
硬件 (HDD/SSD)
小青继续解释:
•
应用程序发起read/write
•
经过系统调用上下文切换到内核
•
VFS给出统一接口,屏蔽不同文件系统差异
•
文件系统层(ext4)**负责元数据、块映射和分配
•
通用块层做I/O调度、合并请求,封装成bio
•
物理驱动把bio
翻译成硬件指令(SATA/NVMe)
•
最后到**硬件(HDD/SSD)**完成读写
(轻咳一声)……嗯,行了,到你这里,我直接说我的看法。
你刚才提到的那些 OS 知识,听起来就像是刚接触、刚知道个大概。 这种回答,在面试里是万万不能的。
想一想: 十年前,你是这样想的。 十年后,你还是这样想。 说实话,我真的没看到什么“进步”。
你自己心里也清楚, 学习主要靠记忆,靠翻文档。 而你也明白, 这种方法,在我这里,绝对过不了关。
是不是常常这样: 看源码,看技术文章, 讲函数 A 调用 B,再到函数 C。 看完之后,和没看差不多, 根本看不到细节就 具体函数用法,有什么功能,特性。 为这么这么做
所以问题来了——
最重要的一点:如何保证数据的一致性
所以问题来了——最重要的一点:如何保证数据的一致性?
•
最小物理写入单位:磁盘扇区(Sector),传统为512B,现代设备常见4KB
•
原子性保证:磁盘保证单个扇区写入是原子的,要么完全写入,要么失败
•
ext4默认块大小:通常4KB(可选1K/2K/4K/8K等)
•
块是文件系统管理的最小分配单位
•
块对齐:文件系统会把数据按块对齐,确保写入时对应底层扇区边界,从而利用扇区原子性
•
页大小:Linux内核页面通常4KB
•
AIO/libaio提交I/O时,通常以页为单位提交给块设备
•
Direct I/O:跳过页缓存,直接按块或扇区提交,必须满足块/扇区对齐(alignment)
•
对齐要求:
•
起始地址和长度通常需要是块大小或扇区大小的整数倍
•
libaio提交时,如果不对齐,会返回EINVAL错误
1
文件系统有多少个模块,它们功能是什么?
•
也就是它的基本数据结构,比如inode、dentry
2
写大文件时突然断电怎么办?
•
分布式集群里,节点下线是常态,系统怎么保证恢复?
•
数据会丢吗?
3
一个文件写入失败,到底哪些写入成功,哪些写入失败?
•
最小写入单元是什么?
•
要么完全失败,要么完全成功,会不会出现中间状态?
多节点多副本
Raft一致性协议:
•
Raft是一种一致性协议,能提供强一致的数据复制保证
•
TiDB最底层用Raft来同步数据
•
每次写入都要写入多数副本,才能对外返回成功
•
这个多副本,不关心具体IO过程,顶多flush一下
单节点多副本
事务回滚机制:
事务
•
事务来保证一致性,失败就回滚
原子写入
•
磁盘是物理设备,其操作由硬件控制。一旦数据被写入磁盘,硬件并不具备识别和撤销特定写入操作的能力
•
这与数据库系统中的事务回滚机制不同,后者是由软件控制的
•
引入回滚机制需要额外的硬件支持和复杂的控制逻辑
•
这可能会影响磁盘的性能。为了保持高效的读写速度,磁盘通常不具备回滚功能
•
在D状态下,进程不会响应信号,直到I/O操作完成
•
这是为了防止在关键的磁盘写入操作期间被中断,从而保证数据的完整性
•
Redis的事务和传统数据库不一样
•
最大区别是,Redis不支持回滚(rollback)
•
在Redis里,事务靠MULTI
、EXEC
和DISCARD
管理
•
这些命令没有传统回滚功能
•
有个特点:队列阶段出错会丢弃事务,但执行阶段出错,已执行的命令不会回滚
Redis设计者为什么不加回滚?
•
性能原因:回滚需要额外资源和复杂逻辑,会拖慢Redis
•
错误预防:Redis里的错误大多是程序逻辑问题。回滚也解决不了数据逻辑错误
MULTI
SET key1 value1
SETTY key2 value2 // 这是一个错误命令,Redis会返回错误
SET key3 value3
EXEC // 执行后,Redis会返回错误
// key1, key2, key3都不会被设置
历史发展:
•
早在Linux 6.11中,启用了NVMe和SCSI支持的块设备就支持原子写入
•
在Linux 6.13中,原子写入支持正在扩展到文件系统,EXT4和XFS最初受益
支持条件:
•
硬件支持:首先,底层存储设备必须支持原子写入操作
•
文件系统要求:ext4文件系统需要启用扩展(extents)特性,并且支持直接I/O(Direct I/O)
•
自己不明白,不要和别人沟通交流,别人根本不愿意听
•
直接放弃最高效沟通方式
认知象限 | 自己知道 | 自己不知道 |
---|---|---|
别人知道 | 开放区 (Open Area)• I/O栈基本流程(应用→系统调用→VFS→文件系统→块层→驱动→硬件)• 常见一致性方案(多副本、事务回滚) | 盲区 (Blind Spot)• 磁盘扇区写入的原子性• 对齐要求的重要性• Linux 6.13新特性 |
别人不知道 | 隐藏区 (Hidden Area)• 无 | 未知区 (Unknown Area)• Linux内核源码实现细节• 未来技术发展趋势 |
银行、电商、底层系统——谁都怕数据乱!
常见的保障方式:
•
✅ 多副本:一个坏了还有备份
•
🔄 回滚:出错了就退回上一步
但文件系统遇到难题:回滚太麻烦!
数据已经写入磁盘,擦除成本太高,索性——拒绝回滚!
🔄 改用原子更新:
•
操作要么完全成功
•
要么像从未发生
⚠️ 为保证绝对写入,服务可能陷入阻塞状态
•
写入完成前,其他操作需等待
•
确保数据落盘,避免并发冲突
🔍 最小原子单位是:磁盘扇区(512B/4KB)
•
写扇区:绝不会"只写一半"
•
基于这个最小单元,搭建整个一致性系统
1
不要只背流程:要理解每个层次的作用和原理
2
关注一致性:这是面试官最关心的问题
3
了解新技术:Linux 6.13的原子写入特性
4
理解权衡:为什么有些系统选择不回滚
5
掌握细节:对齐要求、扇区大小、原子性保证
•
Are disk sector writes atomic?
•
What is RAID 10?
•
/ext4/atomic_writes.htm
•
Linux 6.13 To Expand Atomic Write Support To EXT4 & XFS
•
《Linux内核设计与实现》
•
《深入理解计算机系统》
•
《操作系统概念》