首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试:IO读写你只会背流程?乔哈里视窗模型帮你理清思路,从青铜变王者

面试:IO读写你只会背流程?乔哈里视窗模型帮你理清思路,从青铜变王者

作者头像
早起的鸟儿有虫吃
发布2025-10-10 13:10:14
发布2025-10-10 13:10:14
6800
代码可运行
举报
运行总次数:0
代码可运行

🚀 面试:IO读写你只会背流程?乔哈里视窗模型帮你理清思路,从青铜变王者

乔哈里视窗(Johari Window)模型
乔哈里视窗(Johari Window)模型

乔哈里视窗(Johari Window)模型

📋 本文核心价值

认知升级:从"背流程"到"懂原理"

面试突破:用乔哈里视窗模型理清思路

技术深度:Linux IO栈的底层机制

实用工具:认知模型在技术学习中的应用


🎯 第一部分:开放区(你知道,别人也知道)

💬 面试现场对话

面试官:

我看到你简历上写着 对 Linux 操作系统 有一定了解。

那你能不能谈一谈: 本地文件的 write 过程

你是怎么理解的?

小青的回答:

如下图,IO栈的基本流程是:

代码语言:javascript
代码运行次数:0
运行
复制
        应用程序
            │
            ▼
  系统调用 (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。 看完之后,和没看差不多, 根本看不到细节就 具体函数用法,有什么功能,特性。 为这么这么做

所以问题来了——

最重要的一点:如何保证数据的一致性

🤔 问题来了

所以问题来了——最重要的一点:如何保证数据的一致性?


🔍 第二部分:盲区(你不知道,别人知道)

📚 最少知识准备

1️⃣ 硬件层(磁盘扇区)

最小物理写入单位:磁盘扇区(Sector),传统为512B,现代设备常见4KB

原子性保证:磁盘保证单个扇区写入是原子的,要么完全写入,要么失败

2️⃣ 文件系统块层(Block)

ext4默认块大小:通常4KB(可选1K/2K/4K/8K等)

块是文件系统管理的最小分配单位

块对齐:文件系统会把数据按块对齐,确保写入时对应底层扇区边界,从而利用扇区原子性

3️⃣ I/O层(页缓存/libaio/direct I/O)

页大小:Linux内核页面通常4KB

AIO/libaio提交I/O时,通常以页为单位提交给块设备

Direct I/O:跳过页缓存,直接按块或扇区提交,必须满足块/扇区对齐(alignment)

对齐要求

起始地址和长度通常需要是块大小或扇区大小的整数倍

libaio提交时,如果不对齐,会返回EINVAL错误

🎯 一致性如何保证

核心问题:

1

文件系统有多少个模块,它们功能是什么?

也就是它的基本数据结构,比如inode、dentry

2

写大文件时突然断电怎么办?

分布式集群里,节点下线是常态,系统怎么保证恢复?

数据会丢吗?

3

一个文件写入失败,到底哪些写入成功,哪些写入失败?

最小写入单元是什么?

要么完全失败,要么完全成功,会不会出现中间状态?

解决方案对比:
多节点多副本
多节点多副本

多节点多副本

Raft一致性协议

Raft是一种一致性协议,能提供强一致的数据复制保证

TiDB最底层用Raft来同步数据

每次写入都要写入多数副本,才能对外返回成功

这个多副本,不关心具体IO过程,顶多flush一下

单节点多副本
单节点多副本

单节点多副本

事务回滚机制

事务
事务

事务

事务来保证一致性,失败就回滚

原子写入
原子写入

原子写入

🔍 为什么磁盘没有回滚机制?

1. 硬件设计限制

磁盘是物理设备,其操作由硬件控制。一旦数据被写入磁盘,硬件并不具备识别和撤销特定写入操作的能力

这与数据库系统中的事务回滚机制不同,后者是由软件控制的

2. 性能考虑

引入回滚机制需要额外的硬件支持和复杂的控制逻辑

这可能会影响磁盘的性能。为了保持高效的读写速度,磁盘通常不具备回滚功能

3. 防止中断

在D状态下,进程不会响应信号,直到I/O操作完成

这是为了防止在关键的磁盘写入操作期间被中断,从而保证数据的完整性

🔍 为什么Redis不支持传统回滚?

Redis的事务和传统数据库不一样

最大区别是,Redis不支持回滚(rollback)

在Redis里,事务靠MULTIEXECDISCARD管理

这些命令没有传统回滚功能

有个特点:队列阶段出错会丢弃事务,但执行阶段出错,已执行的命令不会回滚

Redis设计者为什么不加回滚?

性能原因:回滚需要额外资源和复杂逻辑,会拖慢Redis

错误预防:Redis里的错误大多是程序逻辑问题。回滚也解决不了数据逻辑错误

代码语言:javascript
代码运行次数:0
运行
复制
MULTI
SET key1 value1
SETTY key2 value2 // 这是一个错误命令,Redis会返回错误
SET key3 value3
EXEC // 执行后,Redis会返回错误

// key1, key2, key3都不会被设置

🆕 Linux 6.13新特性:ext4原子写入

ext4自Linux 6.13版本起,支持文件系统块级别的原子写入

历史发展

早在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内核设计与实现》

《深入理解计算机系统》

《操作系统概念》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端开发成长指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀 面试:IO读写你只会背流程?乔哈里视窗模型帮你理清思路,从青铜变王者
    • 📋 本文核心价值
    • 🎯 第一部分:开放区(你知道,别人也知道)
      • 💬 面试现场对话
      • 😤 面试官的真实想法
      • 🤔 问题来了
    • 🔍 第二部分:盲区(你不知道,别人知道)
      • 📚 最少知识准备
      • 🎯 一致性如何保证
      • 🔍 为什么磁盘没有回滚机制?
      • 🔍 为什么Redis不支持传统回滚?
      • 🆕 Linux 6.13新特性:ext4原子写入
    • 🚫 第三部分:放弃区(我不知道,别人也不知道)
      • 💭 认知陷阱
    • 📊 乔哈里视窗模型总结
    • 🎯 核心要点总结
      • 💡 数据一致性保障方式
      • 🚀 面试突破要点
    • 📚 参考资源
      • 参考文章
      • 参考书籍
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档