姓名:黎文渊
学号:17021210909
转载自:https://www.zhihu.com/question/68033587,有删节
【嵌牛导读】:cpu拥有大规模集成电路,数以亿计的电路晶体管,由于量大,电路损坏或者失效的概率来说应该不小,可是就日常使用的系统Windows或Macos或者Linux很少出现明显的错误。这是为什么呢?
【嵌牛鼻子】:UEFI固件、服务器、嵌入式产品、开源硬件从业者
【嵌牛提问】:为什么拥有巨大规模集成电路的cpu很少出错?
【嵌牛正文】
首先,我们要明确一点,CPU会出错,并且一旦出错,会越来越频繁的出错。
我们这里所说的错误,主要指程序崩溃,或者是程序的运算结果出错。后者SDC(silent data corruption)通常更严重,比如说计算机结果不对但程序没有崩溃,错误结果最终也许会导致更严重后果。
电路晶体管出现错误并不少见,不过从整个计算机系统来看,统计讲到某个特定的使用者,出现错误,并且能被体验到并不会很频繁。即使硬件出现错误,并不会都传递到最上层的软件,比方说,只有5%的错误会影响到处理器的状态,最终用户观察到的比如程序崩溃,计算结果出错实际上会很少。
通常我们说的硬件错误有两种,一种是soft error;另一种是hard error。soft error,不是软件错误,是指因为背景辐射(alpha射线、高能辐射)造成的随机翻转,0变成1或者1变成0。这种错误是瞬时发生的,很难复现。hard error或者permanent faults就是题主说的电路损坏或者失效。
先讲soft error,大部分soft error并不会影响结果,比如说某个晶体管临时的位翻转,但是逻辑门的输出不依赖这个晶体管的状态;或者出错的时候时钟正好不在那个状态去用那个值;或者说出现在一个位置,很快被新的值覆盖;或者说那个错误的值不影响软件执行结果。因为种种原因,只有很少的错误会传到到最终用户可见的程度。在处理器架构设计中,还会针对关键电路采用容错机制,检测或者纠正错误,常见的,比如奇偶校验、ECC等。
hard error,是永久性的电路失效,表现形式就是部分电路的输出不变,永远是1或者0。有的器件,会有备份电路,有检测手段可以测试并用备份电路替代坏掉的。另外在实际情况中,损坏的电路并不会每次都被用到,比方说,芯片上有个buffer,其中坏了一个bit,但因为我的实际应用不会把这个buffer用完,也不会用到坏掉的那个bit,于是不会受那个坏掉的bit影响。
硬件也会提供机制向软件报告错误。软件(操作系统)也会有容错机制去处理硬件报告的异常。比如说重试,很可能就不会再出错。出现无法恢复的错误就是变成我们常见的程序崩溃了、kernel panic、死机之类的。
实际上,很多错误并不会影响用户体验,比如某个后台程序报一个错,或者崩溃了;再比如屏幕上某个像素值有一瞬间不对;玩游戏的时候某个NPC走位不对;或者点了下按钮第一下没动… 这些我们都不会直接想到是某个晶体管工作不正常。
因此,硬件的纠错机制会让细微的偶然错误化于无形,同时也避免了数据的错误,帮助计算机系统健康稳定运行。