电脑死机的时候,发生了什么?

      最后更新:2022-07-30 17:00

      dd8bd39a304bd0691b06dfbd0595ffeb.jpeg

      今天我想和你分享一个非常有趣的和有益的问题:电脑死后你会做什么?

      f5321565a0a9d48642be13ede182a1d6.jpeg

      计算机死亡, 应该由计算机接触的每一个朋友经历.

      尤其是在早期,当计算机配置不象现在那样高时,如果你运行几个重用应用程序,死的机器会进来,即使你在键盘上按CTRL+ALT+DELETE坏了,任务管理员就不会出来,最后你将不得不默默地按下关机按钮并迫使关机。

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

      众所周知,计算机的核心是中央处理器的CPU。 接受基本计算机课程的学生被教导,CPU是大脑的死路,它只知道如何接受指令并执行它们,直到计算机关闭。

      因此,在理论上,一个死机器被分成两个,其中一个CPU攻击不工作,不再执行下一个命令,该命令属于硬件死机器,但这基本上不是情况。

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

      你可能会立刻想到,如果你写了一个死循环,不把CPU放在里面,那它不会死的吗?

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

      你可以设法发现冷却CPU的扇子可能转动,但电脑仍然正常工作,没有死的机器。

      死循环,CPU是不是应该一直在这儿运行?不是死机器吗?

      这与一个概念有关:中断。

      中断

      干扰这个概念无疑是计算机史上最大的发明之一。

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

      操作系统控制整个系统的能力,从一系列在CPU启动时内嵌的中断处理功能(例如我们最常见的时钟中断)中获益,使得操作系统能够定期检索CPU的执行权并分配其他线程执行。

      所以即使你把线程带进一个死循环,在时间尽了之后,你必须把线程交给CPU,让其他程序运行。

      使用死环使计算机死是自然不可能的。

      我是说,如果这么简单的话,你就会丢掉你的电脑,操作系统太乱了。如果你是新进的程序员,难道你不需要每天十次重新启动你的电脑吗?

      回到10,00步,即使不考虑中断的影响,目前的CPU基本上是多核,其中一个线程进入死循环,但其他核可参与系统调用,但仍未死。

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

      其实有两种情况:

      这种干扰实在是无法承受的

      许多人知道中断的概念,但许多人不知道中断也是一项优先事项。

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

      因此中断也有优先级,低优先级中断不能中断高优先级中断。

      考虑到这一前提,如果操作系统内核代码不正确写,并且在处理故障时进入死循环,例如自旋锁,会发生什么?

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

      中断可以抓到CPU,但找不到线程可以调整

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

      如果在应用程序层面出现僵局,问题并不大,最多两个程序都死了。

      例如,在Windows操作系统内核中,存在大量的全球锁,其中一个是偶然导致僵局,而其他需要的线程则必须进入等待队列,这很酷。

      5739135ea5f7cd50efbeb8421a3c0ef7.jpeg

      引用另一位伟大的神,蒂姆·陈(我认为他是一个特殊的人物):

      89f6faca15cf87955ad9b173c4053bce.jpeg

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类