35
从电脑计算机出现至今就一直被电脑死机伴随着,几乎没有谁的电脑计算机从不遭遇电脑死机。在使用过程中,偶尔一次电脑死机应该算是正常现象,如果经常电脑死机,电脑计算机就存在一定的常见问题了。那么,电脑计算机为什么或者说怎么会会电脑死机呢?有哪些因素会造成电脑计算机死机呢?要搞清楚这些常见问题,首先要弄清楚,到底什么是电脑死机?为什么或者说怎么会会发生电脑死机? > 造成电脑死机的原因是多种多样的,有系统软件常见问题,有计算机硬件(Hardware)常见问题,不过,电脑死机的本质都是一样的。 > 早在N年前,我主持某大学计算机专业本科生毕业答辩的时候,就向某学生提出过这样两个常见问题: > 1.电脑计算机死机的时候,电脑主板上的CPU在干什么(或者说,电脑主板上的CPU处于什么状态?)” > 2.在计算机中,无论系统指令代码还是数据(Data)代码,都是用二进制来表示的,请问一下
快活林的网友们,电脑主板上的CPU是如何判定某二进制代码是系统指令代码还是数据(Data)代码? //本文引用基地中心自http://www.45it.comwww.45it.com电脑计算机软计算机硬件(Hardware)应用网 > 其实,上面两个常见问题的实质是一样的,主要涉及到电脑主板上的CPU是如何取得系统指令和如何执行系统指令的,把这两个常见问题搞清楚了,电脑死机的常见问题也就容易理解了。 > 首先来看看,冯.诺依曼结构的电脑计算机是如何取得系统指令、又是如何执行系统指令的: > 冯.诺依曼(1903~1957),匈牙利裔数学家,1945年戈德斯坦、勃克斯等人,联名发表了一篇长达101页纸的报告,即计算机史上著名的“101页报告”,提出了现代计算机结构的理论模型--存储程序(Procedures)计算机模型(Stored Program Computer),这就是今天计算机最基本的原理模型。 > 这种结构类型计算机工作的时候,首先必须把完成工作步骤和相关的数据(Data)用二进制代码表示出来(编写程序(Procedures)),然后再把它们保存在计算机的内存(Memory)中,电脑主板上的CPU依次从内存(Memory)中读相关的系统指令代码和数据(Data)进行运算,直到完成整个运算过程并输出结果。 > 要完成这样的运算过程,人们在设计运算器(电脑主板上的CPU)的时候,首先就要考虑的是,在一段内存(Memory)中,电脑主板上的CPU怎样区分系统指令代码和数据(Data)代码。熟悉计算机的人都清楚,系统指令用来确定“做什么”和“怎样做”,数据(Data)是“做”的时候需要原始数。 > 比如:要计算机做1+2=?中,“+”表示要做什么和怎样做,1和2则是做的时候需要的原始数。现在假设某电脑主板上的CPU中,“+”用二进制“01”来表示,“1、2”分别用“01、10”来表示。那么,这段程序(Procedures)存入内存(Memory)中就是这样的: > XXXX1:01 > XXXX2:01 > XXXX3:10 前面的XXXX1 XXXX2 XXXX3表示内存(Memory)的地址 > 从上面可以看出,“+”系统指令和被加数是完全相同的,当然,这是我故意这样假设的,但是,在实际情况中,这种情况是大量存在的。在正常情况下,电脑主板上的CPU只能把XXXX1内存(Memory)中的01作为系统指令,XXXX2内存(Memory)中的01作为被加数才能得到正确的结果。那么电脑主板上的CPU如何才能做到不把第二个01也当成“+”呢? > 1.人们把内存(Memory)的某个地址规定为起始地址(又称为复位地址),也就是说,当计算机打开计算机或者被强行复位(也就是主机箱上那个重启操作系统动按钮按下的的时候),电脑主板上的CPU立即跳转到这个地址中,并且把它里面的代码作为系统指令来执行,同时根据这个系统指令的长度和格式判断下一条系统指令在什么地方。 > 对于X86系列电脑主板上的CPU(也就是现在人们常用的什么奔XX、赛XX系列),它的复位地址是FFFF0,如果表示成逻辑地址则是:FFFF:0。对DEBUG比较熟悉的
快活林网友或者会在一些高级语言中嵌入汇编语言的
快活林网友可以这样做一个试验: > 用DEBUG执行一条系统指令(这是一条无条件跳转系统指令):jmp FFFF:0,或者在高级语言中嵌入这条汇编系统指令,执行后,你就会发现,计算机你的计算机重新启动了。其实,用程序(Procedures)控制计算机重启操作系统的最本质的操作就是这样的。 > 2.给各种系统指令规定了相应的长度和格式。比如:某数+某数这条系统指令就规定:这条系统指令的长度是3个字节,其中第一个字节表示“+”,后面两个字节表示被加数和加数。于是,当电脑主板上的CPU到达这个系统指令后,就自动把第一个代码作为系统指令,后面两个代码作为数据(Data),依次类推,第4个代码就必然是系统指令.. > 现在假设,电脑主板上的CPU在执行系统指令的时候因某种原因,误把本来是数据(Data)的代码当成了系统指令,结果除了是计算结果出错外电脑死机也就是必然的了。 > 还是以前面那个加法程序(Procedures)为例:当电脑主板上的CPU把第三个代码(也就是10)当成了系统指令,而恰好这个代码是一跳转系统指令,电脑主板上的CPU的执行结果将是:XXXX3--跳转--执行--跳转--执行..进入周而复始的乱条,不过注意,虽然是在乱跳,电脑主板上的CPU却始终是在不停的正常地执行系统指令,所谓的“乱”是对用户而言,对电脑主板上的CPU来说却是正常的。 > 还有一种情况就是,如果恰好跳转到了FFFF:0这个地址,计算机便你的计算机重新启动了。呵呵这下搞清楚了为什么或者说怎么会计算机有时会“莫名其妙地重启操作系统”了把。 > 有
快活林网友可能会问,内存(Memory)中怎么可能有如此多的跳转系统指令呢?是怎么形成的呢? > 计算机中的最小存储单位是字节(8个二进制位),系统指令强大的功能、长度和格式也是在一个字节中规定的。因此,平均来说,每256个代码中就有可能出现一条跳转系统指令(8位二进制数最多表示256)。 > 还有一种情况:现在计算机的内存(Memory)已经达到数G的存储容量,绝大多数都不可能用到这个极限,也就是说,有相当长一段区域是空白,即使内存(Memory)只有数百M的计算机中也不可能把内存(Memory)用完,同样存在相当数量的空白区域。特别需要注意的是,空白区域不等于里面就没有代码。因为,在数字逻辑电路中,不可能存在“没有”这种情况,即使是表示没有(叫做“空”--NULL)也是要用一个代码来表示的(NULL用00)来表示,所以,空白区域内的代码是“”或者干脆就是一些随机代码。X86系列的电脑主板上的CPU“”是一条单字节的系统指令nop--空操作系统指令,当电脑主板上的CPU跳转到这些空白区域时,虽然不会发生再次跳转的现象,电脑主板上的CPU也会逐条执行这些代码,执行到最后一个内存(Memory)后,电脑主板上的CPU将会回到内存(Memory)的0号起始地方然后又从头开始执行程序(Procedures)。 >
有
快活林网友问了,如果计算机的硬盘(Hard)出错会不会电脑死机呢?这个常见问题要这样看。电脑主板上的CPU从计算机的硬盘(Hard)中调入数据(Data)的时候会对计算机的硬盘(Hard)数据(Data)做比较严格的校验(一般是CRC--循环冗余校验),如果校验成功,则不会电脑死机,如果校验失败,电脑主板上的CPU会给予用户提示“校验失败或者文件损坏”--当然也不会电脑死机;只有在计算机的硬盘(Hard)上的文件已经损坏,计算机的硬盘(Hard)把数据(Data)传给电脑主板上的CPU的时候“自己没有发现”造成的数据(Data)混乱。所以,计算机的硬盘(Hard)数据(Data)损坏后,只能造成数据(Data)丢失,无法执行程序(Procedures),也可能无法启动计算机。不过,有一种情况例外,那就是计算机的硬盘(Hard)上的某区域做成的虚拟内存(Memory),如果这个区域损坏是有可能电脑死机。 > 内存(Memory)的启动监测常见问题,计算机在打开计算机的时候会对内存(Memory)进行检测,这种检测的方法不外乎有如下一些: > 1.最简单的检测方法:把内存(Memory)从头到尾读一遍,能够读出数据(Data)便认为内存(Memory)正确。 > 2.稍微复杂一些的检测方法:把内存(Memory)从头到尾读、写一遍,能够读写数据(Data)便认为内存(Memory)正确。 > 3.再复杂一些的检测方法:把内存(Memory)从头到尾读、写数遍能够读写数据(Data)便认为内存(Memory)正确。 > 4.简单的校验检测方法:把内存(Memory)从头到尾读、写数遍,读出的数据(Data)和写入的数据(Data)进行比较,能够读写、并且读的数据(Data)和写的数据(Data)相同,则认为内存(Memory)正确 > 5.比较复杂的校验检测方法:对内存(Memory)读写的数据(Data)同时进行奇偶校验和CRC校验,这种方法多用于高档服务器(Server),同时,能够做奇偶校验的内存(Memory)(ECC内存(Memory))价格比普通内存(Memory)贵10倍以上(不知道为什么或者说怎么会)。