Skip to content

Latest commit

 

History

History
199 lines (118 loc) · 12.4 KB

File metadata and controls

199 lines (118 loc) · 12.4 KB

操作系统专题优化建议

评审范围:docs/cs-basics/operating-system/ 目录下的 8 篇文章 评审视角:技术正确性、内容一致性、读者体验、可维护性、SEO 与无障碍

本文先给出一个整体判断,再按"全局问题"和"逐篇问题"两条线展开,最后给一份可以直接照着做的改进清单。所有问题都尽量标到具体文件和行号,方便直接定位。


一、整体判断

这个专题目前可以分成两档:

第一档(高质量,几乎可以当范本)

  • virtual-memory.md(虚拟内存详解)
  • io-multiplexing.md(I/O 多路复用详解)
  • zero-copy.md(零拷贝详解)

这三篇是明显经过重写的,特点是:痛点开场、循循善诱、技术细节扎实(五级页表与 LA57、Belady 异常的栈性质、epoll 红黑树/就绪链表、SG-DMA、splice 两次系统调用等),而且大量主动纠正了网上流传的错误说法(比如"epoll 靠 mmap 共享内存省拷贝"是错的)。这一档的"信噪比"很高。

第二档(偏传统罗列式,存在时效性与体验问题)

  • operating-system-basic-questions-01.md(面试题上)
  • operating-system-basic-questions-02.md(面试题下,已部分改写)
  • linux-intro.md(Linux 基础)
  • shell-intro.md(Shell 基础)

核心矛盾就在这里:第一档和第二档之间存在明显的"风格代差"和"质量落差",读者从专题文章跳回基础文章时,体验是割裂的。


二、全局问题(跨文章)

1. 第一人称称谓不统一(建议优先修)

写作风格要求行文自称 "Guide",但实际文中出现了三种叫法:

  • virtual-memory.md 第 41 行、第 236 行附近自称 "小 G"
  • zero-copy.md 第 19 行自称 "小 G"
  • 其余文章基本是无人称的客观叙述。

建议:统一为 "Guide"(或统一去掉第一人称代称),避免同一专题里人设漂移。

2. 头尾 include 片段不统一

  • 面试题上篇(-01.md)开头是 <!-- markdownlint-disable MD033 -->没有 @include: @article-header.snippet.md
  • 面试题下篇(-02.md)开头用了 @include: @article-header.snippet.md
  • 三篇专题(虚拟内存、I/O、零拷贝)和两篇基础(Linux、Shell)都没有 header/footer include。
  • -01.md-02.mdlinux-intro.mdREADME.md 又都有 @article-footer.snippet.md

建议:明确一个规范——所有正式文章统一加 header + footer 片段,或统一不加。当前这种"有的有、有的无"的状态会让站点页脚(赞赏、版权、相关推荐等)时有时无。

3. 概览篇与专题篇内容高度重复,存在双重维护成本

-02.md 里的"虚拟内存""I/O 多路复用""零拷贝"三节,和三篇专题文章在结论、图片、措辞上高度重叠(很多句子几乎一字不差)。

这本身是合理的设计(概览 + 详解 + 末尾"详细介绍"链接),但风险在于:一旦某个技术结论需要修订,要同时改两处,很容易漏改导致前后矛盾。

建议

  • 明确边界:概览篇只保留"结论 + 一张图 + 一句话适用场景",把推导、代码、边界条件全部交给专题篇。
  • 在概览篇相应小节顶部用注释标注"本节为 xxx.md 的精简版,修改请同步",降低漏改概率。

4. 图片 alt 文案两极分化(影响 SEO 与无障碍)

新专题文章的图片 alt 写得非常好(例如"缺页中断处理流程:MMU 发现页不在内存后……"),但老内容里大量图片是空 alt:

  • -01.md 第 28 行 ![](...image-20200807161118901.png)
  • -01.md 第 172 行 ![](...wechat-factory....png)
  • -01.md 第 304 行死锁图用了 <img> 裸标签且无 alt
  • linux-intro.md 第 85、246、250、302 行等多处 ![](./images/...) 空 alt

建议:给所有空 alt 的图片补上描述性文案,既利于 SEO,也利于无障碍访问和图片加载失败时的兜底。

5. 风格代差

