linux基础篇之vmware workstation计算机体系结构(上)

      一列开往洛斯阿拉莫斯小镇的火车疾驰而过,在风尘仆仆的旅客中,有一名中年男子显得尤为特别。他西装革履,头发梳得一丝不苟,时而自言自语,时而奋笔疾书,细看纸上,字迹潦草,图表凌乱,然而,正式这份看似涂鸦的手稿,却奠定了现代计算机的体系结构,这就是计算机发展史上的里程碑,101页报告,而这位中年男子就是博弈论之父,现代计算机体系结构之父,冯诺依曼。

    冯诺伊曼在前人研究的基础上,进行了总结,形成了现代计算机的理论结构,目前我们生活中,几乎所有的电子产品,都是基于这个结构的,比如手机、笔记本电脑、台式电脑、小型机、服务器、电子表等等。

   我们大家都知道,计算机由五大部件组成,那么分别都是什么呢?计算器是吗?或者叫运算器,我们把它称为叫calculator,运算器实际上是进行数学运算的,它一般只能进行加法运算和逻辑运算,但是我们知道减法、乘法、除法等运算可以转换成加法和逻辑运算对么,所有运算器通常是由加法、逻辑运算器组成的。那么,大家有没有想过这样一个问题,我们的计算机,一个电子设备,为什么会进行运算?将来找时间给各位解释下这个问题,现在只要知道这个是个运算器就行了。

   还有个控制器对吗?其实,运算器和控制器这两个合起来就叫做CPU,对吗?虽然还有寄存器、缓存等等,这么说不够精确,但实际上就是这么回事。还有存储器、输入设备和输出设备,运算器负责运算,控制器负责运算器从哪里获取数据和存储数据,运算器从存储器里面拿到数据以后进行运算,然后将运算结果放到存储器里面。它从什么地方读取,从存储器的什么位置读?运算完成以后放到存储器的什么位置上去,思考过这个问题没有?

   内存是用来干什么的?CPU是怎么知道去内存的什么位置上读取哪一个数据的,我这里提到的存储器指的是内存,那么内存是一个什么设备?内存是一个编址设备,这个编址设备的每一个存储单元由八位组成,称为一个字节,每个字节都是有地址的,那么什么是地址,我们网上购物的时候填写的收货地址,某某市,某某区,某某项,某某号,内存也是这样的,它里面有很多的存储单元,每一个存储单元都有一个能够独立引用它的标识,这个标识就是内存地址,内存地址是平面编址的,简单理解下什么是平面编址,一个学校有很多学生,给每个学生一个编号,那么这就是平面编址;那么相应的什么叫三维编址?把这个学校分成不同的班级,在每个班级中再进行细分,比如给每个学生一个班集的编号,比如 1班的1号,2班的1号 等等,这个是三维编址,这个能明白吧。内存的每一个存储单元在全局上都有一个唯一标识的地址,在计算机里,我们使用数字的方式来对内存的存储单元进行引用。这个是我们的存储器,但是为什么要用到这个存储器,这个很容易理解,运算器、控制器、存储器其实是我们计算机最核心的三个设备,缺一不可。

   大家思考这样一个问题,运算器是如何实现运算的呢?我们知道组成运算器的一个最基础的设备叫加法器,加法器有全加法器和半加法器,那么加法器是如何进行加法运算的呢?

   大家都知道我们的计算机只能识别二进制,不能识别十进制,我们为什么不能让计算机识别十进制呢?那么首先我们就要搞懂,计算机是如何识别数字的,比如,0到9,这个10个数字,想在计算机中标识它,我们该怎么标识呢,比如我用0伏电压表示0,用1伏电压表示1,用9伏电压表示9,这样是不是可以呀?但是这样会带来一个问题,就是我们的电路是有电阻的,比如我给他4伏的电压,但实际的电压只有3伏,这样是不是就不准确了,有问题了呀,其实整数还好一些,如果是小数呢,那就更麻烦了,更复杂了吧?但是二进制就不一样的,我们可以用没电表示0,用有点表示1,这样会大大降低了计算机本身设计上的复杂度,这就是我们计算机为什么使用二进制的原因。

  在我们了解计算机只能认识两个数字,一个是1,一个是0后,我们再了解下布尔代数,1能一般表示高压,比如说5伏左右,我们记作数字1,而第二种呢就叫做低压,低压能就是0伏左右,我们把它记作数字0,在布尔代数里面有这么几种比较常见的运算,如下图,比如我们输入两个信号,一个是A,一个是B,有一种运算叫A 乘以B,这个叫与运算,什么叫与运算呢,只有A跟B都输入1的时候,输出才是1,其他情况下输出都是0;还有一种运算叫或运算A+B,叫或运算,它的含义是,如果A和B有一个是高电压,结果就是高电压,所以输入都是1时,那么输出就是1,输入有一个是1时,那么输出也是1,只有都输入是0时,输出才是0;还有一种叫非运算,上面加个横线,\bar{A},非运算的意思就是加入A是1,那么它输出就是0,如果A是0,那么输出就是1,这是三种基本的布尔代数运算,当然布尔代数运算非常复杂,为什么要讲这个呢,因为他是可以通过基本的门电路实现的,

                      1高压(5V)“1”  2低压(0V)“0”B

