程序员的硬件知识

532 阅读9分钟

程序员写出的程序是运行在具体的电脑上的,所以必须要了解一些电脑的知识。首先就要了解硬件,不然就会闹出“为啥不在手机上安装Windows系统?”或“为啥不在电脑上安装Android系统?”之类的笑话。耐心看完本篇,老师会讲解这两个为什么。

程序员应该了解的电脑的知识,具体分为:硬件知识 和 硬件常识 两部分

程序员应该了解的硬件知识

这里包括CPU、内存、硬盘、显示等。 学过计算机入门的人应该知道,计算机硬件分为五大部分:运算器、控制器、存储器、输入部件和输出部件。这里,运算器和控制器就是现在的CPU,存储器指的是内存(手机把它叫运存),输入部件一般是键盘鼠标,输出部件一般是显示器(不论是液晶还是CRT)和打印机,也可以把硬盘算作输入输出部件。咱们一一分解说明。

原本运算器和控制器是分开的,运算器负责作运算,加减乘除,早期的CPU(一直到80386)都只做整数的运算,如果要算浮点数,要不就用一段程序模拟,要不就要额外配个专用于作浮点数运算的辅助部件,它叫协处理器(Intel的叫做80387)。从80486起,两者合并了,也就是说,CPU作浮点数运算可以自己做,无需模拟或辅助部件了。控制器负责作流程控制,意思是,负责控制CPU下一步该执行哪条指令。默认是按顺序从内存中读取下一条,还有个专门的寄存器记录下一条指令的地址,叫IP。

刚刚有人看到,老师说了一个术语,寄存器,不过稍后再给大家介绍这个东西。

CPU的指标很简单,比快,不同类型的CPU,一般是新型号快过旧型号,比如奔四比奔三快、I7比I5快。如果是同档次的呢?那就是高频率比低频率快,比如2.5GHz比2.2GHz要快。这个GHz就是频率,简单的说就是周期,每秒能做几个周期就叫几Hz,然后一千Hz叫一KHz,一千KHz叫一MHz,一千MHz就叫一GHz。CPU的大部分指令都能在一个周期内完成,所以1GHz就意味着这个CPU能在一秒钟内执行十亿条指令。

而内存的指标就不一样了,不光比快,还比容量大。简单地说,电脑里面的内存最小单位是字节(byte),1024个字节=1KB,1024个KB=1MB,1024个MB=1GB,现在主流的电脑大约都是4GB或8GB。速度方面,内存经过了DRAM、SDR DRAM、DDR DRAM几个世代,速度翻了好几遍。

但是内存无论怎么进步,和CPU比,那就是个渣渣(不用担心,还有比内存更渣渣的)。为啥,CPU的核心也就指甲盖那么大,频率又那么快。内存呢?距离CPU至少有几厘米远,而且,频率高不起来。内存频率是多少呢?200MHz,也就是每秒传输最多两亿次……(附:我每秒眨两次眼皮子都能累死我,人家内存每秒传输两亿次,居然被叫做慢成渣渣……这真是,人比人得死,货比货得扔……)有人问,为啥不提高内存频率呢?这个……请仔细看看上面老师说的,内存距离CPU多远?几厘米呢,200MHz已经是极限了。

这下可以解释一下寄存器了,虽然原理和电路都不一样,其实这货本质上相当于内存。可以看作是直接集成在CPU内部的内存,不过每个寄存器的大小仅仅8个字节,而且仅仅只有寥寥十几个,每个都有名字的,比如EAX、EBX等等。但是它足够快,因为在CPU内部,所以它和CPU同频率,并且都能在一个周期内作出反应。内存就不行,如果CPU要去读取一次内存,大约要十几个周期才能得到结果。这好比说,你喊你身边的哥们,它马上(一个周期)就能答应,你喊远方的朋友,必须打开手机、打开微信、找到朋友的头像、点开、发出语音、等对方答应,怎么说都要几分钟吧?寄存器和内存的比较,就是身边的朋友和远方的朋友的差别。

所以CPU并不直接在内存中运算,每次运算,它都要把数据从内存中读入寄存器(如果之前已经因为别的事情提前读入就更好了),然后在寄存器中运算,算完了再把结果保存到内存中。

