电脑死机的时候到底在干什么? 财富值24

2016-10-04 18:58发布

电脑死机的时候到底在干什么?
10条回答
坦克T安康
1楼 · 2016-10-04 19:15.采纳回答
说一个故意死机的情况,比如某大公司游戏主机产品启动时bootrom负责检测下一段代码的合法性,如果不行就要panic,关闭bootrom防止代码泄露然后锁死CPU防止强行dump,这是彻底的锁死,理论上必须断电复位才能恢复
那么接下来问题来了,如果关掉了CPU,下一个指令没法执行,怎么关掉rom呢?
如果关掉了rom,下一个指令没法读取,怎么关掉CPU呢?
于是大厂很机智的:
FFFFFF94  B880080080        mov eax,0x80000880 FFFFFF99  66BAF80C          mov dx,0xcf8 FFFFFF9D  EF                out dx,eax FFFFFF9E  EAFAFFFFFF0800    jmp dword 0x8:0xfffffffa ... FFFFFFFA  80C204            add dl,0x4 FFFFFFFD  B002              mov al,0x2 FFFFFFFF  EE                out dx,al 

想法很好,跑到EIP最顶端把rom禁用掉,然后EIP就会溢出,抛exception,这时候啥都没有,没人接exception,机器就死那儿了,我真是太机智了

然后投产之后没几天就被破解了,因为样机用的是AMD的芯片,EIP溢出会exception,然而量产机改用intel芯片,这货在EIP溢出的时候会
开开心心的绕回0x00000000接着跑

于是就造成了业界闻名的死机未遂事件
硕是我宝贝
2楼-- · 2016-10-04 19:13
诸如:假如我是一台电脑之类的问题,我最喜欢回答了!
毫无疑问会有多种可能导致电脑死机。
前几年台式机还比较普遍的时候,随着金手指氧化或电容器爆浆等状况的出现,就经常发生情况1:硬件接触不良导致的死机。正在玩的开心,突然内存条由于供电不良或信号不良脱离了系统,这简直相当于活体摘除器官啊,而且摘除的还是大脑核心记忆区,此时电脑在干什么?什么也没干,因为没有大脑了!一片空白,甚至连一句what the fk都来不及说!直接蓝屏没商量,只对电源键有反应。

好吧,这种硬件故障现在已经不常见了。下面才是当今最常见的死机。

现在从电脑工作的过程来分析究竟卡在哪里?
从打开知乎网页说起。首先,你双击浏览器,电脑开始从硬盘里把浏览器这个程序拿出来,放到内存里面去,内存相当于是流水线,只有上了流水线,浏览器才算是可以工作了。表现出来就是,双击浏览器之后,等了大约一秒多,浏览器就被打开了,你也能看到主页了,这一秒多的时间,就是浏览器从硬盘中被读出的时间。然后你输入了知乎的地址并按了回车,在经历过一系列网络协议和数据交换,知乎首页的html代码被发送到浏览器上,浏览器请求CPU对这些代码按照它的规则进行解析,CPU开始无条件付出劳动力进行解析工作。解析的结果就是你在这个浏览器中看到了知乎的界面。
电脑卡顿的时候就在做一件事:等。因为它要按流程办事,一旦某个环节出现了过忙(其实还有线程锁等很多很复杂的情况哦)的状态,那么其它环节就只能等,表现出来就是电脑呆瓜了。
情况2:CPU负荷满载导致卡顿或卡死。
你可以查看任务管理以获取如下信息:谁占用了我的劳动力(cpu)?谁占用了我的流水线(内存)?谁占用了我的仓库(硬盘)?如下图:
在这里可以看到CPU占用最高的是一个Idle process,其实不是它在占用啦,它是告诉你电脑里还剩下多少空余劳动力,这个数值越大,你的电脑越清闲。如果它的值为0或其它个位数,我相信此时你已经能明显感觉到卡顿或死机了。此时电脑在干什么?在拼命为其它应用提供服务,没空理会“解析知乎网页html”这个工作,你的感觉就是这啥破电脑开个网页都卡。
在任务管理器这个界面可以看到是谁让爱机拼命干活,然后终止它,效果立竿见影,电脑马上不卡了。
情况3:内存占用过多导致卡顿。这个经常出现在小内存(小于4G)电脑上开了大量网页的时候,内存被网页缓存大量占用。而电脑干活之前要先把事情放在流水线上一字摆开才能开工。此时你的流水线被占用,其它的事情就只好等一等啦。你的感受就是卡顿,电脑不对各种操作不响应。OK,在上图中可以看到各进程对内存的占用,你可以找到罪魁祸首,然后结束它。

情况4:硬盘读写占用过多。你的很多操作都跟硬盘读写有关哦。比如打开浏览器,过程就是把它从硬盘中读出并写入内存。如果迟迟读不出,也就没法打开这些软件,给你的感受就是又卡了。硬盘被谁占用了?假如你的电脑里只有一块硬盘,而且是机械硬盘!而此时你在用迅雷下载东西,下载速度又能达到2M/S以上,试试吧,是不是硬盘灯狂闪,而且你感受到系统明显慢了?
好了,现在你大致明白是什么导致你的电脑卡顿或死机了,其实死机就是一种深层次的卡顿,不是吗?
当然还有很多其它情况导致死机,比如病毒啦,系统故障啦,这种死机一般是“硬性死机”,就是彻底死机了,无论等多久都不会活过来了,好像跟题主描述的死机不是一种类型,所以就不多说了。
针对你的疑问为什么现在(2015年)的电脑还是会出现卡或者死机的情况? 当今电脑的性能比之前好了很多,但是吃性能的软件也多的多了,2008版QQ安装包是26M,当前的QQ是53M,而且我相信新版QQ对电脑性能的需求绝不止老版的2倍。我有一台老电脑,当年聊着QQ听着歌下载着电影还能浏览网页,现在不行了,卡的很。电脑没变,系统也是刚恢复的,但是软件安装的是新的。这个问题使我想起了另一个问题:平地起高楼,住房总面积越来越多,人口也没有显著增加,可为啥买个房子还这么难?
当然,软件对性能需求增高是因为提供了更多的功能,更好的安全性,更好的外观等。
取名锌煜
3楼-- · 2016-10-04 19:11
这个问题,详细回答的话可以写一本书了。。。所以就挑重点吧。这里只讨论Windows系统。

首先软件还是硬件,说实话我见过也不知道所谓硬件死机是怎么一回事,难道是CPU停止执行下一条指令了?当然我并不熟悉硬件方面的东西,只能说真*硬件死机在我的知识范畴之外了。

抛开硬件死机,我们可以认为CPU总是兢兢业业地根据当前EIP的值来执行下一条指令。那么大部分我们见到的死机,发生时其实CPU还是在不停地工作的,只不过由于某些原因没能执行到用户所期待的代码。

最简单也是最厉害的就是当前CPU在执行于某个高IRQL的时候出不来了。IRQL是决定CPU执行代码的优先级,大部分的Windows及应用程序的代码都执行在DPC级别以下,而像中断处理代码则执行在DPC以上。那么如果某个CPU在执行一个中断处理的时候,由于代码原因死循环了,比如自旋锁永远自旋出不来了,这个CPU就废了,不能再执行更低IRQL的代码。只有更高级别的中断才能把这个CPU抢过去。

DPC级别以下,基本上就是通过我们熟悉的线程来执行各种代码了,而线程之间基于线程优先级来决定先执行哪个线程。这里包括内核态执行的线程和用户态执行的线程。大部分我们见到的“死机”,其实都是在这个级别“死”住的。

