您的位置:首页 > 理论基础

计算机整体过程(由硬件到软件)

2017-02-07 22:13 246 查看
 指令首先在磁盘中,以N/S级表示10来表示,通过磁盘驱动装置,转换为高低电平表示10加载到内存,高低电平通过电路输送到CPU,送到译码器进行判断,判断是什么指令类型(指令编码方式在ISA设计的时候就进行了设计),并根据相应的类型生成对所有部件的控制信号,控制信号控制CPU中的部件进行执行或者等待,等电路经过一次,那么这个指令执行完毕

冯·诺依曼结构的主要思想,“存储程序(Stored-program)” 工作方式:

任何要计算机完成的工作都要先被编写成程序,然后将程序和原始数据送入主存并启动执行。一旦程序被启动,计算机应能在不需操作人员干预下,自动完成逐条取出指令和执行指令的任务。

整个的可以由控制器不断从存储器取出指令,运算器运行,输入输出交互,这样就构成了冯·诺依曼结构,也就是通用计算机的最抽象的模型

而我们通常熟知的图灵机也是一种模型,但是却是用于证明了这个结构的可计算性,也就是说其实是证明了现实问题可以由这样的通用机器进行解决

分析大多软件,可以知道一般的软件需要:整数类型,小数类型。当然特殊软件,需要特别快的效率,需要底层硬件直接运算的数据结构可以单独设计CPU,而这种CPU是特殊的,不是现在大多人用的通用CPU  最早期的计算机只支持整数部分的计算,使用原码进行表示并计算,在后来的计算机发展以及CPU设计相互交流之中,发现使用补码来表示整数,会使用同样的存储空间但是CPU设计更加方便简单效率也更快,于是到现代的计算机中整数部分均是使用补码进行表示。

实际上,小数可以有很多的编码方式,比如可以给小数32 bit的空间,第一个bit表示正负,中间15 bit表示整数部分,后16 bit表示小数部分。这样可以表示一个小数,但是有一定的精度范围限制,超过了这个范围的小数是没办法比较精确的表示的。 为了使得尽量以较小的空间得到最好的效果(精度高表示的范围也打),以及规范全球的CPU生产商。IEEE 设计了一种浮点表示模式,命名为IEEE 754,目前主流的CPU对浮点的表示均采用这个标准。有浮点数就有定点数,这个点是“小数点”的意思。所谓定点数,就是在计算机中表示时小数点不移动的数,比如整数以补码表示,此时小数点其实是在数的最低位那一侧,只是未表示出来,计算时也未移动。也像刚刚说的32bit表示小数一样,中间15
bit后一位其实就是小数点,计算或者表示都未曾移动过,依旧是15bit后的位置。而IEEE 754标准中,小数点先表示成类似科学表示法的形式15000表示成1.5 x 10^4,并在最前面记录正负,然后是指数部分4,之后是小数部分1.5。这样通过这种形式记录下来一个小数,由于这样记录小数部分的小数点在移动,以及计算时需要使指数部分相同再计算,这时小数点部分也在移动,因此称为浮点数。也由此C语言单精度小数称为float(单精度浮点数)。

同样是需要根据软件的需要来规定的,比如我们需要命令,移动数据(移动指令),将两个数据进行加运算(加指令)。将这一系列指令归纳下来,就可以得到我们CPU所需要对上层软件所支持的指令集。接下来,因为磁盘或者内存这些外部存储存取速度比CPU运行速度过于缓慢,以及需要在计算机内部记录一些运行状态,比如是否开启分段分页,底层数据是大端小端存放之类。我们通常在CPU内部设置一些更加高速以及专用的空间,这些空间称为寄存器,多个寄存器构成了一个寄存器组。寄存器早期每一个都有专门的用途,比如1号寄存器用于存放计算第一个数据(3+4的3),2号存放计算第二个数据(3+4的4),3号用于存放结果(3+4后的7),4号用于传参,5号用于记录栈帧地址等等。现代计算机由于寄存器数目逐渐变多,一部分依旧是专用的,但大部分是随意使用(高级语言中寄存器是编译器进行分配使用,但编译器还是避开了一部分专用的寄存器)。整个ISA就设计完毕了。ISA指的是指令集体系结构,包括指令与寄存器组。这时逻辑上的CPU接口已经被我们设计出来了,剩下的只是对内部部件的设计以及对CPU处理顺序以及一些细节的优化。

而类似intel这类要生产出实体芯片的公司,到这里就可以兵分两路,一路对这个ISA使用高级语言实现一个模拟器(开发速度更快,但运行速度慢),通过这个模拟器测试这个ISA运行软件的效率。一路使用HDL语言逻辑上实现出这个处理器。

大学里面,数字电路课程对应使用HDL开发芯片,模拟电路对应将设计好的逻辑上的芯片真正固化到实体的芯片上。数字电路可以知道,计算机内部所有的逻辑都

是由与或门组成的,包括最上的所有语言,都是最终转换为与或门,再向下走就是pmos、cmos之类的了。而模电则表现真实的电路是存在干扰的,并非逻辑所想的理想状况,从逻辑固化到芯片需要考虑到这些因素。

