计算机系统的层次结构
冯诺依曼结构计算机的五大部件和连线方式,包括控制器与所有部件互相的控制连线。和部件之间数据指令从输入到处理到输出的数据通路。 常将运算器和控制器做在一起形成CPU,然后将CPU与主存放在一起形成主机的概念,输入输出放在一起作为IO部件,与辅存一起形成外设的概念。
先看眼CPU的两大部件内部构成: 运算器里面有一个ALU运算单元和几个操作数的专用寄存器,以及一些通用寄存器。
控制器里面有一个指令分析的控制单元CU,还有一个PC指令计数器,每次取指后会自动加一,保持里头永远存着下一条指令的主存地址,通过PC给到主存的MAR地址寄存器,从存储体内读出数据到MDR数据寄存器后,放入控制器的IR指令寄存器送给CU进行指令分析。这个过程是取指。
假设这条指令是取数指令,CU分析指令,先切除了指令的OP码LOAD,然后分析两个操作数的地址码,凭地址码MAR从存储体读取数据到MDR再放入ACC,解析出MDR存放的是数据加载至运算器而不是控制器的IR是计算机通过指令周期来判断的。在取指阶段是Instruction送到控制器的IR,而在执行阶段是Data送到运算器的寄存器内。
MAR,是怎么从存储体里取数的呢?首先得考虑数是怎么存的,也就是一个二进制位怎么存的。这里简易理解,有一个存储元,电容包含了0或1,还有一个读取控制开关,当开关接入信号1时,存储元的电容存储的电位0/1会被读出。将八个这样的存储元并排放置,用一根线接上8个存储元的读取控制开关,通过这条线可以一次性控制8位输出,这样的八个存储元和读取线形成一个存储单元,多个存储单元往下排列,输出端用8条线串接,连到MDR,由此为了防止相邻存储单元间输出冲突,除了要读的单元读取线置1,其余则需置0。想到地址得表示方式并不是这样的one hot编码方式,所以在MAR与存储体的读取线间需要接一个译码器,将2进制翻译成控制电位,而左侧MAR的线路数是右侧读取控制线路数的对数数量关系,所以电信号强度译码后,会有所减弱,因此在译码器后面加接一个驱动器,增强信号。
进一步考虑之前的取数指令,假设这条指令只是随数据一起输入的操作步骤中的一步,计算机是怎么理解我们写的操作步骤的呢?这里涉及到了计算机语言,首先机器芯片只会理解机器语言01串,人们编写操作步骤时可能通过查指令表来找到对应的编码。于是又出现了汇编语言,使用助记符来编写操作步骤,而查表翻译到机器语言01串的工作,有专门的汇编程序(器)来完成。但是发现使用汇编语言,从操作步骤角度来看,如果写的不好,容易死机,比如前后操作产生寄存器占用冲突。于是后来又有了高级语言,高级语言通过编译程序可以直接翻成机器语言也可以翻成汇编语言,编译器可以优化实现,比如当出现重复的运算赋值代码时,它不会做第二次,而会通过判断相等后直接复制上一次的运算结果到新的寄存器内。除了编译也可以进行解释,而解释不管上下文,逐条对照翻译,但是边执行边解释,总体相比编译执行效率会低一点。
因此,按照语言,又将系统层次划分了六层结构。这里概念就不惜赘述了,这里注意L1层和L3层的新面孔。除此之外,第三级以下可以认为是硬件机器,上头是软件实现的机器。