virtual-memory.md / io-multiplexing.md / zero-copy.md 用的是"痛点开场 + 跨界隐喻 + 踩坑预警 + 面试怎么答"的现代风格;而 linux-intro.mdshell-intro.md 前半段仍是"命令罗列 + 平铺直叙"。

建议:至少给 linux-intro.mdshell-intro.md 补一个"痛点式开头"和"末尾要点回顾",向高质量三篇靠拢,保证专题内体验一致。


三、逐篇问题

linux-intro.md(问题最集中,建议重点修)

这篇时效性问题最严重,有几个是事实性错误:

  1. CentOS 推荐已过时(重要):第 51~54 行推荐初学者用 CentOS,理由是"免费、基于 RHEL、稳定"。但 CentOS Linux 8 已于 2021 年底 EOL,CentOS 项目已转向 CentOS Stream(上游滚动发行,定位变了)。继续向初学者无条件推荐 CentOS 会误导。 建议:改为推荐 Rocky Linux / AlmaLinux(RHEL 兼容、社区接棒),或 Ubuntu LTS / Debian,并简单说明 CentOS 的现状变化。

  2. 命令笔误(bug):第 190 行 find /home -i name "*.txt",正确写法是 find /home -iname "*.txt"-iname 是一个整体参数,中间不能有空格)。

  3. chkconfig 已过时:第 310~311 行用 chkconfig --add/--list 演示开机自启。现代发行版基本是 systemd,应改用 systemctl enable 并注明 chkconfig 属于 SysV init 时代。

  4. 环境变量加载顺序描述过于绝对(准确性):第 380 行给出 /etc/environment --> /etc/profile --> ... --> ~/.bashrc 的固定顺序。实际上登录 shell 与非登录/交互 shell 的加载路径不同,~/.bash_profile~/.bashrc 的触发条件也不同。建议补一句"加载顺序取决于是否登录 shell、交互 shell",避免读者照搬出错。

  5. inode 与扇区表述可更精确:第 72 行"现代硬盘扇区通常为 4KB"——传统是 512 字节,现代盘有 512e / 4Kn 之分,可稍作区分。

  6. 缺少常用现代排障命令:已经提到了 ss 替代 netstatip 替代 ifconfig,但日志排障少了 journalctl(systemd 日志),可以补上。

  7. 结构上缺"版本说明/痛点开头/要点回顾":和 shell-intro.md 的"版本说明"以及专题三篇的开头不对称。

shell-intro.md(内容很全,但深浅严重不均)

  1. 深浅断层(核心体验问题):文章定位是"带你入门 Shell",前半段是 HelloWorld、变量、字符串,非常入门;但从"生产环境最佳实践"开始,突然跳到指数退避 + 随机抖动、flock 脑裂(还配了 mermaid 时序图)、iptables 故障注入、NFS 一致性压测——这些是偏 SRE/资深运维的内容。跨度太大。 建议:要么把"生产环境最佳实践 / 故障演练"独立成一篇进阶文章(如《Shell 脚本生产实践》),入门篇只留指针;要么在该章节前明确标注"以下为进阶内容,初学者可先跳过"。

  2. 可移植性 bug(与文章主张自相矛盾):第 970 行 sleep "${delay}e-6"。文章通篇强调可移植性,但这里依赖 sleep 接受科学计数法 e-6——GNU coreutils 的 sleep 支持小数秒,但科学计数法并不可靠,BSD/macOS 的 sleep 连小数都不支持。建议改成毫秒转秒的普通小数,或直接用整数秒退避。

  3. 示例与"始终加双引号"的建议自相矛盾:文章在最佳实践里强调"始终用双引号包裹变量",但前面大量示例没加引号,例如:

    • 第 482 行字符串运算符表 [ $a = $b ][ -z $a ]
    • 关系运算符示例中的变量引用 建议:把入门示例也统一加上双引号,做到言行一致,否则初学者会照着没加引号的版本学。
  4. expr 与 GNU 扩展的提示已经做得不错(第 224 行对 expr length 非 POSIX 的提醒很到位),这点值得保持。

operating-system-basic-questions-01.md(面试题上)

