操作系统

目录概述

你的Java程序跑起来,操作系统到底干了什么?为什么代码里随便new一个对象,内存就涨了几百兆?为什么多线程跑着跑着就死锁了?为什么进程间通信这么麻烦?

这个模块用直观类比和生产事故视角,带你理解操作系统这个"大管家"是怎么管理进程、内存、文件系统的。不背概念,要理解为什么这样设计。

【直观类比】 操作系统就像一家外包公司的项目经理。进程是项目组,线程是组里的成员,内存是办公工位,磁盘是文件柜。你(应用程序)把任务交给项目经理,他来决定谁先做、谁多用点资源、谁该等等。

内容范围

进程与线程

  • 进程和线程的区别
  • 进程的状态转换(就绪、运行、阻塞)
  • 上下文切换和调度算法
  • 进程间通信(IPC)
  • 线程安全和同步机制

内存管理

  • 虚拟内存和物理内存
  • 分页和分段
  • 页面置换算法(LRU、FIFO)
  • 内存泄漏和内存溢出
  • JVM内存模型和操作系统内存的关系

文件系统

  • 文件存储结构(inode)
  • 目录结构和路径解析
  • 文件描述符和fd
  • 磁盘调度算法

并发与锁

  • 用户态和内核态
  • 死锁产生的四个条件
  • 死锁预防和避免
  • 无锁编程和CAS

【直观类比】 线程和进程的关系,就像"一个项目组"和"组里的成员"的关系。一个项目组可以有多个人(多线程),但共享项目组的资源——白板、文档、代码库。进程之间要想交流,得走正式渠道——发邮件、开会(IPC)。

学习路径指引

第一阶段:搞懂基础概念(1周)

这个阶段要建立进程思维,理解程序是怎么跑起来的。

必须掌握

  • 程序和进程的区别
  • 进程和线程的根本差异(共享 vs 独立)
  • 什么是系统调用
  • 用户态和内核态

生活类比

  • 程序是菜谱,进程是按照菜谱做菜这件事
  • 线程是厨师,一个厨师只能做一道菜,多个厨师可以同时做多道菜

第二阶段:攻克内存管理(2周)

这是最能体现系统理解能力的地方,也是面试重灾区。

必须理解

  • 为什么需要虚拟内存
  • 什么是分页,分段是什么
  • 页面置换算法FIFO、LRU、Clock
  • 什么是内存抖动
  • JVM内存结构和OS内存的关系

常见困惑点

  • "32位系统最大内存是4G"——为什么?
  • "JVM设置了-Xmx2g,为什么进程占用可能超过2g?"
  • "TLB是干什么的,miss了会怎样?"

【直观类比】 虚拟内存就像给你的是一个超级大的虚拟工位(100平米),但实际上你只能用其中一小部分(20平米)。不用的部分存在"仓库"(磁盘),需要的时候再搬过来。这个"搬"的动作就是页面置换。

第三阶段:吃透并发与锁(2-3周)

这是Java程序员的核心竞争力,直接决定你写的代码会不会出生产事故。

必须理解

  • 死锁的四个必要条件
  • 怎么检测死锁、怎么预防死锁
  • 用户态锁 vs 内核态锁的开销差异
  • CAS的原理和ABA问题
  • synchronized和ReentrantLock的区别
  • 什么是伪共享,怎么避免

生产事故案例

  • 数据库连接池被打满——线程阻塞
  • 高并发下内存暴涨——内存泄漏
  • 服务器CPU 100%——死循环或死锁

导航指引

操作系统打通后,这些知识等着你继续探索:

或者回到 CS首页 查看全貌。

💡

面试高频场景:面试官问"你遇到过死锁吗"——90%的人会说没有。但其实很多人写的代码里隐藏着死锁风险,只是没触发过。真正理解死锁的人,会说出具体场景、怎么排查、怎么解决。

⚠️

别以为"内存管理"只是面试题。线上一次OOM(OutOfMemoryError),可能让你的服务瘫痪几小时。理解操作系统内存管理,是写出健壮Java代码的基础。