一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
冯诺依曼模型
冯诺依曼定义计算机基本结构为5个部分,分别是cpu,内存,输入设备,输出设备,总线。
内存
程序和数据都在内存,存储的区域是线性的。
数据存储单位是bit,最小的存储单位是字节,1字节等于8位
内存的地址是从0开始编号,自增排列,最后一个地址为内存总字节数-1。就像一个数组一样,内存读写一个数据的速度都是一样的
cpu
32位和64位cpu的区别在于一次能计算多少字节数据
32位一次可以计算4个字节
64位一次可以计算8个字节
32位和64位成为cpu的位宽
cpu这样设计,是为了能计算更大的数值,如果是8为,那只能计算0-255范围的数据,cpu位宽越大,可以计算的数值就越大
cpu内部还有一些组件,比如寄存器,控制单元,alu等,控制单元负责控制cpu工作,alu负责计算,寄存器分为很多类,各司其职。
为什么还要寄存器
寄存器主要来存储运算时的数据,内存离cpu太远,cpu从内存获取数据太慢了,从cpu里面的寄存器获取数据很快
常用的寄存器种类
通用寄存器,存放要运算的数据
程序计数器pc 存储cpu要执行的下一条指令的地址
指令寄存器 存放指令
总线
地址总线 指定cpu将要操作的内存地址
数据总线 用于读写内存的数据
控制总线 用于发送和接受信号 比如中断
cpu读写内存数据,一般需要通过两个总线
首先要地址总线获取内存的地址
通过数据总线来传输数据
64位一定比32位好吗
如果用32位cpu让两个64位的数字相加,需要分成2个32位低位和2个32位高位,低位相加得到近位,然后高位相加再加上近位,组合出来答案。而64位可以一次性得到答案。
然而事实上很少有超过32位的计算。只要计算数额不超过32位,性能上区别是不大的,超过32位,64位cpu的性能才能发挥出来。
此外,32位cpu最大只能操作4gb的内存,就算装了8gb内存条也没用,64位的cpu内存寻址就很大了,2的64次方
a=1+2是怎么执行的
程序编译过程中,编译器分析代码,发现1和2是数据,所以内存会有个数据段来存放这些数据
假设1存放到0x100 2存放到0x104
编译器会把a=1+2翻译成4条指令 放到正文段
0x200 load 0x100->r0
0x204 load 0x104->r1
0x208 add r0 r1 r2
0x20c store r2->a的地址
执行程序的时候 程序计数器pc会被设置成0x200,然后按序读入指令
上述例子,由于是在32位cpu,所以指令的大小是4个字节,指令地址之间间隔就是4
数据大小是根据你在程序中指定的变量类型,比如int就是4个字节,char就是1个字节
指令
上述指令是容易理解的汇编代码,事实上指令是一串二进制编码,每条指令都会有相应的编码,cpu通过对解析这个编码来得到指令的内容。
指令集就很多了,比如mips,risc-v
下面举mips,mips指令是一个32位的整数
r指令 用在算术相关
i指令 数据传输,条件分支
j指令 跳转
add就属于r指令
add的opcode是000000
第一个寄存器是r0 编号00000
第二个寄存器是r1 编号00001
rd代表目标的临时寄存器 编号00010
因为没有位移操作所以都是0
从而拼凑出这条add指令的mips指令编码
指令周期
取指令->指令译码->执行指令->数据回写
取指令阶段,指令是放在存储器里面的,控制器从程序计数器pc和指令寄存器来取出指令
指令译码,也是由控制器近现代
指令执行,是由alu操作的,但是如果是无条件跳转,那就是完全在控制器执行