整体质量不错,用户态/内核态、死锁部分写得很好。零散问题:

  1. "局部性原理(2-8 原则)"表述不严谨:第 21 行把局部性原理直接等同于二八原则。两者相关但不等价,建议措辞上区分开。

  2. "事件(Event)"同步方式描述偏弱:第 214 行"事件(Event):Wait/Notify……"这一条比较含糊,且容易和 Java 的 Object.wait/notify 混淆。建议要么讲清楚(条件变量 condition variable 的语义),要么和上面的几种同步原语统一粒度。

  3. 外链稳定性:第 245 行进程间通信引用了简书链接、第 415 行银行家算法引用 CSDN。这类站点链接腐烂率较高,建议要么改引更稳定的来源,要么把核心内容内化进正文。

  4. 图片路径归类:第 257 行进程调度算法图 URL 在 .../cs-basics/network/scheduling-algorithms-of-process.png(放在 network 目录下而非 operating-system)。不影响显示,但归类不当,长期维护时容易找不到。

  5. header include 缺失:见全局问题第 2 点。

operating-system-basic-questions-02.md(面试题下)

这篇已经做过较好的改写,质量较高。剩余问题:

  1. 与三篇专题重复:见全局问题第 3 点,这是最需要关注的。

  2. 段页式管理偏简略:第 327~338 行段页机制讲得比较快,可补一张图或对照专题里更完整的版本。

  3. SLAB 一笔带过:第 65 行"由于这部分内容不是本篇文章的重点,这里就不详细介绍了"。可以补一句话点明 SLAB 解决的是"小对象频繁分配"的内部碎片,给读者一个完整闭环,而不是戛然而止。

  4. 磁盘调度算法缺少直观示例:第 475~490 行 6 种算法讲解清晰,但没有一个具体的磁道访问序列示例(如给定请求序列 + 当前磁头位置,对比各算法的寻道总距离),读者较难形成直观感受。

virtual-memory.md(高质量)

几乎没有硬伤,只有锦上添花的小建议:

  1. 自称"小 G",统一为 Guide(全局问题第 1 点)。
  2. 五级页表、LA57、Belady 栈性质这些细节非常出彩,建议保持。
  3. 末尾"面试里怎么答"是亮点,可以考虑把这个范式复制到其他篇。

io-multiplexing.md(高质量)

  1. C10K 痛点开场、五种 I/O 模型定位、epoll 内核结构(红黑树 + 就绪链表 + 回调)讲解都很到位。
  2. 主动纠正"epoll 靠 mmap 省拷贝"的误区(第 231 行)非常有价值。
  3. 唯一建议:补 footer include(全局问题第 2 点)。

zero-copy.md(高质量)

  1. "先说清楚这本账的前提"那段把简化模型的假设摆明,非常专业,避免了"几次拷贝"被当成放之四海的常数。
  2. 自称"小 G",统一为 Guide。
  3. Rust zerocopy crate 的"另一回事"提醒很贴心,可保留。

README.md(专题目录页)

作为 landing page 质量很好:适合谁看、学习重点、阅读顺序、高频问题、相关专题结构完整,SEO 友好。无需大改,仅需在新增/拆分文章后同步更新链接列表。


四、可执行改进清单(按优先级)

P0|事实性错误与 bug(应尽快修)

  • linux-intro.md 更新 CentOS 推荐(改 Rocky/Alma/Ubuntu,并说明 CentOS 现状)
  • linux-intro.md 修正 find -i namefind -iname(第 190 行)
  • linux-intro.md chkconfig 改为 systemd 方案或加时代注明(第 310 行)
  • shell-intro.md 修正 sleep "${delay}e-6" 的可移植性问题(第 970 行)

P1|一致性(影响专题整体观感)

  • 统一第一人称为 "Guide"(virtual-memory.md、zero-copy.md)
  • 统一 header/footer include 规范(全部 5+ 篇)
  • shell-intro.md 入门示例统一加双引号,与自身最佳实践一致
  • linux-intro.md 环境变量加载顺序补充"登录/非登录 shell"前提

P2|结构与体验

  • 拆分 shell-intro.md:入门篇 + 生产实践进阶篇(或加"进阶内容"标注)
  • linux-intro.md / shell-intro.md 补痛点开头与要点回顾,对齐三篇专题风格
  • 明确概览篇(-02.md)与专题篇的内容边界,标注同步关系
  • 给所有空 alt 图片补描述文案

P3|内容增强

  • -01.md 厘清"局部性原理 vs 二八原则"、完善"事件同步"描述、替换易腐外链
  • -02.md 补段页式配图、SLAB 一句话闭环、磁盘调度寻道距离示例
  • linux-intro.mdjournalctl 等现代排障命令