⭐️前面的话⭐️
大家好,本篇文章将为大家带来有关计算机组成原理的知识,主要内容为计算机的历史,认识计算机如何工作的。
博客主页:未见花闻的博客主页
欢迎关注点赞收藏⭐️留言
本文由未见花闻原创,CSDN首发!
首发时间:2022年3月23日
✉️坚持和努力一定能换来诗与远方!
参考书籍:《计算机组成原理》,《计算机操作系统》
参考在线编程网站:牛客网力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
1946年2月14日,在美国宾夕法尼亚大学,众所周知的世界上第一台电子数字计算机ENIAC诞生。然而,英国在二战期间研制的电子计算机Colossus(巨人)却要比ENIAC早两年,多年来,英国人对自己研制首台电脑的荣誉始终保持着缄默。
第一代:电子管计算机
第二代:晶体管计算机
第三代:中小规模集成电路计算机
第四代:大规模和超大规模集成电路计算机
第五代:人工智能和大数据云服务的结合
引用自:百科
最开始的时候,计算机诞生的使命是为了战争,二战时期,为了计算导弹轨道。
我们谈到计算机的诞生,那必然会联想到冯诺依曼和爱因斯坦,接下来我们聊一聊计算机基本的组成,现在大部分电脑都是冯诺依曼体系。
冯·诺依曼(John von Neumann,1903~1957),20世纪最重要的数学家之一,在现代计算机、博弈论、核武器和生化武器等诸多领域内有杰出建树的最伟大的科学全才之一,被后人称为“计算机之父”和“博弈论之父”。
美籍匈牙利数学家冯·诺伊曼于1946年提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。 冯·诺依曼体系结构冯·诺伊曼理论的要点是:计算机的数制采用二进制;计算机应该按照程序顺序执行。人们把冯·诺伊曼的这个理论称为冯·诺伊曼体系结构。
结构体系:
(1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中,数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪 CPU就加载那段内存中的数据,如果是不正确的指令格式,CPU就会发生错误中断. 在现在CPU的保护模式中,每个内存段都有其描述符,这个描述符记录着这个内存段的访问权限(可读,可写,可执行).这就变相的指定了哪些内存中存储的是指令哪些是数据)
指令和数据都可以送到运算器进行运算,即由指令组成的程序是可以修改的。
(2)存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。
(3)指令由操作码和地址码组成。操作码指明本指令的操作类型,地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。
(4)通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器只有一个,一般按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。
(5)以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。
(6)数据以二进制表示。
引用自:百科
冯诺依曼体系提出任何的计算机都应该有CPU(运算器与控制器),输入设备,储存器和输出设备组成。
CPU 中央处理器: 进行算术运算和逻辑判断.
存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储).
输入设备: 用户给计算机发号施令的设备.
输出设备: 计算机个用户汇报结果的设备.
存储器所有存储单元的总数称为存储器的存储容量,通常用单位 KB
MB
来表示,如64KB 128MB 。存储容量越大,表示计算机记忆储存的信息越多。
半导体存储器的存储容量毕竟有限,因此计算机中又配备了存储容量更大的磁盘存储器
和光盘存储器,称为外存储器。相对而言,半导体存储器称为内存储器,简称内存。
其中常见的输入设备有键盘鼠标等,常见的储存器有内存和外存(最常见的就是硬盘),常见的输出设备有显示屏等,说起储存,内存与外存的区别是什么呢?
访问速度:内存快,外存慢。
储存空间:内存相对于外存空间要小的多,我们所购买的电子产品有例如12+256G这样的标识,前面的12G表示内存,后面的256G表示外存。
成本:内存贵,外存便宜。
持久化:内存断电后数据丢失,外存断电后数据依然存在。
依照冯诺依曼体系,我们来了解计算机到底是如何进行工作的,以最简单的加法为例(8进制),想要进行运算,那么运算器必不可少,运算器是由许许多多的电子开关构建而成的。
通过电子开关,我们可以实现 1 位(bit) 的看似无用的逻辑运算,但至少它工作起来了,不是么。
门电路由电子开关构建而成,可以实现 1 位(bit) 的基本逻辑运算。
门电路主要有以下四种,包括非门,与门,或门,异或门。
算术逻辑单元简写为ALU, 是计算机中进行算数、逻辑运算的核心部件,是计算机的数学大脑,ALU有两个单元,一个是逻辑单元,就是由前面的逻辑门实现,还有一个单元是算术单元AU。
由于计算机中的计算是以二进制来进行运算的,我们先来了解一下二进制。
算数单元(AU),负责计算机里的所有数字操作,比如四则运算,当然它能做的远远不止这些,最基本的运算器就是加法器,包括半加器和全加器,配合上逻辑门就能够进行运算了。
半加器(Half Adder),进行两个 1 位(bit) 数的相加,根据基本的门电路,可以构建出半加器。
全加器(Full Adder),进行三个 1 位(bit) 数的相加,根据半加器和门电路,可以构建出全加器。
进一步通过半加器和全加器可以构建8位的加法器,以此类推,最终可以实现32位或64位的加法器。
逻辑单元,如8 位(bits) 数非 0 判断器,由多个或门构成,就是每两位为一个单位,判断是否含有1,如果含有1最终结果会返回1,表示这个数不是0。
上面的ALU实现图是8位的,都是由基本的门电路一步一步构建而成的,前面的半加器和全加器也是基于门电路实现的,现在64位的计算机遍地开花,虽然我们构建的是一个8位的ALU,但是基于64的ALU也是按照类似的思路构建出来的。
运算器是CPU中的重要组件之一,除了运算器还有控制器和寄存器。
寄存器和内存(主储存器)都是属于储存器,除此之外,还包括外存(硬盘,磁盘等)。
寄存器是CPU中内部的储存器,速度比内存快3-4个数量级,空间比内存小很多,一般几百字节左右。
计算机的工作离不开寄存器,因为在计算之前,首先需要将数据加载到寄存器,然后计算完成后需要把运算好的结果保存到寄存器中。至于寄存器具体怎么构造,我们就不深入了,只要知道寄存器也是由许许多多的电子开关构建而成的就行。
如,进行 1 位(bit) 的存储:
8 位(bits) 寄存器:
内存的构建比寄存器要复杂,但是原理是类似的,如此构建的内存被称为RAM(Random Access Memory),可以支持 O(1) 时间复杂度访问任意位置的数据,这也就是我们数组下标访问操作是 O(1) 的硬件支持。
有了储存器和运算器,还需要控制器来协调工作,所以控制器也是比不可少的,控制器中的最小单元称为控制单元(CU)。
控制器是计算机中发号施令的部件,它控制计算机的各部件有条不紊地进行工作。更具
体地讲,控制器的任务是从内存中取出解题步骤加以分析,然后执行某种操作。
CU可以通过一系列的指令来控制储存器和和运算逻辑单元,进行预期的计算。
那么,指令是什么呢?
计算机的程序是由 系列的机器指令组成的,指令与编程息息相关,通常不同的CPU它操作的指令也不一样。
教科书上面对指令的定义(难懂):
指令就是要计算机执行某种操作的命令 从计算机组成的层次结构来说,计算机的指令有微指令、机器指令和宏指令之分 微指令是微程序级的命令,它属于硬件;宏指令是由若干条机器指令组成的软件指令,它属于软件;而机器指令则介千微指令与宏指令之间,通常简称为指令 ,每一条指令可完成 个独立的算术运算或逻辑运算操作。
其实所谓指令,即指导 CPU 进行工作的命令,主要有操作码 + 被操作数组成。
其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。
指令本身也是一个数字,用二进制形式保存在内存的某个区域中。
对于人类来说,并不擅长阅读二进制指令,所以通常都会对二进制指令制定一套助记符,一般每个CPU都会有一个芯片手册,也就是指令表。
接下来我们使用一个极简化版的指令表,根据这个指令表来认识计算机中如何进行简单的加法,了解指令是如何执行的。
就以八位的指令为例,前四位表示操作码,后四位表示被操作数据的地址。
LOAD_A指令:0010 0111
表示将0111
地址的数据加载到寄存器A
。
LOAD_B指令:0001 0101
表示将0101
地址的数据加载到寄存器B
。
STORE_A指令:0100 0011
表示将寄存器A
中的数据保存到0011
所处的空间。
ADD指令:将两个寄存器的结果相加,并将结果保存至第二个寄存器,如1000 0001
将00
寄存器的数据与01
寄存器的数据进行相加,并将计算结果放入寄存器01
。
比如有下面一系列的地址和对应的数据,我们来模拟加法的运算,前四非地址是我们要执行两数相加的指令。
地址(十进制) | 数据(二进制) |
---|---|
0 | 00101110 |
1 | 00011111 |
2 | 10000100 |
3 | 01001101 |
4 | 00000000 |
5 | 00000000 |
6 | 00000000 |
7 | 00000000 |
8 | 00000000 |
9 | 00000000 |
10 | 00000000 |
11 | 00000000 |
12 | 00000000 |
13 | 00000000 |
14 | 00000011 |
15 | 00001110 |
不妨将寄存器A的地址设为00
,寄存器B的地址设为01
。
执行0
号地址储存的指令00101110
,意思是将地址1110(14)
的数据00000011(3)
加载到寄存器A。
执行1
号地址储存的指令00011111
,意思是将地址1111(15)
的数据00001110(14)
加载到寄存器B。
执行2
号地址储存的指令10000100
,意思是将寄存器A与寄存器B的数据相加,并写入寄存器A。
执行3
号地址储存的指令01001101
,意思是将寄存器A的数据保存至地址为1101(13)
的空间。
总结一下CPU工作流程:
我们所写的代码都会被编译器转换成许多条CPU能够识别的机器语言指令,然后CPU能够执行我们所转换的指令,实现程序的功能。
本文的目标就是带大家认识一下计算机的工作原理到底是个什么?了解计算机是怎么运行我们所写的代码,对计算机有一个更加清晰的认知,下一篇文章会介绍操作系统进程有关的内容,并引出java的多线程,这个就比较重要了,因为你要学习Java中的多线程,那么进程的概念你是一定得熟悉的。
那么,我们下次见!