当前位置: 首页 > news >正文

计算机死机的时候,它在干什么?

大家好,我是厂长。

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

4cf9dca37c4fac0139ae18e2283bacf4.png

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

尤其是早些年,电脑配置还没现在这么高的时候,多开几个重量级应用程序,死机就能如约而至,就算你把键盘上的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操作系统内核中,就有大量的全局性的锁,一个不小心造成死锁,其他想要的线程都得进入等待队列,那就凉凉了。

a95346f87a8f19d502edeb52b032d391.png

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

2fd3ea7870443429b2af3b1d5a1dcd72.png

你好,我是厂长谭庆波,就读于哈工大,计算机系学生,求学20载,从农村到C9博士,点击蓝字查看我的成长之路。
同时,我也是知乎博主:谭庆波,日常分享高质量程序员认知,学习资料、技术干货等,欢迎围观。


 
最后说一件重要的事,我最近建了一个【晋级的程序员】社群,旨在帮助新手小白快速上手找到编程的乐趣,里面沉淀了大量编程相关经验教程以及学习资料,目前社群人数已经超过2500人,欢迎大家加入:

相关文章:

  • 30岁考研晚不晚?
  • 笑死!Go语言侵犯人权!
  • 放弃年薪百万,要去当公务员
  • GitLab 禁用 Windows!
  • 为什么某互联网企业开200w年薪大家都支持,但是中金开100w年薪大家都在骂?...
  • 距离自毁只剩24小时的网站,全靠网友续命
  • 又撞了,杀人的自动驾驶。。。
  • 34岁学长,工作10年存款5万
  • 腾讯又一神级APP下架!网友:我用了7年啊。。
  • 定了!本科以下学历直升本科,每人补贴8000元!政策扶持,名额有限,速看!...
  • 普通大学生的真实出路
  • 这反人类的限制,终于被破解掉了!
  • U盘无法打开提示格式化解决方案
  • 共享文件与打印机设置
  • 七款无广告/不骚扰输入法
  • android图片蒙层
  • Angular4 模板式表单用法以及验证
  • CentOS 7 防火墙操作
  • Docker容器管理
  • express.js的介绍及使用
  • hadoop集群管理系统搭建规划说明
  • js对象的深浅拷贝
  • JS专题之继承
  • python3 使用 asyncio 代替线程
  • rabbitmq延迟消息示例
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • socket.io+express实现聊天室的思考(三)
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Terraform入门 - 3. 变更基础设施
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • Java数据解析之JSON
  • Nginx实现动静分离
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​【已解决】npm install​卡主不动的情况
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • $NOIp2018$劝退记
  • (04)odoo视图操作
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (转)可以带来幸福的一本书
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @JoinTable会自动删除关联表的数据
  • [20190113]四校联考
  • [AIGC] 如何建立和优化你的工作流?