很多小伙伴认为程序员就是写写代码,不需要了解计算机底层的知识和原理。其实,这种观点是错误的。如果你想突破程序员的职业发展瓶颈,计算机硬件、操作系统原理、编译原理等是一定要掌握的知识。而【冰河技术】微信公众号的【程序员进阶系列】专题就是要系统的向大家分享程序员进阶需要掌握的各项知识技能。今天,我们来聊聊一个让程序员很头疼的话题:计算机中的主存是如何进行编址和计算的?
文章已收录到:
https://github.com/sunshinelyz/technology-binghe
https://gitee.com/binghe001/technology-binghe
主存编址与计算这里,小伙伴们首先要区分两个概念,一个是编址,一个是寻址。
编址: 存储器是由一个个存储单元构成的,为了对存储器进行有效的管理,就需要对各个存储单元编上号,即给每个单元赋予一个地址码,这叫编址。经编址后,存储器在逻辑上便形成一个线性地址空间。
寻址: 存取数据时,必须先给出地址码,再由硬件电路译码找到数据所在地址,这叫寻址。
编址可以分为两种:按字编址和按字节编址。
按字编址:存储体的存储单元是字存储单元,即最小寻址单位是一个字。
按字节编址:存储体的存储单元是字节存储单元,即最小寻址单位是一个字节。
对于主存编址中最常见的计算形式为:根据存储器所要求的容量和选定的存储芯片的容量,就可以计算出所需要的芯片的数量。公式如下所示。
总片数 = 总容量 / 每片的容量这里,给小伙伴们举一个例子:若内存地址区间为4000H ~ 43FFH,每个存储单元可存储16位二进制数,该内存区域使用4片存储器芯片构成,则构成该内存所用的存储器芯片的容量是多少?
解题思路也比较简单,我们一起来看看如何解题:
(1)首先,我们来求解4000H ~ 43FFH地址空间的总容量,使用终止地址-起始地址+1即可得到总容量,也就是43FFH - 4000H + 1 = 43FFH + 1 - 4000H = 4400H - 4000H = 400H。
注意:在计算机中,以H结尾的数字是十六进制,逢16进1,而F在十六进制中表示15,所以,43FFH + 1 = 4400H。
所以,4000H ~ 43FFH地址空间的总容量为400H。
(2)接下来,我们要把400H转换成二进制,对于十六进制数转换成二进制数来说,每一位十六进制数对应着四位的二进制数,我们可以把400H拆分成4、0、0三部分,4转换成二进制数就表示0100,十六进制的0转换成二进制为0000。所以,400H转换成二进制的结果为:0100 0000 0000。
0100 0000 0000也就是2的10次方,即为210。
(3)题目中说的每个存储单元可存储16位二进制数,所有总共可以存储的二进制数就是:210 * 16。
(4)该区域使用4片存储器芯片构成,所以,存储芯片的容量为:210 * 16 / 4 = 210 * 4 = 212,最终的结果单位为bit。
总线一条总线同一时刻只允许一个设备发送数据,但允许多个设备接收数据。
总线的分类总线可以分为数据总线、地址总线和控制总线。
数据总线(Data Bus):在CPU和RAM之间来回传送需要处理或是需要存储的数据。
地址总线(Address Bus):用来指定在RAM(Random Access Memory)之中存储的数据的地址。
控制总线(Control Bus):将微处理器控制单元(Control Unit)的信号传送到周边设备,一般常见的为USB Bus和1394 Bus。
串联系统与并联系统这里,先给小伙伴们简单介绍下什么是串联系统,什么是并联系统。
串联系统串联系统是组成系统的所有单元中任一单元失效就会导致整个系统失效的系统。把用电器各元件逐个顺次连接起来,接入电路就组成了串联电路。我们常见的装饰用的"满天星"小彩灯,常常就是串联的。串联电路有以下一些特点:⑴电路连接特点:串联的整个电路是一个回路,各用电器依次相连,没有"分支点"。⑵用电器工作特点:各用电器相互影响,电路中一个用电器不工作,其余的用电器就无法工作。⑶开关控制特点:串联电路中的开关控制整个电路,开关位置变了,对电路的控制作用没有影响。即串联电路中开关的控制作用与其在电路中的位置无关。
注:以上对于串联系统的描述来源于网络。
接下来,我们来看一个关于串联系统的图形表示,这里我们假设串联系统中每个部分的可靠度依次为R1,R2,...Rn,如下所示。
则整个系统的可靠度为:R = R1 * R2 * ... * Rn。
并联系统