那么一个线程为什么会死住,以及他是如何影响到其他线程的呢?这里主要就是由于Windows的各种复杂的同步锁机制。最常见的现象,线程1在等某个锁,这个锁由于某种原因一直没被释放,那么线程1只能一直等下去。然后线程1可能自己拿了其他的一些锁,那么这些锁也无法被释放,其他在等这些锁的线程也会被迫等待。就这样连锁反应,最后大部分的线程都在等锁,你就看到“死机”了。

这种一般出现在内核态的锁,比如著名的registry lock,一旦某线程拿到注册表锁之后死住,其他所有企图访问注册表的线程都会死掉,那基本上就都死了。

而在用户态,一般来说用户态的锁只会影响当前进程,也就是最多你会发现某个程序死了,窗口发白,但是其他程序还正常。但是也有些用户态的锁是跨进程的,比如以前见过wininet里面的一个锁,所有进程共享,一旦锁住之后,所有进入到wininet操作的线程都会死掉。

然后说下为什么一个锁会死掉出不来,这基本上都是软件代码的bug。最经典的deadlock,A等B,B等A,永远出不来。这事只要学过一丁点计算机基础就都明白,大家都知道要按固定顺序加锁。然并luan,在实际代码中各种锁的关系实在是太复杂了,或者说整个Windows的代码实在是太复杂了,程序员很难保证所有的锁都是按固定顺序获取,这种bug真心在所难免。比如像著名的loader lock,就是每次载入dll时候要拿的锁,由于各种程序员写的dllmain里面做的那些奇奇怪怪的事情,这家伙和别人发生死锁的概率实在是太高了--就算你在MSDN里面写的再明白也没有用。我并不是在说小白程序员,就连windows内部的某些dll还是有过不少与loader lock死锁的问题,当你的代码复杂了之后真的会想不清楚锁的关系。

其实这时候windows在最核心的线程调度方面,还是在正常工作的。只不过发生的情景是这样的:

调度代码开始调度:线程A,你来执行吧。
线程A:我不行啊,我在等锁。
调度:线程B,你行不行啊?
线程B:我也不行啊,我在等A。
调度:还有谁现在能跑的?
。。。。
某线程X小声地说:我可以。
调度:你谁啊?
线程X:我就更新下系统时间的,打打酱油,不用等锁。

用户:草,又死机了。
取名锌煜
4楼-- · 2016-10-04 19:08
在处理一些事情
Jane爱丽
5楼-- · 2016-10-04 19:17
死机,是为了保护你。

死机时,往往是计算机检查到有什么不可恢复的严重故障。这个时候,最明智的作法就是死机,让CPU进入死循环,什么也不做,等待用户复位 CPU(重启)。

想想看,如果发生了极其严重的不预期的现象(比如说往内存里写个东西,读出来却不是它,或者分明应该跳转走却执行了后面的语句),那就一定是不知道哪里出故障了,谁知道这个时候 CPU 会乱干些啥事情。万一不小心往你的硬盘乱写了啥数据呢,你不就呵呵了?所以这个时候最正确的作法就是赶紧死机,别出啥别的问题。
硕是我宝贝
6楼-- · 2016-10-04 19:08
在做一些羞羞的事情。
坦克T安康
7楼-- · 2016-10-04 19:21
A做糖醋里脊,B做糖醋排骨
A用酱油,然后把酱油锁了起来
B用醋,然后把醋锁了起来

A跟B说,给我醋
B说,老子没做完糖醋排骨之前谁都不能动醋
B跟A说,给我酱油
A说,老子没做完糖醋里脊之前谁都不能动酱油


A跟B说,给我醋
B说,老子没做完糖醋排骨之前谁都不能动醋
B跟A说,给我酱油
A说,老子没做完糖醋里脊之前谁都不能动酱油



A跟B说,给我醋
B说,老子没做完糖醋排骨之前谁都不能动醋
B跟A说,给我酱油
A说,老子没做完糖醋里脊之前谁都不能动酱油




CPU:我特么不干了

一周热门 更多>