应该有人看到过CPU的广告,也有人知道CPU内部有高速缓存(Cache),Cache都分等级,一级二级三级,每一级的大小都不一样。这是什么意思呢?前面说过,寄存器之所以快,是因为它就在CPU内部,确切的说,在运算部件旁边,所以能以CPU同步频率工作。Cache也在CPU内部,原理也和寄存器差不多,但是容量略大。一级Cache一般是32KB,二级Cache一般是256KB(有的是512KB),三级Cache一般是1MB(有的Intel的CPU,叫至强系列,最大有8MB的版本,不过死贵,多贵?几万一个……)。它们也在CPU内部,也用CPU的频率工作,但是因为距离(简单说法),它们不能在一个周期内同步响应,大约一级Cache可以在两个周期内响应,二级Cache大约在4个周期内,三级Cache就要8个周期内响应了。一级Cache好比你隔壁的朋友,二级Cache好比同一层楼的朋友,三级Cache好比同一栋楼的朋友,它们都比你身边的朋友反应略慢,但总比远方的朋友来得快。CPU把经常要读写的数据放在这里,这样,如果Cache里面能找到这个数据,就不用再去找内存了,这样可以大大加快速度。

刚刚说过,还有比内存的速度更渣渣的,大家有没有想到我要说谁?答对了,就是硬盘。内存的速度好歹也有200MHz,然而硬盘的速度慢到根本不用频率单位。两者相比,就好比《疯狂动物城》中的兔子和树懒的差别……为啥这么慢的设备,却成为电脑中必不可少的部件呢?因为传输量大。CPU一次只能吞吐8个字节(64位CPU),内存一次能吞吐4KB,而硬盘一次能吞吐的数据量以MB计算。可以这么说,CPU好比空运,速度快但是容量小,内存好比铁路,速度一般但是容量尚足,硬盘好比海运,速度很慢但是容量……海量。

而且还有一点,CPU和内存都是电信号,也就是说,断电(关机)就没有了,下次要重新开始,而硬盘是磁信号(固态硬盘不是),断电没关系,下次再来。大家写好了的程序、作业,当然要保存到硬盘上,这才保险。所以,记得及时存盘,是很关键的。

程序员应该了解的硬件常识

常识和知识不一样,知识是你学会了,对你写程序会有用的。常识不是,但是不知道这些常识,会让你当众出丑的……

区分内存和存储。电脑里面的内存,等同于手机中的运存。手机中的内存,等同于电脑中的硬盘。所以,不要说手机内存64G,而电脑内存才8G这么糊涂的话。手机的内存64G是拿来和电脑的硬盘对比的。

区分内存和缓存。刚刚说过了,内存是个很明确的概念。但是缓存不是,缓存这个名词,可以指CPU内部的Cache,也可以指操作系统中用内存换取硬盘速度的一种做法。也可以指写程序时,用来临时存取的一大片内存(比如一个ArrayList)。

为什么手机上不能运行Windows?因为Windows系统是为Intel系列CPU设计的,手机里面不用Intel的CPU。手机里面使用的CPU是Arm系列,两者的指令集完全不同。(比如01010001在Intel的CPU里面代表加法运算,而在Arm的CPU里面代表减法运算……当然,这又是老师胡诌的,只是个比方而已。)其实,微软曾经出过一个Windows CE/Windows Phone系列,一直更新到Windows 8为止,这个系列是用于手机的,不过仅仅只有微软自己的手机才用它……而且,据说很不好用。

同样的道理,为什么电脑上就不能用安卓系统?第一,安卓系统是为Arm系列CPU设计的,而电脑不用Arm系列CPU;第二,其实也有为电脑开发的Android系统,叫Android X86,结果和上述的Windows Phone类似,很少有人用。

为啥手机和电脑的CPU隔阂这么大?就不能用同一种CPU吗?关键是散热!(给大家一个直观的感受,现在的CPU功率大约几十瓦,买一个25瓦的电灯泡,通电十分钟,自己去摸摸表面的玻璃……然而CPU工作温度最多不能超过120度,一般超过80度就会告警。)电脑的CPU也分台式机CPU和笔记本CPU,同代同型号的CPU,笔记本版就比台式机版性能要差一截,原因就是笔记本比台式机紧凑,导致CPU散热比较困难,于是电压要低一点,功率要小一点,不然就很容易烧毁……(话说二十一世纪初,老师我见过的或听说过的一缕青烟……还真不少……)所以性能就差了一截。你再比比大小,手机和笔记本……假设手机中用笔记本的CPU,要怎么设计散热才能不烧毁呢,设计师要哭了!

慢成渣渣只是老师的夸张说法,是不是渣渣要看谁和谁比,内存大约比CPU慢个十几倍,所以老师说它慢成渣渣;同理,硬盘比内存慢个千倍左右,所以也被老师说成渣渣。但是,哪怕是硬盘,速度也远超过人的反应速度。所以,不要觉得,老师,我写的程序(或者,你教我这么写程序),会不会有性能问题?会不会很慢?

你写的程序,如果能让人肉眼看到运行速度慢,我就把这台电脑吃掉!