02计算机组成原理-计算机硬件设计思想及软件

02计算机组成原理-计算机硬件设计思想及软件

上节课篇幅够长了,计算机设计思想那一块说的比较粗略,这节课着重来讲一下计算机设计思想

1.计算机设计思想

1.1面向摩尔定律的设计

1.面向摩尔定律的设计:指出一个芯片上集成的晶体管数量每18到24个月就会翻一番。(目前已废除)

这是上个世纪6-70年代由于技术的进步,经济的发展,大家为了使自己的工业水平保持竞争力,晶体管数量增长的比较快,即技术增长比较快,后来随着物理的限制,不可能在一个芯片上放无限个晶体管吧,所以随着物理定律的限制,这个思想基本已经废除。

1.2使用抽象简化设计

2.使用抽象简化设计:使用抽象用来表示不同的设计层次,高层次的看不见低层次的细节,只能看见一个简化的模型。

其实不仅在这个地方会用到,在机器语言,汇编语言,高级语言,其实也是一层一层的往上进行抽象,使得高层次的看不见低层次的细节,高层次用低层次的接口去进行操作。

计算机系统的设计中的抽象:

例子1:硬件方面

1.应用层:应用层就是我们平时用的软件-QQ,微信等,用的时候我们不关心数据怎么从磁盘中调到内存的,又是怎么从内存中调到CPU的,最后如何显示在显示器上,所以我们不用管具体的实现细节。

2.操作系统层:这一层是用来管理计算机的各种软件资源并位应用层提供服务,在这一层仍然看不到硬件上的具体操作,只能看到操作系统提供的一些功能和接口。

3.硬件驱动层:操作系统并不是直接操作硬件,中间还有一个负责管理和控制硬件的硬件驱动层,大家用的鼠标或者键盘要插到电脑,电脑提供的那个口子就是硬件驱动层提供的接口。

4.硬件层:这一层硬件真正的动了起来。

例子2:软件方面

1.产品/架构:概念层次:这一层是这个软件要实现什么样的功能,但具体实现不管,类似于产品经历提需求。

2.架构师:逻辑层:架构师得知要写的产品后,写一个大框架,每个功能需要用什么样的数据结构来存储,用什么算法来运算。

3.码农:根据架构师写的概要,真正开始的写代码。

1.3加速大概率事件

3.加速大概率事件:是优先关注那些对系统性能影响最大的操作或组件,并对其进行优化。通过集中资源和精力在这些关键点上,我们可以更有效地提升系统的整体性能和效率。例如把经常访问的数据调入到缓存中,这样就减少了对慢速设备的访问。

这个设计思想最终的就是优化瓶颈,在开发的时候我们往往会遇到少数的几个关键操作耽误了我们整体的进度,如果遇到这些瓶颈时的解决效率变高,那我们整体的效率就会变快,换句话说就是要解决主要矛盾。

由这个设计思想我们产生了几个新的设计思想

缓存:使用缓存来加速访问速度,将频繁访问的数据放到缓存里,我们知道CPU的访问速度要比主存储器要快很多,如果CPU需要一些数据的时候,由于CPU和主存储器的速度匹配不上,CPU会等主存储器就造成了时间的浪费,我们就发明一个缓存,把那些频繁访问的数据放到高速缓存(Cache)中,这样就能减少对主存储器(慢速设备)的访问。

数据压缩:我们知道往群里面传送大文件时,我们会通过一些压缩软件把大文件进行压缩,而这个压缩包的大小就会变小,然后我们再去上传,用的时候拿下来解压缩。通过压缩数据,数据所占空间变小,这样就有助于我们进行数据传输的效率,减少一些IO操作,提高存储的效率。

预测/推测执行:通过一些算法,计算机预测用户下一个操作是什么或者接下来会执行什么,把预测的这个操作直接加载到系统中,等到执行时直接运行就可以,这个思想就是我们后面的第六个思想,等讲到时再细聊。

以上的操作都是核心思想都是有限去处理对系统性能影响最大的操作,我们把大部分资源用到这些身上就能大幅度提高我们系统的性能。

1.4通过并行来提高性能

4.通过并行来提高性能:"同时"做多件事,但其实对于单核计算机看似并行实则是并发,只是在一个时间段内"同时"做多件事,要想完成真正的并行可以通过加处理器来完成,这里就不过多赘述,后面会细讲。

并发:同一时间内,采用交替执行的方式(单核CPU),具体到每一个时刻其实是只做了一个任务的。这是宏观上并行,微观上串行。

并行:同一时刻可以处理多个任务。这个得用多核处理器。

1.5通过流水线来提高性能

5.通过流水线来提高性能:流水线(Pipeline)是一种经典的并行处理技术,它将一个复杂的计算任务拆分成多个连续且相对独立的阶段,并让这些阶段像工厂流水线一样依次执行。

指令流水线:指令执行。

加法指令:这里就先说一下大概的加法指令需要的操作,后续会详细讲

取指 译码 执行 访存 写回

取指 译码 执行 访存 写回

取指 译码 执行 访存 写回

取指 译码 执行 访存 写回

取指 译码 执行 访存 写回

这五个阶段用到的硬件不一样,所以我们可以搞"流水线",并且每个阶段所用的时间我们会控制在同一时长内。比如第一条指令在译码过程的时候,第二条指令就可以开始取指了,这样每个硬件都会有活干,就像流水线工厂一样。

但这个思想并不是万能的,如果两条指令需要用到同一个数据,那就不能这样做,因为可能你在第一条指令的时候改了数据导致第二条指令用了错误的数据。

以上就是单核处理器(CPU)的时间并行的直观体现 ------多个指令在同一时间段内,同时处于不同的执行阶段,让 CPU 的硬件资源(取指部件、译码部件、执行部件等)被充分利用

1.6通过预测来提高性能

6.通过预测来提高性能:预测技术通过预测未来的指令或数据,提前进行预取和预处理,从而减少等待时间和提高处理速度。

指令预测:预测/推测执行:通过一些算法,计算机预测用户下一个操作是什么或者接下来会执行什么,把预测的这个操作直接加载到系统中,等到执行时直接运行就可以

分支预测:

cpp 复制代码
if(条件){
执行1
}
else{
执行2
}

这个是根据一些算法,预测下一个可能执行的情况,如果预测的是1就预先加载执行1所需的数据加载进来,反之。但是这样会有一个预测失败的风险。因为是预测所以不可能是100%预测成功,一旦失败会带来更高的延迟,本来直接加载就行,加载了错误的数据反而效率变低。

缓存预取:根据以前的经验看看哪些数据会被用到,直接去缓存中拿就完了。

预测的这个思想有个很大的风险就是预测失败会使得效率反而变低,所以设计的时候要设计好预测的概率和预测失败的代价。

1.7存储器层次结构

7.存储器层次结构:旨在解决不同存储器设备在速度、容量和价格之间的矛盾。这种层次结构通过将不同类型的存储器按照其特性和成本效益组织成多个层次,从而实现了高效的数据访问和管理。

其实就是性能和价格的衡量。

先来看下面这段前言:

高速缓存 磁盘

快 满

既然高速缓存的访问速度快,说明用的材料就很好,造价就比较贵,理论上我们的所有存储器都做成高速缓存,但是这样就会很贵。

同样的价格可能高速缓存1个G,磁盘有1个T,我们为了造价和性能考虑会把高速缓和和磁盘相互配合这样就有了存储器的分层。

存储器分层:

越贵的就少用一点,便宜的就多用一点

第一层.(逻辑上)最接近CPU越快,成本高,容量小----寄存器,高速缓存(Cache)---常用的数据/指令。

第二层.主存储器(主存/内存),慢一些,成本低一些,容量大一些。开机后从硬盘中根据需要调入主存中,关机时主存里是不存东西的。---易失性介质。

第三层.虚拟内存/磁盘缓存。虚拟内存是一种技术,有时我们觉得内存太小了,扩大内存又没钱搞,硬盘上有空间,就用技术在硬盘上搞一块内存下来。(先这么理解,后续会讲)。

最底层:硬盘(2013,14年以前大部分电脑还是用机械硬盘,现在基本是用固态硬盘SSD)速度最慢,成本最低,容量最大。所有的数据最终都是存到硬盘上的,哪怕是电脑关机的状态---永久性存储介质。

1.8通过冗余提高可靠性

8.通过冗余提高可靠性:是通过增加额外的硬件组件来提高系统的可靠性和容错能力。

备份:

备份一些重要的硬件,万一一些重要的硬件坏了那可能会有很大的影响,比如服务器集群信息丢失,所以备份一些重要的硬件很重要。

数据冗余:

不依赖额外硬件,而是通过多副本存储实现容错。比如云盘的文件会在不同机房存储 3 个副本,即使一个机房的存储设备故障,另外两个副本依然可用。

控制冗余:

比如航天计算机的 "三取二" 表决机制:同时用 3 套相同的计算单元执行同一指令,取 2 个结果一致的作为最终结果,避免单个计算单元出错导致任务失败。

额外组件:

服务器的双网卡冗余:两块网卡同时工作,一块故障时另一块自动接管,保证网络不中断;

冗余的本质是用 "额外成本" 换取 "系统高可靠性",不是所有场景都需要冗余 ------ 比如普通家用电脑很少做硬件冗余,而金融交易、航天控制、医疗设备等对可靠性要求极高的场景,必须依赖冗余设计。

2.计算机软件

先来看软件和程序的区别。

当你下载一个软件的时候,会有一个安装包,这个安装包不仅有你编写的代码,还有一些相关的库文件,配置文件和一些相关的文本文档再加上程序等共同构成了这个软件,程序只是里面的代码文件。我们平时写代码用的是高级语言(C++,JAVA,C等),硬件不能识别,硬件识别的是二进制代码,那我们写的代码怎么让硬件去执行呢,这里面就涉及到一个语言的转化。

应用程序到硬件执行要系统软件来介入。系统软件的主要作用是为应用程序和硬件之间提供一个桥梁,使得应用程序能够被硬件所识别和执行。

系统软件:提供常用服务的软件,包括操作系统、编译程序、 加载程序和汇编程序等。

涉及到语言转换的是下面这两个:

操作系统:一个关键系统软件,它为用户提供了与硬件交互的界面,并管理计算机的各种资源。同时,操作系统还提供了很多其他的功能,如任务调度、内存管理、设备驱动等,以确保计算机的稳定运行和高效使用。

编译程序:责将高级语言编写的源代码翻译成机器语言,以便硬件能够执行。

从上可以看出软件是分系统软件和应用软件的。

系统软件:保证计算机高效正确运行的基础软件。例如:OS 数据库管理系统 语言处理软件 分布式软件 网络软件...

应用软件:用户使用的软件。例如:QQ,微信...

接下里来看什么是高级语言,什么是汇编语言呢?

机器语言 :计算机可以将二进制代码存储在内存中,并且执行这些代码。

二进制位:也称为位(bit), 基数为2 的数字中的 0 或 1,它是信息的基本组成元素。

其实最早的时候计算机用的进制不是2进制,是通过前人的不断思考总结最后采用的2进制。2进制刚好可以表示开关,通电不通电,高电压低电压,是通过电路来实现的。

指令:计算机硬件所能理解并服从的命令(也是二进制位串)。

在计算机内部,指令和数据并没有本质的区别,它们都是以二进制形式存储的。如何区分它们?

通过执行周期(后续会详细讲)。

汇编语言:以助记符形式表示的机器指令。

高级语言:高级编程语言 C+ +、 Java 等可移植的语言,由一些单词和代数符号组成,可以由编译器转换为汇编语言。

第一代的程序员真的就是用二进制写,他们需要去记不同的二进制数代表什么操作,然后去写代码。后来人们意识到这样搞下去不行,所以发明了助记符,比如add表示加法对应什么指令,就可以用助记符去写代码然后人工进行翻译,这就是汇编语言。因为汇编语言是根据电路来设计的,有的地方可能记0001为加法,有的地方可能记0000为加法,所以不同的架构,对应的汇编语言是不一样的,比如MIPS对应的add是对应一套二进制,x86就是另外一套二进制。我们这门课会按照MIPS来讲。后来我们继续抽象就有了高级语言,这样就更轻松了。

从高级语言到机器语言:
预处理就是展开头文件(如#include <stdio.h>)替换宏定义,移除注释,处理条件编译(如#ifdef)这些。

编译过程就是检查语法 / 语义错误,并将预处理后的 C 代码翻译为对应架构的汇编代码(如 x86/MIPS 汇编)。

再通过汇编器(如as)将汇编代码翻译为机器码,生成可重定位目标文件(二进制文件)。

最后链接,合并多个目标文件(如你的代码 + 库函数的目标文件),解析未定义的符号(如printf函数),将库函数(如 STL、stdio 库)的机器码整合到最终程序中,生成可执行文件。

大概先写这些吧,今天的博客就先写到这,谢谢您的观看。

相关推荐
散1122 天前
02计算机组成原理-计算机概述
计组
渡我白衣12 天前
计算机组成原理(14):算术逻辑单元ALU
大数据·人工智能·算法·机器学习·计组·数电·alu
渡我白衣19 天前
计算机组成原理(12):并行进位加法器
网络协议·tcp/ip·算法·信息与通信·tcpdump·计组·数电
渡我白衣21 天前
计算机组成原理(11):加法器
python·机器学习·numpy·pandas·matplotlib·计组·数电
渡我白衣1 个月前
计算机组成原理(10):逻辑门电路
android·人工智能·windows·嵌入式硬件·硬件工程·计组·数电
Kyle01231 个月前
计算机体系结构中的中断处理机制:硬件响应与软件识别的协同架构
架构·操作系统·计组
Kyle01232 个月前
共享代码浮动与编制浮动程序的含义与机制
计组
Kyle01232 个月前
Cache缺失、缺页和TLB缺失的处理机制解析
操作系统·408·计组
岑梓铭3 个月前
考研408《计算机组成原理》复习笔记,第五章(5)——CPU的【指令流水线(含中断)】
笔记·考研·408·计算机组成原理·计组