我们绝大多数计算机都遵循着冯诺依曼体系,即一整套计算机设备中,一定是由输入设备、存储器、运算器、控制器和输出设备构成。
其中:
①存储器指的是内存,而内存有一个特点,那就是掉电易失。存储器的作用是临时存储
而磁盘,拥有永久性存储能力,但是磁盘不属于内存,它是属于外存,但是在冯诺依曼体系中,没有外存这个结构,只有外设!因此,磁盘属于外设,外设指的是冯诺依曼体系中的输入设备和输出设备。外设这个词,是相对于内存+cpu而言的。外设的作用是永久存储
其中,磁盘和网卡,即属于输入设备,也属于输出设备。
②运算器+控制器+其他(cache,寄存器等)=CPU——>俗称:芯片。其特点就是快(各方面)
CPU的作用是计算。
对比:
cpu | 快 |
存储器 | 较快 |
外设 | 较慢 |
既然CPU的作用是计算,那么CPU其实很笨,它只能被动的接受传进来的指令和数据,然后去执行指令,达到计算的目的。
在接受指令前,CPU必须认识这个指令。那么CPU怎么样地去认识指令?答案是CPU拥有自己的指令集,指令集以硬件的形式存在CPU中,相当于有自己的一本字典大全或是词汇。所以我们在写代码的时候,编译的本质就是将代码变成二进制可执行程序后,成为可以让CPU认识的指令,那么在传入CPU,让CPU计算的时候,CPU就翻自己的指令集,找到了相对于的指令,就可以进行处理了!
CPU的数据从哪来?
从内存或外存中来。但是CPU是个急性子,因此给数据的那一方不能慢,也不能太快。我们由木桶原理可知道,木桶能装的水的多少,取决于最短的那块板。因此,CPU与其它设备合作的时候,它们的速度,取决于较慢的哪一方。所以,CPU就是在存储器内存中拿。CPU在读取和写入数据层面只和内存打交道,主要是为了提高整机效率。
内存天然就有数据吗?
并不是!我们计算机中的数据,在磁盘上(不谈光盘之类的)!如果CPU每次要处理的数据,都得先让内存从磁盘中读取写入,那么效率很低。所以,数据在CPU要之前,操作系统在我们开机的时候,就将CPU将要处理的数据,从磁盘上加载到内存中。操作系统就是在这里做出决策的(需要预处理的数据有多少,当不用的时候怎么清除,清除多少等等决策)
当把内存中的数据搬到外存中去,和把数据从外存搬到内存中去,这个操作,我们就称为IO过程。(INPUT/OUTPUT)
所以,我们如今平常使用的计算机,就是硬件和软件的完美结合。
结论:在数据层面
1.CPU不和外设直接打交道,和内存直接打交道
2.所有外设,有数据需要载入,只能载入到内存中;内存写出,也一定写到外设中。
也就是说,CPU只和内存打交道。
那么,这里就能解释一些现象了:
程序要运行的时候,为什么必须要加载到内存?因为CPU要执行我们写的代码,要访问数据,而我们写的代码是在磁盘上的,所有,必须要把程序加载到内存,CPU从内存中获取。(体系结构规定!)也是为了提高效率。
上面所说的,都是数据层面的。
在控制上面,CPU与外设有打交道,这会在往后的文章中补充。
对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上
现在来看一个具体的实例:
假设我和我的一个朋友,一个在广东,一个在北京,那么我们在QQ聊天上,打出了一个"你好",那么数据流是如何在不同的电脑中流动?(这里不考虑网络)
是这样的:我在键盘上输入"你好"后,数据就会传到内存中进行加密处理,然后将数据一式两份,一份在我们自己的显示器上显示出来,另一份通过网卡,再通过网络,传到了我的朋友的网卡中,此时他的网卡的角色是输入设备,然后数据由流到他的内存中解密后,最后显示再他的显示器上面。
我们联系的前提是:打开登陆了我们各自的QQ程序,我们的QQ程序加载到了内存中,然后CPU执行QQ程序的代码,执行上面的流程。
那么如果不是打出"你好",而是发送文件呢?
其实文件无非就是体积大了点的"你好",文件从磁盘中搬到内存中(磁盘到QQ程序,然后到内存),然后通过加密,传到对方的输入设备(网卡),接着就是上面所述的操作了。
其实就跟我们在写代码的时候,使用scanf或者cin,从键盘输入,然后读到了我们程序的内部(内存);
最后,这里简单地介绍和解释一下冯诺依曼体系,为后面学习操作系统做好准备工作。