⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 编程技术宇宙 「轩辕之风O」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

今天花几分钟跟大家分享一个很有意思又能涨知识的问题:电脑死机的时候到底在干什么?

电脑死机,应该每个接触计算机的小伙伴都经历过吧。

尤其是早些年,电脑配置还没现在这么高的时候,多开几个重量级应用程序,死机就能如约而至,就算你把键盘上的 CTRL+ALT+DELETE 按烂了,任务管理器也出不来,最后只能默默含泪长按关机按钮,强制关机。

那么,你有没有想过,电脑在死机的时候,它到底在干嘛呢?

众所周知,计算机的核心中枢是中央处理器 CPU。上过计算机基础课程的同学都被教导过:CPU 是一根筋死脑筋,只知道不断地取出指令来一条条执行,直到关机方休。

所以理论上,死机分为两种,一种是 CPU 罢工不干了,不再执行下一条指令了,这属于硬件死机,不过这种情况基本不会发生。

更多的是软件层面的死机,也就是 CPU 被困在了某个地方出不来了,导致本该执行的程序得不到执行,看起来就是死机了一般。

聪明的你可能马上想到,如果写一个死循环,把 CPU 陷在里面出不去,是不是就能死机了?比如这样:

void dead_loop() {
while (1) {
...
}
}

你可以试一下,会发现为 CPU 降温的风扇可能会转起来,但计算机依旧能正常工作,并没有死机。

死循环,CPU 不是应该一直在这里转圈吗?难道不会死机?

这就不得不提到一个概念:中断

中断

中断这个概念,绝对是计算机史上最伟大的发明之一。

中断,顾名思义,用于打断 CPU 正常的工作,让它去执行别处的指令程序。

操作系统之所以能够掌控全局,就得益于它启动时给 CPU 安插的一系列的中断处理函数(比如我们最常见的时钟中断),好让操作系统能周期性地收回 CPU 的执行权,调度别的线程来执行。

所以,即便你某个线程进入了死循环,在你的时间片用完之后,也得乖乖交出 CPU,让别的程序来执行。

想用一个死循环就把电脑搞死机,那自然是不可能的。

其实想来也是,如果这么容易就给你搞死机了,那这操作系统也太菜了吧,新手如果刚学编程,还不得一天强制重启电脑十几回?

退一万步讲,就算不考虑中断的影响,现在的 CPU 大都是多核,一个线程进入死循环,但还有别的核可以参与系统调度,也依然不会死机。

那么回到开始的问题,那到底 CPU 被困在了哪里出不来,连中断都拿它没办法呢?

其实有两种情况:

1、中断确实拿它没办法

很多人都知道中断的概念,但很多人不知道,中断也是有优先级的。

这很容易理解,比如 CPU 正在执行程序,突然发生了一个中断事件。CPU 保存好当前执行的上下文,转头去处理这个中断事件,但刚处理到一半儿,这时又有一个新的中断事件来了,那 CPU 怎么办?要不要响应?

所以中断也有优先级之分,低优先级的中断无法打断高优先级的中断。

有了这个前提来试想一下,如果由于操作系统内核代码写得不当,在处理某个中断的时候陷入了死循环,比如自旋锁,会发生什么?

因为在处理中断的时候,CPU 运行在一个很高的优先级上,一般的中断是无法把执行权抢过去的,这就导致这颗 CPU 核心成为了“植物人”,怎么叫它都没反应了。

2、中断能抢到 CPU,但发现没有线程可以调度

程序员们对死锁这个概念应该不陌生,两个线程 A 等待 B,B 等待 A,两个线程互相等待对方让步(释放锁),形成僵持局面,最后成为死锁。

如果死锁发生在应用层面,那问题不大,最多就是两个程序死了。但如果发生在内核呢?

比如在 Windows 操作系统内核中,就有大量的全局性的锁,一个不小心造成死锁,其他想要的线程都得进入等待队列,那就凉凉了。

引用一段另一位大神 Tim Chen 的描述(我觉得特别形象):

文章目录
  1. 1. 中断