计算机原理(一)

您所在的位置:网站首页 计算机工作的基本原理是 计算机原理(一)

计算机原理(一)

2024-03-23 06:59| 来源: 网络整理| 查看: 265

计算机基本原理        现代计算机,大部分都是基于冯诺依曼体系结构,而我们这里谈论的也是此问前提。冯诺依曼的核心是:存储程序,顺序执行。所以不管计算机如何发展,基本原理是相同的。计算机程序实际上是告诉计算机做什么  冯诺依曼体系结构

冯诺依曼体系结构有以下特点:

计算机处理的数据和指令一律用二进制数表示;指令和数据不加区别混合存储在同一个存储器中;顺序执行程序的每一条指令;计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。

冯诺依曼体系结构的计算机必须具有如下功能:

把需要的程序和数据送至计算机中;必须具有长期记忆程序、数据、中间结果及最终运算结果的能力;能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力;能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作;能够按照要求将处理结果输出给用户。

 

2.2 计算机工作原理

对于我们现代计算机来说,最关键的2个部件就是CPU和内存。内存存储了要执行的程序指令,而CPU就是用来执行这些指令。CPU首先要知道这些指定存放在存储器的那个区域,然后才能执行,并且把执行的结果写入到执行区域。

 

2.2.1 CPU指令和编程语言

在了解CPU和存储器工作原理之前,先来了解一下CPU指令和我们编程语言之间的一些关系。

 

2.2.1.1 CPU指令

因为在计算机中指令和数据都用二进制来表示,也就是说它只认识0和1这样的数字。最早期的计算机程序通过在纸带上打洞来人工操操作的方式来模拟0和1,根据不同的组合来完成一些操作。后来直接通过直0和1编程程序,这种称之为机器语言。这里就会有一个疑问,计算机怎么知道你这些组合的意思?

于是就出现了CPU指令,我们现在买CPU都会听到指令集这一说。CPU指令其实就对应了我们这里说的0和1的一些组合。每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。有了CPU指令集的文档你就可以通过这个编写CPU认识的机器代码了。所以对于不同CPU来说可能会有不同的机器码。比如下面我们就定义了一套我们CPU硬件电路可以完成的CPU指令。

 指令               格式                   说明0001[address][register]读取存储取值到寄存器 0010[register][address]写入寄存器的值到存储器0011[register1][register2]加法操作

随着计算机的发展,CPU支持的指令也越来越多,功能也越来越强,上图就是现在Core I5处理器支持的指令集。

 

2.2.1.2 汇编语言

