一条河流过系统:从 CPU 到 Java 的并发叙事图 🌊🧠

18 阅读2分钟

一条河流过系统:从 CPU 到 Java 的并发叙事图 🌊🧠

这不是分章节的说明书。

这是一条河。

CPU 发源,
流经 操作系统
穿过 线程与锁
最后抵达你敲下的那一行 Java 代码

中途不停,也不回头。


CPU 上电的那一刻,就写好了宪法 ⚖️

有些指令,只有皇帝能用。

于是世界被分成了几层:

  • Ring 0 👑:内核态

    • 能碰硬件
    • 能关中断
    • 能调度众生
  • Ring 3 🧑‍💻:用户态

    • 写代码
    • 算业务
    • 做梦想

这不是制度选择,
这是硅片上的物理规则


程序不服气:“我也想读磁盘。” 💾

CPU 冷冷一句:

你没资格。

操作系统站出来,像个公证人:

“写个系统调用吧,
我替你跑这一趟。”

于是:

  • 用户线程 ✍️
  • 系统调用 🚪
  • CPU 切 Ring 0 🔁
  • 内核执行 🧠
  • 结果原路奉还 🎁

这条路径,
Ring 切换的正门


接着,真正跑在 CPU 上的生命体登场了 🧬

CPU 不认识进程,
只调度线程。

  • 用户线程:

    • 写在 Java / C / Go 里
    • 平时待在 Ring 3
  • 内核线程:

    • 属于操作系统
    • 常驻 Ring 0

但关键是:

同一个线程,
可以在 Ring 3 ↔ Ring 0 来回横跳。

前提是——
你敲了那扇门。


并发来了,世界开始拥挤 😵‍💫

两个线程,
同时盯上同一块内存。

秩序开始动摇。

于是人类发明了三样古老又优雅的东西 🏛️


原子性 Atomic ⚛️

  • CPU 指令级誓言
  • CAS、原子加
  • 不可分割

特点:

  • ❌ 不进 Ring 0
  • ⚡ 快到冷酷

👉 能靠硬件解决,
绝不惊动内核。


信号量 Semaphore 🚦

  • 带计数的门卫
  • 控制“最多进几个人”

当名额没了:

  • 线程阻塞 😴
  • 内核接管 👑

👉 一旦阻塞,
必然踏入 Ring 0。


管程 Monitor 🏛️

  • 互斥 + 条件
  • 锁和规则绑在一起
  • Java synchronized 的灵魂

表面温柔,
背后可能:

  • 轻则 CAS 🎯
  • 重则 mutex 🚨

于是你写下:

synchronized (obj) {
    count++;
}

你以为只是加了把锁 🔒

实际上可能发生的是:

  1. CAS(Ring 3)⚡
  2. 竞争升级 📈
  3. 锁膨胀 🧱
  4. 线程阻塞 😴
  5. 系统调用 🚪
  6. 切 Ring 0 👑
  7. 内核调度 🎼

你没看到血,
但地板已经被拖干净了。


所以——线程安全到底靠什么? 🎯

答案很简单:

不是“用不用 Ring 0”,
而是“什么时候不得不进去”。

场景Ring 0
原子变量
自旋
无竞争锁
阻塞锁
wait / notify
IO / sleep

河流的尽头,是一句真相 🌌

Ring 是边界,
线程是生命,
锁是秩序,
内核是最后的仲裁者。

你在用户态写诗 ✍️
写业务 💼
写并发模型 🧠

当世界开始失序——

你把问题交给内核,
内核替你维持宇宙稳定。
🌍⚖️

这,就是这条河。