当前位置:网站首页>电脑死机的时候,发生了什么?
电脑死机的时候,发生了什么?
2022-07-30 18:43:00 【chenzixia】

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

电脑死机,应该每个接触计算机的小伙伴都经历过吧。
尤其是早些年,电脑配置还没现在这么高的时候,多开几个重量级应用程序,死机就能如约而至,就算你把键盘上的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的描述(我觉得特别形象):

边栏推荐
- [TypeScript]编译配置
- ESP8266-Arduino编程实例-HC-SR04超声波传感器驱动
- Immersive experience iFLYTEK 2022 Consumer Expo "Official Designated Product"
- 【Prometheus】Prometheus联邦的一次优化记录[续]
- DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计
- 荐书 | 推荐好评如潮的3本数据库书籍
- ESP8266-Arduino编程实例-BMP180气压温度传感器驱动
- 【总结】1396- 60+个 VSCode 插件,打造好用的编辑器
- Quickly build an e-commerce platform based on Amazon cloud technology serverless service - performance
- 《自然语言处理实战入门》---- 文本样本扩展小技巧:使用回译技术进行样本增强
猜你喜欢

ESP8266-Arduino编程实例-DS18B20温度传感器驱动

Recommendation | People who are kind to you, don't repay them by inviting them to eat

银行适用:此文能够突破你的运维流程管理问题

kotlin的by lazy

Fixed asset visualization intelligent management system

【剑指 Offer】剑指 Offer 22. 链表中倒数第k个节点

C# wpf 无边框窗口添加阴影效果

固定资产可视化智能管理系统

网络基础(二)-Web服务器-简介——WampServer集成服务器软件之Apache+MySQL软件安装流程 & netstat -an之检测计算机的端口是否占用

微博广告分布式配置中心的构建与实践(有彩蛋)
随机推荐
Pytorch foundation -- tensorboard use (1)
荐号 | 对你有恩的人,不要请吃饭来报答
[OC study notes] attribute keyword
第4章 控制执行流程
DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计
[TypeScript]编译配置
C# wpf borderless window add shadow effect
沉浸式体验科大讯飞2022消博会“官方指定产品”
6块钱1斤,日本公司为何来中国收烟头?
Graphic LeetCode -- 11. Containers of most water (difficulty: medium)
Codeblocks + Widgets create window code analysis
ROS 环境使用第三方动态链接库(.so)文件
LeetCode 练习——关于查找数组元素之和的两道题
生物医学论文有何价值 论文中译英怎样翻译效果好
The use of @ symbol in MySql
OneFlow源码解析:Op、Kernel与解释器
实体中增加操作方法
自然语言处理nltk
The Meta metaverse division lost 2.8 billion in the second quarter!Still want to keep betting?Metaverse development has yet to see a way out!
OneFlow source code analysis: Op, Kernel and interpreter