到现在简易CPU已经做出来了,我们已经可以在这个CPU上跑软件了,只是效率远达不到现代CPU的速率。想要提高效率,那么需要加入其它的高级技术,比如

流水线、多发射、分支预测、乱序引擎等等,intel这类芯片公司显然是加入了这些技术的。

指令首先在磁盘中,以N/S级表示10来表示,通过磁盘驱动装置,转换为高低电平表示10加载到内存,高低电平通过电路输送到CPU,送到译码器进行判断,判断

是什么指令类型(指令编码方式在ISA设计的时候就进行了设计),并根据相应的类型生成对所有部件的控制信号,控制信号控制CPU中的部件进行执行或者等待,等电路经过一次,那么这个指令执行完毕

CPU本身只能进行运算,还需要其他部件的配合,才能组成真正的计算机系统。因此,也就有了计算机内部的总线,用于连接CPU之外的部件(CPU内部也可以实现为总线结构),如内存,键盘,显示器等,数据以及命令在总线上相互传输。这个总线是电缆的形式,总线算是CPU与电脑中其他部件的一种通信与数据传输。

但是光一个电脑只能说是一个单机,现在的网络实际上可以看成是一种更大的CPU与外设的通信,电脑与电脑之间通过电缆/光纤/wifi路由器(都是通信媒介)进行

通信,并相互之间进行数据传输。但是与外设通信不同的是网络更大了,传输数据的代价比之大的多,干扰因素也多得多。因此需要确定数据传输的方向(不可能整个网络全部传输),需要确定策略怎么传失败的可能性最小失败了重传的信息量更小,怎样排除外界干扰,怎样才能跨不同链路进行传输。这样整个的组成了计算机网络的研究课题。

但是光一个电脑只能说是一个单机,现在的网络实际上可以看成是一种更大的CPU与外设的通信,电脑与电脑之间通过电缆/光纤/wifi路由器(都是通信媒介)进行通信,并相互之间进行数据传输。但是与外设通信不同的是网络更大了,传输数据的代价比之大的多,干扰因素也多得多。因此需要确定数据传输的方向(不可能整个网络全部传输),需要确定策略怎么传失败的可能性最小失败了重传的信息量更小,怎样排除外界干扰,怎样才能跨不同链路进行传输。这样整个的组成了计算机网络的研究课题。

一个硬件系统只能执行一个程序,比如写字本程序,一旦执行了写字本程序,那么QQ又无法运行了,这样太不方便(虽然说很早期的计算机是这样的)。于是我们想要执行多个程序,让每个程序都像在一起执行一样(实际是一个程序运行一段时间,然后就换成另一个程序,由于CPU运行的很快,这样就像是两个程序同时运行一样)。

我们需要对于CPU使用时间进行管理,一个程序不能占用太多时间。需要对内存进行管理,两个程序使用的内存空间不能相互重合。对权限进行管理,这个程序权限不够则不能访问。对其他资源进行管理,光驱只有一个,只能一个程序使用,另一个必须等待。对磁盘中的文件进行管理,需要知道什么文件对应磁盘哪个位置,像桌面的test.txt文件,开始对应第几个磁盘的第几个磁道的第几个扇区。等等。

如果这些功能全部由开发软件的人员进行处理,那么开发人员所需要处理的问题太多了,繁杂到无关的事的时间比真正开发的时间还要长。因此人们为了把底层硬

件实现的细节隔离开(软件可以跨CPU使用)以及支持以上的功能,即内存管理、进程调度、文件系统等等,设计了一个大型软件,叫操作系统(Operation System)。

需要注意的是,大学里面的操作系统课程,主要是讲所有的操作系统的一些构成,以及实现这些构成的算法。几乎较少讲具体的实现,因为担心若是讲了实现那么学生会局限在这个实现中,而不能理会到真正抽象的含义,实际的操作系统实现要灵活的多。

当然操作系统一部分功能的实现是和CPU直接相关的,甚至于操作系统底层的代码直接是汇编代码(ISA定义指令的助记符,助记符,帮助记忆的符号),因此很多软件所谓跨平台是在操作系统以及编译器之上的跨平台,操作系统本身是不能跨CPU平台的(除非使用JIT编译,但是通常几乎没有这么做的),目前操作系统要跨CPU运行一般是修改底层相关联的汇编代码,即嵌入式所谓的移植。

在之前我们提到过,指令是以编码的形式存在于计算机中的,在磁盘中以N/S磁级表示10来记录指令,在内存中以电压高/低表示10来记录。这样100010(乱编的)就表示move指令,但是如果叫程序员编程序:101010100100001000,这样写,看着看着就晕了,而且有了错很难认出写的是什么指令。因此一方面为了便于程序员编写程序,一方面为了容易调试读代码,将这些10串记为一些助记符,这些助记符就称为汇编程序。比如1001记为mov,而程序员写mov即可,而实际的机器还是只认1001,那么就通过一个汇编器进行转换,将mov转换成1001就可以了,转换后的代码可以直接在CPU上执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: