CPU、硬盘、内存与指令

最近加入了一个java学习有关的QQ群,在老师的指导下和大家一起学习。这两周经大家推荐,看了几本有关于计算机基础原理的书籍,例如《编码:隐匿在计算机软硬件背后的语言》, 《程序是怎样跑起来的》等。特此写一篇博客将自己学到的东西做一个整理。
一、从冯•诺依曼体系说起

冯•诺依曼体系结构将计算机分为运算器,控制器,存储器,输入设备,输出设备这五个部分。到目前为止,我们所使用到的计算机基本都是采用冯•诺依曼体系结构所设计的。

采用冯•诺依曼体系结构实现了“存储程序”的概念,即将程序存储在计算机的内存中,从程序的第一条指令开始执行,并根据程序所规定的顺序执行以后的指令,知道程序执行完成。冯•诺依曼体系结构的五个部分可以对应到计算机的不同部件中,见图1:运算器和控制器共同构成CPU;存储器包含内存和硬盘以及CPU中也包含一部分存储器,比如各类寄存器;输入设备如键盘,麦克风等;输出设备如屏幕,音响。

 
图1. 冯诺依曼体系结构
二、CPU
CPU是Central Process Unit的缩写,中文名叫中央处理器。可以认为它是计算机的大脑。如图2所示,从功能上分,CPU内部包括控制器,运算器,寄存器和时钟四个部分。寄存器可用来寄存指令、数据等处理对象。根据种类的不同,一个CPU内部会有20~100个寄存器。控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。运算器负责运算从内存读入寄存器的数据。时钟负责发出CPU开始计时的时钟信号。
 
图2. CPU的内部结构
CPU的两个特点:
1. CPU看似功能强大,但它只能按照程序指令来运行,而且它能够执行的指令也很有限。严格来说,CPU能够执行的指令只有以下四种:数据传送指令,运算指令,跳转指令,call/return指令。图3列出了这四种类型指令的功能。
 
图3. 机器指令的类型和功能
2. CPU的运算速度很快。这个快是相对与磁盘而言的。CPU的速度是硬盘的100万倍。这使得访问硬盘成了限制程序运行速度的一个很大的因素。而加入内存的一个原因就是解决CPU与硬盘速度不匹配的问题,但是CPU的速度还是比内存块,大约是它的100倍。因此除此之外,在操作系统的层面,也采用了一些方法来提升计算机的运行速度。


三、硬盘与内存
硬盘和内存同属于存储器,但两者之间有着不小的差别。硬盘是利用磁效应来实现的,因此也成为磁盘,而内存使用电效应实现的。硬盘廉价而低速,内存则高速高价。除此之外,当计算机断电时,内存中的数据就全被清空了,而硬盘则可以将数据保存下来。
1. 硬盘的物理结构
硬盘的物理构成如图4所示。硬盘有许多盘面构成,每个盘片都有很多一圈一圈的磁道,每个磁道又分为一个一个的扇区。多个盘片上的同一位置的磁道组成了一个柱面。扇区是对磁盘进行物理读写的最小单位。在Windows中使用的磁盘,一般一个扇区为512字节。硬盘中数据的保存,必须以扇区或簇(扇区的整数倍)为单位。当要对硬盘上的某一个扇区进行访问时,需要先找到该扇区所在的磁道,然后找到对应扇区。
 
图4. 磁盘的物理结构
2. 利用内存提升程序运行速度
通过将从硬盘中读取的数据装载到内存中可以加快程序的运行速度。这是根据程序的时间局部性和空间局部性原理设计得到的。
  • 时间局部性:一条被访问的指令,在接下来的时间内很可能在此被访问。
  • 空间局部性:如果一条指令被访问,那么这条指令临近的指令接下来也很可能被访问。

根据局部性原理,当CPU需要读取一条指令或数据时,可以先访问内存,如果内存中有,则直接从内存中读取,否则再从硬盘中读取,并将其加载入内存。

当内存已经存满,有一条新的指令或数据要从硬盘写入内存时,就需要考虑将内存中哪一条指令或数据移除,这就时内存替换算法所需要完成的工作。内存替换算法包括:最近最少使用算法(Least-Recently-Used,LRU),先进先出算法(First in First out,FIFO),随机替换算法等等。


四、指令

接下来聊一聊计算机的指令。首先我们要对指令本身有一个认识。

指令是指挥计算机工作的命令,CPU的工作就是按照指令的要求来进行相应的操作,我们所写的程序,就是有一条条指令所构成的。比如MOV [1000] EAX就是一条指令,表示将地址1000出的数取出来放到EAX这个寄存器中(当然,计算机看到的并不是这样的汇编语言,而是机器语言)。

指令由操作码和操作数两部分组成。操作码是这条指令所要进行的操作所对应的序列号,比如MOV;而操作数是指令执行该操作时所需用到的数据,这里的数据往往是内存地址。不同的指令对应的操作不同,但这些指令的执行过程都必须包括以下三个步骤:

  1. 取指:将指令从内存中取出。计算机中,数据和指令都以二进制不加区分地存放在存储器中。取值阶段将指令从内存中取出,放到CPU内的指令寄存器上。
  2. 译码:对指令进行分析,即确定指令要进行怎样的操作。
  3. 执行:执行指令。

这三步是所有指令都必须包含的。对于有些指令,需要将结果写回存储器中,那么就需要在步骤3后再执行两个步骤,分别是:

4. 访存:得到写回到内存中的地址。

5. 写回:将数据写入内存。

CPU在执行同一条指令的不同步骤时,所需要用到的部件也是不一样的。指令流水就是根据这一特点来提升CPU执行指令的速度的。简单来说就是几条指令同时在CPU中执行,但出于不同的阶段,因此不会造成冲突,从而提高运行速度,减少CPU的空闲率。图5是指令流水一个简单示意图。


图5. 指令流水示意图


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章