使用0和1这样的机器语言好处是CPU认识,可以直接执行,但是对于程序本身来说,没有可读性,难以维护,容易出错。所以就出现了汇编语言,它用助记符(代替操作码指令,用地址符号代替地址码。实际是对机器语言的一种映射,可读性高。

指令汇编指令格式说明0001READ[addLable][regLab]读取存储取值到寄存器0010WRITE[addLable][regLab]写入寄存器的值到存储器0011ADD[var1][var2]加法操作

 

 

 

 

把汇编语言转换为机器语言需要一个叫做汇编器的工具。对于目前的CPU厂商,在推出的CPU指令时都会同时退出新的汇编器。如果你还在使用老版本的汇编器那么只能使用机器码来使用新的指令了。

 

2.2.1.3 高级语言

汇编语言的出现大大提高了编程效率,但是有一个问题就是不同CPU的指令集可能不同,这样就需要为不同的CPU编写不同的汇编程序。于是又出现了高级语言比如C,或者是后来的C++,Java,C#。 高级语言把多条汇编指令合成成为了一个表达式,并且去除了许多操作细节(比如堆栈操作,寄存器操作),而是以一种更直观的方式来编写程序,而面向对象的语言的出现使得程序编写更加符合我们的思维方式。我们不必把尽力放到低层的细节上,而更多的关注程序的本身的逻辑的实现。

对于高级语言来说需要一个编译器来完成高级语言到汇编语言的转换。所以对比不同的CPU结构,只需要有不同编译器和汇编器就能使得我们的程序在不同CPU上都能运行了。如下图在VS2010中,我们可以选择程序编译的目标平台,X86,X64,ARM等。当然除了这些编译类的语言之外还有解释类型的语言如JS,就不在此讨论范围内。

到这里有一个疑问:当CPU的指令集更新后高级语言会有什么影响和变化?对于目前来说,一般出现了新的指令,会有对应的新的汇编器和编译器。所以编译器可以把一些高级语言的表达式编译成新的汇编指令,这样对于高级来说不会有任何变化; 当然还有一种情况就是高级语言会增加新的语法来对应一些新的汇编语言和指令。但是这种情况出现的几率很小。所以如果编译器不支持新的指令,那么只有只用汇编会来实现了。

 

2.2.1.4 小结

从上面的我们可以看出,我们写的程序最终都将变成机器认识的二进制可执行程序,然后加载到内存顺序的执行。 从机器码到汇编到高级语言,我们可以看到计算机中无处不在的分层,抽象的思想。不光光是软件,硬件同样适用。最后留下一个问题在这里: C#和Java程序编译出来的文件不是二进制的机器码,而是中间语言,那么他们又是怎么运行的呢?

 

2.2.2 CPU工作原理

前面已经了解了现代计算机的大致结构,也知道CPU是按照CPU指令来执行操作,那么就看看CPU的结构和他是如何执行顺序操作的。

2.2.2.1 CPU功能 指令控制: 指令控制也称为程序的顺序控制,控制程序严格按照规定的顺序执行。操作控制: 将取出的指令的产生一系列的控制信号(微指令),分别送往相应的部件,从而控制这些部件按指令的要求进行工作。时间控制: 有些控制信号在时间上有严格的先后顺序,如读取存储器的数据,只有当地址线信号稳定以后,才能通过数据线将所需的数据读出,否则读出的数据是不正确的数据,这样计算机才能有条不紊地工作。数据加工: 所谓数据加工,就是对数据进行算术运算和逻辑运算处理。 所谓数据加工,就是对数据进行算术运算和逻辑运算处理

2.2.2.2 CPU基本组成

以前CPU主要由运算器和控制器两大部分组成,随着集成电路的发展,目前CPU芯片集成了一些其它逻辑功能部件来扩充CPU的功能,如浮点运算器、内存管理单元、cache和MMX等。下面2张图分别是8086和Pentium CPU的结构图。

 .

 

对于一个通用的CPU来说,我们只需要关注他的核心部件算数逻辑单元和操作控制单元。

 

1. 控制器的组成和功能: 控制器由程序计数器、指令寄存器、指令译码器、时序产生器和操作控制器组成。它是计算机指挥系统,完成计算机的指挥工作。尽管不同计算机的控制器结构上有很大的区别,当就其基本功能而言,具有如下功能: 

取指令 从内存中取出当前指令,并生成下一条指令在内存中的地址。 分析指令 指令取出后,控制器还必须具有两种分析的功能。一是对指令进行译码或测试,并产生相应的操作控制信号,以便启动规定的动作。比如一次内存读/写操作,一个算术逻辑运算操作,或一个输入/输出操作。二是分析参与这次操作的各操作数所在的地址,即操作数的有效地址。 执行指令 控制器还必须具备执行指令的功能,指挥并控制CPU、内存和输入/输出设备之间数据流动的方向,完成指令的各种功能。 发出各种微操作命令 在指令执行过程中,要求控制器按照操作性质要求,发出各种相应的微操作命令,使相应的部件完成各种功能。 改变指令的执行顺序 在编程过程中,分支结构、循环结构等非顺序结构的引用可以大大提供编程的工作效率。控制器的这种功能可以根据指令执行后的结果,确定下一步是继续按原程序的顺序执行,还是改变原来的执行顺序,而转去执行其它的指令。 控制程序和数据的输入与结果输出 这实际也是一个人机对话的设计,通过编写程序,在适当的时候输入数据和输出程序的结果。 对异常情况和某些请求的处理 当计算机正在执行程序的过程中,发生了一些异常的情况,例如除法出错、溢出中断、键盘中断等。

2. 运算器的组成和功能: 运算器由算术逻辑单元(ALU)、累加寄存器、数据缓冲寄存器和状态条件寄存器组成,它是数据加工处理部件,完成计算机的各种算术和逻辑运算。相对控制器而言,运算器接受控制器的命令而进行动作,即运算器所进行的全部操作都是由控制器发出的控制信号来指挥的,所以它是执行部件。运算器有两个主要功能: 

执行所有的算术运算,如加、减、乘、除等基本运算及附加运算;执行所有的逻辑运算,并进行逻辑测试,如与、或、非、零值测试或两个值的比较等。

2.2.2.3 CPU工作流程

CPU的基本工作是执行存储的指令序列,即程序。程序的执行过程实际上是不断地取出指令、分析指令、执行指令的过程。几乎所有的冯•诺伊曼型计算机的CPU,其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数和结果写回。

  

2.2.2.4 指令周期 指令周期: CPU取出一条指令并执行该指令所需的时间称为指令周期。指令周期的长短与指令的复杂程度有关。CPU周期:从主存读取一条指令的最短时间来规定CPU周期。指令周期常常用若干个CPU周期数来表示。时钟周期:时钟周期是处理操作的最基本时间单位,由机器的主频决定。一个CPU周期包含有若干个时钟周期。

从上面的定义可以知道,对于CPU来说取出和执行任何一条指令所需的最短时间为两个CPU周期。所以频率越高,那么时钟周期越短,这样CPU周期和指令周期也就越短,理论上程序执行的速度也越快。但是频率不能无限的提高,而且频率的提高也带来了功耗,发热等问题,所以目前也有超线程,流水线等技术来提高CPU执行的速度。

 

2.2.2.5 时序发生器 时序信号: 在计算机高速运行的过程中,计算机内各部件的每一个动作都必须严格遵守时间规定,不能有任何差错。计算机内各部件的协调动作需要时间标志,而时间标志则是用时序信号来体现的。计算机各部分工作所需的时序信号,在CPU中统一由时序发生器来产生。时序发生器: 时序信号发生器是产生指令周期控制时序信号的部件,当CPU开始取指令并执行指令时,操作控制器利用时序信号发生器产生的定时脉冲的顺序和不同的脉冲间隔,提供计算机各部分工作时所需的各种微操作定时控制信号,有条理、有节奏地指挥机器各个部件按规定时间动作。

在这里有一个疑问:指令和数据都存放在内存中,那么CPU怎么区分是指令还是数据呢?

从时间上来说,取指令事件发生在指令周期的第一个CPU周期中,即发生在“取指令”阶段,而取数据事件发生在指令周期的后面几个CPU周期中,即发生在“执行指令”阶段。从空间上来说,如果取出的代码是指令,那么一定送往指令寄存器,如果取出的代码是数据,那么一定送往运算器。

 

2.2.3 小结

通过以上我们了解了CPU的工作过程。简单来说就是CPU要顺序执行一个程序的指令,首先是控制器获得第一条指令的地址,当CPU取得这个指令并执行后,控制器需要生成下一条要执行的指令的地址。ALU单元负责一些运算操作。下面的FLASH演示了CPU执行一个加法操作的流程。

 

CPU工作流程FLASH: http://218.5.241.24:8018/C35/Course/ZCYL-HB/WLKJ/jy/Chap05/flash-htm/5.6.swf

 

本文主要是简单介绍了计算机的一些发展历史和通用CPU的结构以及工作流程。加深了我们对冯诺依曼体系的储存程序,顺序执行的理解。无论硬件是什么样子,冯诺依曼计算机的基本原理就是这样。

 

1. 存储器

 

前面我们以一个简单通用的计算机模型来介绍了CPU的工作方式,CPU执行指令,而存储器为CPU提供指令和数据。 在这个简单的模型中,存储器是一个线性的字节数组。CPU可以在一个常数的时间内访问每个存储器的位置,虽然这个模型是有效的,但是并不能完全反应现代计算机实际的工作方式。

 

1.1 存储器系统层次结构

在前面介绍中,我们一直把存储器等同于了内存,但是实际上在现代计算机中,存储器系统是一个具有不同容量,不同访问速度的存储设备的层次结构。整个存储器系统中包括了寄存器、Cache、内部存储器、外部存储。下图展示了一个计算机存储系统的层次图。层次越高速度越快,但是价格越高,而层次越低,速度越慢,价格越低。

相对于CPU来说,存储器的速度是相对比较慢的。无论CPU如何发展,速度多块,对于计算机来说CPU总是一个稀缺的资源,所以我们应该最大程度的去利用CPU。其面我们提到过CPU周期,一个CPU周期是取1条指令的最短的时间。由此可见,CPU周期在很大程度上决定了计算机的整体性能。你想想如果当CPU去取一条指令需要2s,而执行一个指令只需要2ms,对于计算机来说性能是多么大的损失。所以存储器的速度对于计算机的速度影响是很大的。

对于我们来说,总是希望存储器的速度能和CPU一样或尽量的块,这样一个CPU周期需要的时钟周期就越少。但是现实是,这样的计算机可能相当的昂贵。所以在计算机的存储系统中,采用了一种分层的结构。速度越快的存储器容量越小,这样就能做到在性能和价格之间的一个很好的平衡。

 

1.2 存储技术

计算机的发展离不开存储器的发展,早起的计算机没用硬盘,只有几千字节的RAM可用。而我们现在4G,8G的内存已经随处可见,1T的大硬盘以及上百G的固态硬盘,而价格也比10年,20年前便宜的很多很多。所以我先大概了解下各种存储技术。目前存储技术大致分为SRAM存储器、DRAM存储器、ROM存储器和磁盘。

 

1.2.1 寄存器

在上一篇文章的图中我们有看得CPU内部有很多寄存器,而上一张图也显示,寄存器在存储层次结构的顶端。它也叫触发器,它往往和CPU同时钟频率,所以速度非常快。但是一个寄存器需要20多个晶体管,所以如果大量使用,CPU的体积会非常大。所以在CPU中只有少量的寄存器。而每个寄存器的大小都是8-64字节。

 

1.2.2 RAM随机访问存储

RAM(Read-Access Memory)分为两类,静态(SRAM)和动态(DRAM)。SDRAM比DRAM要快的多,但是价格也要贵的多。

静态RAM: SRAM将每个位存储在一个双稳态的存储单元中,每个存储单元是用一个六晶体管电路实现的。它的特点是可以无限期(只要有电)的保持在两个稳定状态中的一个(正好可以存放0或1),而其他任何状态都是不稳定的会马上切换到这两个状态中的一个;动态RAM: DRAM是利用电容内储存电荷的多寡来代表一个二进制位元(bit)是1还是0,每一bit由一个晶体管和电容组成。由于在现实中电容会有漏电的现象,导致电位差不足而使记忆消失,因此除非电容经常周期性地充电,否则无法确保记忆长存。由于这种需要定时刷新的特性,因此被称为“动态”记忆体。

SRAM相比DRAM速度更快功耗更低,而由于结构相对复杂占用面积较大,所以一般少量在CPU内部用作Cache,而不适合大规模的集成使用,如内存。而DRAM主要用来作为计算机的内部主存。

Cache: 目前我们CPU中一般集成了2到3级的Cache,容量从128K到4M。对于CPU总的Cache来说,它们的也是和CPU同频率的,所以理论上执行速度和寄存器应该是相同的,但是Cache往往用来存储一些指令和数据,这样就存在一个命中的问题。当没有命中的时候,需要向下一集的存储器获取新的数据,这时Cache会被lock,所以导致实际的执行速度要比寄存器慢。同样对于L1,L2,L3来说,速度也是越来越慢的;主存: 也就是我们说的内存,使用DRAM来实现。但是我们目前听的内存一般叫DDR SDRAM,还有早期的SDRAM。这是一种同步的DRAM技术,我们不需要了解他的详情,只需要知道它能有效的提高DRAM的传输带宽。而DDR表示双倍的速率,而现在又有了DDR2,DDR3,DDR4,他们的带宽也是越来越大。

 

1.2.3 ROM只读存储

前面的RAM在断电后都会丢失数据,所以他们是易失的。另一方面非易失的存储器即便在断点后也能保存数据。一般我们称之为ROM(Read-Only Memory)。虽然这么说,但是ROM在特殊的情况下还是可以写入数据的,否则就不能叫存储器了。

PROM: 可编程ROM,只能被编程一次,PROM包含一种熔丝,每个存储单元只能用高电流烧断一次;EPROM:可擦写可编程ROM,有一个透明的石英窗口,紫外线通过窗口照射到存储单元就被清除为0,而对它编程是使用一种特殊的设备来写入1。写入次数1K次;EEPROM:: 电子可擦除可编程ROM,不需要特殊设备而可以直接在印制的电路板上编程。写入次数10万次;Flash Memory: 这是我们见到最多的闪存,有NOR Flash、NAND Flash、V-NAND Flash、SLC、MLC、TLC。虽然是基于EEPROM,但是速度上却要快很多。其中NOR 、NANA Flash大量的使用在U盘,SD卡、手机存储上。

ROM在计算机中应用也比较多,比如我们的BIOS芯片,最开始采用PROM,后来使用EPROM,如果损坏计算机就无法启动了。而目前手机中也采用ROM来烧入系统,而RAM作为内存,使用Flash Memory作为机身存储。

 

1.2.4 磁盘存储

也就是我们最常见的硬盘。目前硬盘主流已经是500G,1T。转速也在7200转左右。相对于8G的内存,一个500G的硬盘可以说是相当的便宜。但是问题在于他的速度非常的慢,从磁盘读取数据需要几个毫秒,而CPU时钟周期是以纳秒计算。磁盘读取操作要比DRAM慢10万倍,比SRAM慢百万倍。

相对于CPU,内部存储的电子结构,磁盘存储是一种机械结构。数据都通过电磁流来改变极性的方式被电磁流写到磁盘上,而通过相反的方式读回。一个硬盘由多个盘片组成,每个盘片被划分为磁道,扇区和最小的单位簇。而每个盘面都有一个磁头用来读取和写入数据。而硬盘的马达装置则控制了磁头的运动。

 

1.2.5 虚拟硬盘(VHD)和固态硬盘(SSD)

随着计算机的发展,缓慢的磁盘速度已经成为计算机速度的障碍了。大多数情况下,你的CPU够快,内存够大,可是打开一个程序或游戏时,加载的速度总还是很慢。(关于程序加载的过程后面的文章会讲到)。原因就是磁盘读写速度太慢,所以一度出现了虚拟硬盘。就是把一部分内存虚拟成硬盘,这样一些缓存文件直接放到内存中,这样就加快了程序访问这些数据的速度。但是他的问题是易失的。当然你可以保存到磁盘,但是加载和回写的速度会随着数据量加大而加大。所以这个适用于一些临时数据的情况,比如浏览器缓存文件。

而固态硬盘是最近几年出来的,而且随着技术的发展,价格也越来越便宜,越来越多的人采用SSD+HHD的方式来搭建系统,提高系统的速度。其实SSD在上世纪80年代就有基于DRAM的产品,但是因为易失性和价格而无法推广开来。而现在的SSD则是使用Flash Memory。目前市面上最常见的是SLC,MLC,TLC存储介质的固态硬盘。我们知道Flash都是与写入次数限制的。而SLC>MLC>TLC。目前主流的SSD都是使用MLC,比如Intel 520,三星830系列。当然目前三星也退出了基于TLC的固态硬盘,价格相对要便宜一些。

 

1.2.6 远程存储

简单可以理解为是将数据指令存储在其他机器上,比如分布式系统,WebService Server,HTTP Server以及现在炒的火热的云端存储。计算机通过网络相互连接。比较起磁盘,远程存储的速度是以秒来计算。

 

1.3 局部性

通过上面介绍我们对计算机存储器有了一个了解,并且知道了存储器层次越高速度越快。那么为什么我们要对存储器分层呢? 分成是为了弥补CPU和存储器直接速度的差距。这种方式之所有有效,是因为应用程序的一个特性:局部性。

我们知道计算机的体系是存储程序,顺序执行。所以在执行一个程序的指令时,它后面的指令有很大的可能在下一个指令周期被执行。而一个存储区被访问后,也可能在接下来的操作中再次被访问。这就是局部性的两种形式:

时间局部性空间局部性

对于现代计算机来说,无论是应用程序,操作系统,硬件的各个层次我们都是用了局部性。

硬件:通过引入Cache存储器来保存最近访问的指令数据来提高对主存的访问速度。操作系统: 允许是用主存作为虚拟地址空间被引用块的高速缓存以及从盘文件的块的高速缓存。应用程序:将一些远程服务比如HTTP Server的HTML页面缓存在本度的磁盘中。

CODE1:

[cpp]  view plain  copy   print ? 在CODE上查看代码片 派生到我的代码片 int sumarraycols(int a[m][n])   {     int i, j , sum = 0;     for(j = 0; j 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3