电脑死机的时刻 CPU究竟在做什么
大家好,我是轩辕。
前几天,读者群里有人聊起了一个疑问:计算机为什么死机,死机的时刻CPU在干什么?
我想起之前写过这方面的文章,想着预计有不少新粉没有看过,就挖个坟给大家看看,这个幽默又能涨常识的疑问。
电脑死机,应该每个接触计算机的小同伴都阅历过吧。
尤其是早些年,电脑性能还没如今这么高的时刻,多开几个重量级运行程序,死机就能如约而至,就算你把键盘上的CTRL+ALT+DELETE按烂了,义务治理器也出不来,最后只能默默含泪长按关机按钮,强迫关机。
那么,你有没有想过,电脑在死机的时刻,它究竟在干嘛呢?
妇孺皆知,计算机的外围中枢是中央处置器CPU。上过计算机基础课程的同窗都被教诲过:CPU是一根筋死脑筋,只知道不时的取出指令来一条条口头,直到关机方休。
所以通常上,死机分为两种,一种是CPU罢工不干了,不再口头下一条指令了,这属于配件死机,不过这种状况基本不会出现。
更多的是软件层面的死机,也就是CPU被困在了某个中央出不来了,造本钱该口头的程序得不到口头,看起来就是死机了普通。
痴呆的你或者马上想到,假设写一个死循环,把CPU陷在外面出不去,是不是就能死机了?比如这样:
void dead_loop { {}}
你可以试一下,会发现为CPU降温的风扇或者会转起来,但计算机照旧能反常上班,并没有死机。
死循环,CPU不是应该不时在这里转圈吗?难道不会死机?
这就不得不提到一个概念:终止。
终止
终止这个概念,相对是计算机史上最平凡的发明之一。
终止,望文生义,用于打断CPU反常的上班,让它去口头别处的指令程序。
操作系统之所以能够掌控全局,就得益于它启动时给CPU安插的一系列的终止处置函数(比如咱们最经常出现的时钟终止),好让操作系统能周期性的收回CPU的口头权,调度别的线程来口头。
所以,即使你某个线程进入了死循环,在你的期间片用完之后,也得乖乖交出CPU,让别的程序来口头。
想用一个死循环就把电脑搞死机,那人造是无法能的。
其实想来也是,假设这么容易就给你搞死机了,那这操作系统也太菜了吧,新手假设刚学编程,还不得一天强迫重起电脑十几回?
退一万步讲,就算不思索终止的影响,如今的CPU大都是多核,一个线程进入死循环,但还有别的核可以介入系统调度,也依然不会死机。
那么回到开局的疑问,那究竟CPU被困在了哪里出不来,连终止都拿它没方法呢?
其实有两种状况:
1、终止确实拿它没方法
很多人都知道终止的概念,但很多人不知道,终止也是有优先级的。
这很容易了解,比如CPU正在口头程序,突然出现了一个终止事情。CPU保留好口头的高低文,转头去处置这个终止事情,但刚处置到一半儿,这时又有一个新的终止事情来了,那CPU怎样办?要不要照应?
所以终止也有优先级之分,低优先级的终止无法打断高优先级的终止。
有了这个前提来试想一下,假设由于操作系统内核代码写的不当,在处置某个终止的时刻堕入了死循环,比如自旋锁,会出现什么?
由于在处置终止的时刻,CPU运转在一个很高的优先级上,普通的终止是无法把口头权抢过去的,这就造成这颗CPU外围成为了“植物人”,怎样叫它都没反响了。
2、终止能抢到CPU,但发现没有线程可以调度
程序员们对死锁这个概念应该不生疏,两个线程A期待B,B期待A,两个线程相互期待对方退让(监禁锁),构成僵持局面,最后成为死锁。
假设死锁出当初运行层面,那疑问不大,最多就是两个程序死了。但假设出当初内核呢?
比如在Windows操作系统内核中,就有少量的全局性的锁,一个不小心形成死锁,其余想要的线程都得进入期待队列,那就凉凉了。
援用一段另一位大神Tim Chen的形容(我感觉特意笼统):