计算机系统的分层

计算机系统的分层

计算机系统(computer system)是计算机的硬件系统和软件系统构成的整体,这个概念跟操作系统(operating system)易混淆,因为平时较少使用到前者,后者其实是前者的一部分。在研究结构比较复杂的系统时,通常会先根据一些原则和思想将其划分成多个层(layer),然后通过逐个的研究各个层来研究整个系统。现代计算机系统也是分层研究和实现的,一般认为其最底层位于数字电路(digital circuit)中靠顶层的位置,该位置实际并不太关心电路本身,而是关心如何用电路基本组件来构造可实现具体逻辑的组件,而该位置以下的部分则属于电子工程学(electronic engineering)等其他领域。需要明确这里的计算机指数字式电子计算机,而计算机系统本身并不限制实现方式,比如更早出现的机械计算机、模拟式电子计算机。

如果不分层实现计算机系统,那么就需要用构建电路的方式来编写程序,这种程序的编写和维护显然都十分困难,即便先将某种程序语言固化成电路,然后再以此为基础编写该语言的程序,那也会导致硬件成本过高等问题。现代计算机系统的分层思想是每层都基于上一层提供的机器和语言来实现该层的机器和语言(见上图)。需明确这里的语言与机器都是广义上的,机器可以是实际机器,也可以是虚拟的机器,语言可以是常见的程序语言,也可以是电路和信号等“抽象语言”,这种语言与机器存在重要的对应关系,由于定义机器本身就要确定机器接受的语言,所以机器定义了语言,由于机器必须能正确执行该语言的所有程序,所以语言也定义了机器。该问题会涉及到计算机的数学基础,可参考计算理论(theory of computation)

 

六层计算机系统

这里需要预先说明在\(L_{k-1}\)语言的基础上执行\(L_k\)语言程序的两类方法:

1) 解释执行:通过解释器(interpreter)完成,其流程是“读取程序的第1条指令,将其转化为一组\(L_{k-1}\)语言的指令,然后依次指令它们。读取程序的第2条指令,将其转化为一组\(L_{k-1}\)语言的指令,然后依次指令它们……重复该过程直到执行完整个程序”。其特点是只按一对多的方式转化指令,不考虑每条指令所处的“上下文”。解释器通常更易实现;

2) 编译执行:通过翻译器(translator)完成。其流程是“将程序的所有指令作为整体转化为\(L_{k-1}\)语言下的整个程序,然后再执行”。其特点是能从整体上按多对多的方式转化指令,在转化规则上有更大的优化余地。翻译器通常更难实现;

现代计算机系统基本都可看作上图中的6层计算机系统。其中每层的结构大致如下:

1) 数字逻辑层:基于电路的基本组件构造可实现具体逻辑功能的组件;

2) 微体系结构层:基于下一层的组件构造硬件解释器。更具体一点的实现方案包括如下2种:

2.1) 微程序控制:解释器中包含一个特殊存储组件,其中的数据能在一定范围内定义解释器的解释规则,由于这部分数据在一定程度上起到程序的作用,所以称其为微程序(microprogram)。在一些计算机系统中,微程序是可修改的;

2.2) 硬布线控制:解释器的解释规则完全由固化的硬件决定,一经确定后不可修改;

3) 指令系统层:也称为体系结构层或ISA层。该层的语言被称为指令集,其中的指令被称为ISA指令,硬件厂商通常会提供描述指令集的手册供系统程序员参考,该层是通常所说的程序员可见的最底层。注意到该层的语言能在下一层被解释执行,所以该层更像是一个“空层”,单独定义该层主要是为了方便讨论指令集设计方面的问题;

4) 操作系统层:基于下一层的指令构造软件解释器。更具体来说,该层的大部分指令通常跟下一层相同,仅有小部分新指令,新指令会被解释执行为下一层的指令,其他指令会被交给下一层执行。该解释器就是一般意义下的操作系统

5) 汇编语言层:基于下一层的指令构建汇编语言(assembly language)。不过汇编语言仅仅是用单词和助记符来帮助书写指令。该层通常是将汇编程序翻译执行为下一层的程序,其中的翻译过程由汇编器(assembler)完成;

6) 高级语言层:基于下一层的语言构建高级语言(high-level programming language)。该层通常会将高级程序翻译执行为下一层的程序,其中的翻译过程由编译器(compiler)完成。这里的高级语言更倾向于指C、Rust等系统级语言

 

计算机系统分层的演化

这里简单回顾一下计算机系统的分层的演化:

1) 2层计算机系统:在1940s时期,最早的一批数字式电子计算机诞生,其仅有数字逻辑层和指令系统层;

2) 3层计算机系统:到了1950s,微程序技术出现,这时的计算机中出现微体系结构层;

3) 4层计算机系统:早期的程序员如果想在计算机上执行任务,需要先跟计算中心(见上图)预约时间段,然后带上以打孔卡片为介质的程序(见上图)去计算中心排队,程序员在使用计算机时必须手动切换各种打孔卡片来完成编译、执行等各种步骤。为避免排队和切换卡片等麻烦,1960年左右的计算机中出现了一种常驻程序,其能够让计算机一次性装入多个任务并依次完成每个任务,不过这需要定义一些特殊的打孔卡片,用于标注每个任务的类型、每个任务的开始结束位置(整排卡片中的开始结束位置)等等。上述常驻程序就是最早的操作系统,新定义的特殊卡片就是操作系统层的新指令

4) 微程序时代:在1960s到1970s期间,通过编写更多的微程序来“增加硬件”成为主流思想,这导致ISA指令的数目快速增长。这期间出现了许多更复杂的ISA指令,包括整数的乘除指令、处理字符串的指令、处理多媒体的指令等;

5) 微程序时代的结束:之后研究者慢慢发现,如果大规模的减少ISA指令数,然后再用硬布线实现微体系结构,通常可提高速度。这导致一些新型计算机系统诞生,然而对于目前主流的x86计算机系统而言,其仍然继续使用着微程序;

最早的2层计算机系统的软硬件边界很明确,但在微程序出现后这个边界就开始逐渐变得模糊,事实上微程序本身就很难说是纯硬件或纯软件。微程序的演变历程也一定程度说明“软件能实现硬件,硬件也能实现软件”,从更本质的角度来说硬件和软件在逻辑上是等价的,所以可更进一步的认为计算机系统中的每一层也都是一个独立的计算机系统

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部