ABABA+B\bar{A}
11110
10010
01011
00001

   我们来说一下门电路,门是数字处理中一个很重要的原件,门可以实现很多的功能,比如与运算,那么与门是这样的,如下图,有两个输入,一个是A,一个是B,中间经过与运算,用&表示,输出的就是A和B的与运算结果,如果A和B都是高压,那么输出就是高压,

                   

   那么与门代表什么含义呢?我们打个比方,如下图,两个开关串联在一块,闭合了代表高压,然后呢,这有一个灯泡,外面再接一个电池,此时只有A和B都闭合的时候,灯泡才会亮,这个逻辑关系就是与,

   那么逻辑或是什么样呢?如下图,两个输入,一个是A,一个是B,用\geqslant 1表示,输出就是A和B的或运算结果,只有A和B有一个输入是高压,那么输出结果就是高压,

   那么我们大家想一下,如果我们用电路来表示它,会是什么样的?如下图,两个这个开关是并联的,再接一个灯泡,这种情况下只要开关中有一个是闭合的,灯泡就会亮,

   那还有一种门呢,叫非门,如下图,非门呢,写成=1,输出的前面加个圈,它的含义是什么呢?就是输入等不等于1,等于1就输出0,不等于1,就输出1, 所以是这个意思,

   那么非门用电路表示呢,是这个样子,如下图,开关和灯泡并联,然后再加一个电阻,再加一个电池,此时,如果开关是断开的,灯泡会亮,输出是1,如果开关是闭合的,灯泡会熄灭,也就是输出是0,

   除此之外还有一种特殊的门,叫异或门,就是A与B不同的时候,输出才是1,它的表示方法是这样的,如下图,也就是A和B加起来正好等于1的时候,它的输出才是1,否则输出就是0,只有当A和B中有一个是1一个是0的时候,输出才是0,否则A和B都是1或者都是0的时候,输出都是0,异或门可以通过上面三种门来实现,(A&非B) 或 (非A&B)这个公式就等于异或门。

   讲了这么多,那么到底这么处理数字信号呀,我们先说一个最简单的一个问题,比如说加法,我们现在想把 111和101 两个二进制加起来,加起来之后结果是什么?1100对吗?1+1等于0,所以产生进位,1+0等于1,再加上前一个进位后等于0,所以又产生了进位,1+1等0,再加上进位,所以是1,所以结果是1100。那么计算机是如何实现这个过程的呢?首先我们要区分这两个事,111这个数的右边第一个数1,我们称为Ai,101右边第一个数1,我们称为Bi,Ai和Bi我们称为本位,Ai+Bi的结果0,是新的本位Si,那么这里还有一个进位的1,叫进位,我们把它写作是Ci,也就是我们想通过两个本位相加,计算出新的本位,和一个进位,这叫一位数的加法,于是我们就要想到一位的加法器也就是半加法器是怎么实现的呢?两个数相加,什么时候才能得到一个1的本位呢?那很显然,1+1等于0,0+0等于0,只有0和1相加,或者1和0相加,新的本位才能取1,所以呢,新的本位实际上应该就是一个异或门,如下图,两个输入一个是Ai,一个是Bi,然后输出一个新的本位Si,好这就是第一步,我们把本位求出来了,

   那什么时候会进位,只有Ai和Bi都是1的时候才会进位,所以我们应该取一个什么门?我们应该取一个与门,如下图,这个就是进位,这样我们就实现了一位数的加法,但这只是一位数呀,我要实现三位数相加怎么办?就需要全加法器,把一大推半加法器进行改进,然后再串起来就形成了一个全加法器,可以进行加法,当然,我们运算器的处理远远不止加法这么简单,所以在一个CPU的内部是非常非常复杂的。

   好,各位想象一下,我门使用一个加法器,是不是要给让输入数据呀,输入加数、被加数,如果像上面的开关那样,输入1就闭合开关,输入0就断开开关,手动的搬它,是不是很麻烦、很慢呀,那怎么办呢?我们希望将数据以一种方式保存到一个额外的位置,能够让我们的运算器读取这些数据,并且将运算结果进行保存,我们的内存里面放的就是这些数据,这些数据我们可以理解为是电压,可以理解为,这些数据可以转换为电压,转换成电路信号,把磁信号转换成电信号,我们都知道电和磁是可以互相转换的,对么,其实发电机就是这个原理,所以运算器进行运算的时候,需要到内存里面读取数据,存储器里面可以存放很多很多的数据,哪个是我们数据的存储地址呢?之前说过,程序是由数据和指令组成的,指令会告诉CPU在存储器的哪个存储单元中存放的是加数和被加数,所以CPU会先读取那个指令,指令是立即执行的,而且指令里面还有可能带有立即数和间接数,那所以运算器要想进行运算,就必须得先读取一个指令,这个指令会告诉我们的运算器要读取的加数在什么地方,被加数在什么地方,那么谁来控制去读呢?接下来就需要我们的控制器进行协调,到我们存储器的某一个存储单元里面把数据给他读取出来,放到运算器上,这能理解么,这就是我们的控制器,那所以控制器需要接受指令,各位应该明白,运算器要想进行数据运算,得先获取数据才行,那么运算器获取数据的线路我们理解为数据总线,控制器获取控制指令的线路我们就理解为控制总线,控制器会控制运算器到存储器里面的什么位置上读取数据,所以运算器读取到了数据,控制器再控制运算器进行什么样的运算,所以运算器进行了运算,那么运算器的运算完之后,是不是有结果,这个结果放到存储器的什么位置上,由控制器来进行指示,控制器会知道内存中那一段是空闲的,然后找到一个空闲的存储位置,把数据存放到内存里,这些操作都在我们运算器、控制器和存储器之间完成。但是我们知道,存储器初始的时候是空的,里面什么都没有,因为内存是易失性的存储设备,对吗?那所以,事实上,作为用户来讲,我们任然需要将执行程序给他放到存储器里面,然后你的控制器和运算器才能读取到数据和指令,对吗?那么就需要一个外围设备,一个外围的辅助设备,把我们的程序,也就是数据和指令给他存放到储器里边,从而运算器和控制器可以在存储器里面读取。还有,我们输出结果任然保存在存储器里面,一断电,存储器里面所有的数据都将丢失,那么这个时候,我们可能需要保存在外置的地方,或者至少能够通过显示器把它显示出来,那么显示器就是一个输出设备,其实对于我们计算机而言,核心的只有三个,运算器,控制器,存储器。输入设备和输出设备使用来干什么的,是用来跟用户交互的,是用来辅助计算机的运算。那么像这种跟计算机外围设备打交道的我们把它称为输入输出设备,也有一个称呼叫IO,IO设备的I就表示Input,O就表示Output,这就是输入输出的基本的概念。

   计算机的五大部件,他们是如何进行协调的?假设我们的加法器,由两组线,一个是用来传输加数,一个是用来传输被加数,这需要多少根线呢?如果我们进行32位的加法运算,那就意味着我们需要32根线来传输加数,再用32根线来传输被加数,对吗?那如果我们这样设计计算机的话,你想,它里面得有多少根线?是不是很麻烦呀,那么我们能不能用一根线,它既能传输加数,又能传输被加数,还能传输控制指令呢?这样是可以的,但是我怎么知道它里面传的是数据还是指令呢?CPU中有一个控制位,告诉你,如果这位是0,它传输的是数据,如果这位是1,它传输的是控制指令,这叫线路复用。那现在我用一组线,而不是两组线,那么就带来了另外一个问题了,我把加数传进来,再传被加数,那么之前的加数放哪?获取被加数的时候,加数放在那里,如果不放起来的话,那么加数就没了,就像我们的大脑一样,是可以记忆的,所以必须得有个地方把这个加数给他存放起来,我们接收到加数后,把它暂存起来,就是第一个数据给它存下来,对不对?那么这个就是寄存器,寄存器其实是个暂时的,临时存储一下的设备,CPU的核心组件,运算器、控制器、寄存器,当然,大家应该还听过,我们的CPU还有一级缓存、二级缓存,这些是另外的概念,我们以后再说,它其实不是CPU的核心组件,但事实上决定了CPU的性能。

   我们先理解这些基本的概念,那么虚拟机是什么,说白了就是用软件的方式模拟实现了一个运算器,控制器,当然,它可能会结合我们的实际硬件去完成,抽象出来的,模拟出来的,所以把它称为叫虚拟机,当然,虚拟机它不可能随意的虚拟,凭空去虚拟一个计算机是不可能的,它必须借助实在的物理设备才能虚拟。

   记得我们之前提到的上电自检么,那么上电自检到底是怎么实现的,我们的CPU想执行指令,这个指令必须在内存中,事先放好了,它才能执行,开机的那一刻,它不知道有么有键盘,有没有显示器,从哪里读入数据,又到哪输出数据,而内存又不能事先保存这些数据,那放到上面地方呢,需要借助于额外的设备,叫ROM,我们知道存储器,我们称为叫RAM,对吗,叫随机访问存储器,对吗?那ROM是什么呢?叫read only,只读存储器。ROM里面是什么?就是适用于这台计算机的一推指令,这些指令能够映射到内存里面去,它是一个小芯片,这个芯片里面存储的指令数据不会丢失,即使断电了也不会丢失。开机的时候,你的计算机会自动的,注意这个自动是硬件逻辑完成的,是通过计算机芯片的硬件逻辑完成的,会自动将芯片中的那些程序给它映射到我们的内存中,在内存的最低端,最开始的一段,我们cpu的控制器和运算器就会读取这一段的指令数据,能明白么?这段指令数据是干什么的,这段指令是用来干什么的,就是用来告诉你的计算机去探测有没有键盘,有没有显卡,有没有网卡等等,各种的硬件设备,这个过程就叫做上电自检。

   我们的硬盘是外围的IO设备,它既是输入设备又是输出设备,鼠标、键盘是输入设备,显示器、网卡是输出设备,那么思考这样一个问题,我想从硬盘中读取数据,那么我怎么通知硬盘而不是键盘,又比如,我想输出数据的时候,怎么告诉我们的计算机输出到一个硬盘,而不是通过网卡向外发数据?那么多的设备,我的核心怎么和外围的IO设备打交道?那比如说通过一根总线,不管怎么讲,这些设备都能连进来对吧,这一根线上有跟多跟多设备,那么在某一个时刻,哪个设备上来了数据,你敲一下键盘,这个键的信息输出给谁,怎么知道,敲键盘的动作是随机的对么,什么时候敲一下都有可能,那CPU怎么知道你敲了键盘?CPU为了直到你是否敲了键盘,它每个1毫秒就去查看一下,是不是可以,但是如果你一天都没有敲键盘的话,那么这每一秒的查看,是不是一种浪费了?同样鼠标是不是也是一个道理,那因此我们让CPU不断的去查看的这种机制叫轮询,叫pull,但是效率太低了,那怎么办呢?CPU现在不去查看了,当有敲击键盘的时候,就去通知CPU,告诉CPU有人敲键盘了,这样是不是就好多了,这个时候CPU停下手头的工作,去键盘上看看到底干了些什么事情,这过程就叫做中断,叫interrupt,中断我们可以把它理解为是一种硬件通知机制,那么各位想这样一个问题,当中断发生的时候你的CPU怎么知道是键盘还是鼠标,很简单,通过一个芯片,其实在我们计算机的内部有一个芯片,它称作可编程中断控制器,这个控制器跟我门CPU的针脚是相连的,CPU通过这个控制器知道是哪个设备,这个控制器上有很多根线,每一根线表示一个设备,也可以这样的简单理解,比如说我这有20根线,第一根线专门用于鼠标使用,第二根线专门用于键盘,如果某个事件在第一根线上发生,那么就明确知道这是鼠标的,能理解么,这种思想将来在很多地方我们都会用到,那么,因此我们的CPU结合中断处理器进而知道到底是哪个设备上发生的工作,但是我们知道硬件设备的线路到底能有多宽,总是有限的,如果我们接入的硬件设备非常的多,比如硬盘,它需要中断控制器,因为硬盘它也需要中断,对吗?那如果我对接100块硬盘呢?其实在服务器中接上百块硬盘是很常见的,这并不是什么特殊的情况,那假如我接了100块硬盘,那是不是说就需要100根线呀?这恐怕对于计算机的设计而言,恐怕是难以想象的,对不对?那怎么办呢?我们可以在一根线上分别标示多个不同的设备,就是所谓的中断向量表,这个东西我们现在不深入去讲,以后的课程中用到的时候,会详细的去了解,目前知道是什么东西就可以了,各位要明白,我们的外围IO设备是通过不停的中断来跟CPU或者我们的计算机核心进行交互的。所以各位想一想,如果中断的次数多了,那么我们CPU的性能,主机的性能是提高了还是下降了?下降了,那也就是说中断越少越好,但是没有中断行不行呢,不行的,如果我们服务器非常的繁忙,那就意味着我们需要通过网卡接收别人的请求数据,然后响应数据给对方,那么网卡上会产生很多的中断,2万个中断是很正常的,2千个就更甭提了,当每秒可以中断2万次的时候,你的服务器的CPU为了处理中断,可能就已经忙不可了,好,这是我们的各种外围设备、IO硬件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值