计算机系统结构
八个伟大思想
1. 面向摩尔定律的设计
指出在一个芯片上集成的晶体管数量每18到24个月就会翻一番。(目前已经废除)
2. 使用抽象简化设计
使用抽象用来表示不同的设计层次,高层次的看不见低层次的细节,只能看见一个简化的模型。
怎么分层提高效率呢?在计算机系统的设计中,我们可以有以下几层:
应用层: 这是用户直接交互的层,如浏览器、文字处理软件等.在这个层次上,我们看不到硬件的具体细节,只能看到各种应用程序.
操作系统层: 这一层管理计算机的硬件资源,并为应用程序提供服务.在这一层,我们看不到硬件的具体操作,只能看到操作系统提供的接口和功能.
硬件驱动层: 这一层是操作系统和硬件之间的桥梁,负责控制和管理硬件设备.在这一层,我们看不到硬件的物理结构,只能看到驱动程序提供的接口.
硬件层: 这是系统的最底层,包括处理器、内存、硬盘等硬件设备.在这一层,我们可以看到物理设备的具体细节.
通过使用抽象,设计师和程序员可以更加高效地工作,因为他们不需要同时关注所有的细节.
每个层次的抽象都为上一层提供了一个简化的模型,使得设计和开发过程更加可控和可管理.
在软件设计中也是同理.抽象通常通过以下几个层次来实现:
概念层次: 这是最高层次的抽象,通常涉及系统或应用程序的整体概念和设计.在这一层次,设计师关注系统的功能需求、用户交互和整体架构,而不涉及具体的实现细节.(产品、架构)
逻辑层次: 在这一层次,设计师开始关注如何实现系统的各个部分.他们设计算法、数据结构和对象模型,但仍然不涉及具体的编程语言或平台.(架构师)
物理层次: 这是最低层次的抽象,涉及具体的编程语言和工具.在这一层次,程序员编写代码、进行测试和调试,以确保系统按照设计正确运行.(码农)
通过使用抽象,设计师和程序员可以更加高效地工作,因为他们不需要同时关注所有的细节.
每个层次的抽象都为上一层提供了一个简化的模型,使得设计和开发过程更加可控和可管理.
可以看见,抽象之所以能够提高我们的效率,主要是因为它允许我们关注问题的核心,而不是被不必要的细节所困扰
。通过将复杂系统分解为更小、更易于管理的部分,并定义这些部分之间的接口和行为,我们可以更高效地设计、开发和维护系统。这样,高层次的设计者可以不必关心底层的实现细节,只需关注高层次的设计问题,从而提高了开发效率。
3. 加速大概率事件
是优先关注那些对系统性能影响最大的操作或组件,并对其进行优化。通过集中资源和精力在这些关键点上,我们可以更有效地提升系统的整体性能和效率。
也正是由于这个思想,我们诞生出了非常多有名的策略. 比如缓存,比如数据压缩,比如预处理,预测和推测执行等等.
缓存: 是一种常用的优化技术,用于加速数据的访问速度。通过将频繁访问的数据存储在高速缓存中,可以减少对慢速存储设备的访问,从而提高整体性能。
数据压缩: 在数据传输或存储时,通过压缩数据可以减少所需的空间或带宽。这有助于减少I/O操作、提高存储效率,并加速数据传输。
预处理: 通过提前对数据进行处理或计算,可以避免在实时处理时的复杂性和延迟。预处理可以包括数据清洗、索引创建、聚合计算等。
预测和推测执行: 这些技术试图提前预测或猜测未来的操作或需求,从而提前进行准备或执行。例如,预测模型可以预测用户的下一个操作,而推测执行则可以尝试提前执行某些操作以提高响应速度。
4. 通过并行来提高性能
并行与并发的区别:
- 并行是指同一时刻做多件事情
- 并发是在一个时间段内做多件事情
从计算机诞生到现在,包括我们日常的学习,并行随处可见.也是我们后续课程将会十分强调的一点.这个后面会慢慢学到. (通俗的讲, 对于多核就是同时工作; 对于单核就是宏观上的同时工作, 微观上的串行工作 (比如一个人可以同时烧水喝煮饭, 看起来是同一个时间段内做的, 但实际上肯定是两件事分开单独做的)(此处没有讨论操作系统的线程以及超线程等))
5. 通过流水线来提高性能
流水线(Pipeline) 是一种经典的并行处理技术,它将一个复杂的计算任务拆分成多个连续且相对独立的阶段,并让这些阶段像工厂流水线一样依次执行。
例如,在处理器设计中,指令执行通常可以分为取指(Fetch)、译码(Decode)、执行(Execute)、访存(Memory Access)、写回(Write Back)等多个阶段。通过流水线技术,不同的指令可以在不同的流水线阶段同时进行处理,每个阶段都有专门的硬件单元来处理,从而实现并行执行。
当一条指令进入流水线时,它依次经过每个阶段,并在每个阶段完成一部分操作。同时,下一条指令也开始进入流水线,并在前一个指令还在流水线中执行时开始执行。这样,流水线中的每个阶段都在处理不同的指令,从而实现了指令的并行执行。
流水线的设计可以显著提高处理器的性能。通过并行执行指令的不同阶段,处理器可以在同一时间内处理多条指令,从而提高了吞吐量。此外,流水线还可以减少指令之间的依赖关系,使得处理器可以更加高效地执行指令序列。
然而,流水线也面临着一些挑战和限制。例如,流水线的性能受到流水线深度的限制,即流水线中分的阶段的数量。如果流水线过深,可能会导致处理器的延迟增加,从而影响性能。此外,流水线的效率还受到指令之间数据依赖关系的影响,如果指令之间存在数据依赖关系,那么它们就不能在流水线中并行执行。
6. 通过预测来提高性能
预测技术通过预测未来的指令或数据,提前进行预取和预处理,从而减少等待时间和提高处理速度。
指令预测
指令预测是一种预测技术,用于预测下一个要执行的指令。处理器可以基于之前的指令序列来预测未来的指令,并提前进行解码和准备。这样,当实际的指令到达时,处理器可以更快地执行它,从而提高执行速度。
分支预测
分支预测是另一种常见的预测技术,用于预测条件分支指令的结果。处理器会尝试预测分支指令是否会被执行(即条件为真或假),并提前加载和执行相应的指令。这样,当分支指令的结果确定时,处理器已经准备好了要执行的指令,从而避免了延迟。
缓存预取
缓存预取是一种预测技术,用于预测哪些数据将被访问,并提前将这些数据加载到缓存中。处理器可以基于之前的访问模式来预测未来的数据访问,并提前从内存中加载这些数据到缓存中。当实际访问这些数据时,它们已经位于缓存中,从而提高了访问速度。
然而,预测技术也存在挑战和限制。预测算法可能出错,导致预测不准确。当预测失误时,系统需要进行恢复操作,这可能会引入额外的延迟和开销。因此,设计预测算法时需要权衡预测准确率和恢复操作的代价。
因此,设计高效的预测算法并在硬件实现中持续优化它们是现代高性能计算系统的重要研究领域之一。随着技术的发展,新的预测策略和技术不断涌现,比如更复杂的动态分支预测器、基于机器学习的预测算法等,以期进一步提高预测准确率并减少预测失败带来的损失。
7. 存储器层次结构
旨在解决不同存储器设备在速度、容量和价格之间的矛盾。这种层次结构通过将不同类型的存储器按照其特性和成本效益组织成多个层次,从而实现了高效的数据访问和管理。
存储器层次结构是计算机系统设计中的一个核心概念,旨在解决不同存储器设备在速度、容量和价格之间的矛盾。这种层次结构通过将不同类型的存储器按照其特性和成本效益组织成多个层次,从而实现了高效的数据访问和管理。
最顶层通常是寄存器(Registers)或者缓存(Cache),它们速度最快,但容量最小,且单位容量的成本最高。CPU可以直接访问寄存器,而高速缓存则用来临时存储最近频繁使用的数据或指令以减少主存访问次数。
下一层是主存(RAM,Random Access Memory),其速度相较于寄存器和缓存慢,但容量大得多,价格也相应降低。主存是CPU直接寻址和交换数据的主要区域。
再下一层可能包括虚拟内存(Virtual Memory)、磁盘缓存(Disk Cache)等,它们的速度进一步下降,但提供更大的存储空间,同时价格相对更低。
底层则是硬盘驱动器(HDD)和固态硬盘(SSD)等永久性存储介质,它们的访问速度最慢,但提供了TB级别的大容量存储,并且单位存储成本最低。
在这个结构中,速度慢,容量大,价格便宜的在最底层。速度快,容量小,价格贵的在最上层。
通过这种分层设计,当程序需要数据时,优先从最快的存储层级查找,如果未命中,则逐级向下查找,并在较高级别存储中保留一份副本,以便后续再次访问时能更快地获取数据。(也就是让最常用的数据离CPU最近)这样,即使是最慢的存储层也可以提供足够的存储空间,而最快的层保证了大部分时间内的高效数据访问,从而提升了整体性能并平衡了各种需求之间的矛盾。
通过合理地组织和管理不同层次的存储器设备,可以减少访问时间和等待时间,提高系统的整体性 能.后面我们会专门学习到这一部分的内容.
8. 通过冗余提高可靠性
是通过增加额外的硬件组件来提高系统的可靠性和容错能力。
尤其是在需要高度可靠性的应用中,如服务器集群、航空航天、医疗设备等。冗余部件的引入意味着在系统中增加了额外的硬件组件,这些组件通常是关键部分(如处理器、存储器、通信通道等)的复制品,它们处于待命状态,一旦原始组件发生故障,冗余组件可以立即接管工作,从而确保系统的连续运行和数据的安全性。
常见的冗余方式
处理器冗余: 使用多核处理器或者构建集群系统,当一个核心或节点失效时,其他部分可以接管任务,保证服务不中断。例如,云计算平台中的服务器集群就广泛采用了这种 策略。
存储冗余: RAID(Redundant Array of Independent Disks)技术是一种常见的存储冗余方法,通过磁盘阵列将数据分布在多个硬盘上,实现数据备份、错误校验以及在单个硬盘故障时仍能正常读写数据。
网络冗余: 在网络设备中设置备用路径或备用设备,如负载均衡器、交换机的链路聚合(Link Aggregation)、路由协议中的热备路径等,当主路径出现问题时,流量可以迅速切换到备份路径或设备。
电源冗余: 数据中心通常会采用双路供电或多路供电系统,确保一路电源故障时另一路电源能够继续为服务器和其他关键设备供电。
冷却冗余: 大型数据中心还会对冷却系统进行冗余设计,以防止因冷却系统故障导致服务器过热而宕机。
这个方式随处可见,比如每次双十一,阿里巴巴都会弄很多台服务器,一台服务器崩了,另一台立刻接管. 包括我们日常生活,汽车都会搞个备用轮胎等等的意思是一样的。
然而,冗余策略并非没有代价。它增加了系统的成本、复杂性和能耗。因此,在设计系统时,需要在性能、可靠性和成本之间进行权衡。