在学习计算机的这几年,一直有些很基础的问题困扰着我,C++、Java照写,但总感觉没有底气。本科学过操作系统、数据结构、微机原理、数字电路,(不知是不是因为我给忘干净了还是咋的,)平时遇到学术道友聊自己做risc的,做高速总线的,做高性能计算的,做fpga加速的,又感觉自己啥也不知道了。归根结底还是计算机知识基础薄弱,儿时没有受到该有的熏陶,上大学又不感兴趣没好好看书。 今年我研二,在经历了痛定思痛的2020上半年后,想明白了很多,我决心(发自内心的)想了解它、学好它了。(这段“讨厌计算机——我还挺爱,继续战斗!”的内心经历有人感兴趣的话后面也可以总结放上来),总之Hello ,大家一起冲鸭!
• (层1)应用程序 • (中间)API:application programming interface,它是IT产业建生态的起点,是应用程序的高级语言编程接口,(Java、C等都是API),所有应用程序都是API编出来的。 • (层2)操作系统 • (中间)ISA:指令系统,是实现目标码兼容的关键,即应用软件兼容的关键,是生态建设的终点。指令系统就是从应用程序算法中抽取出来的算子。只有对应用程序有深入了解,才能决定哪些事情通过ISA由硬件直接实现、哪些事情通过指令组合由软件实现。 • (层3)硬件系统(要针对应用程序的行为进行优化:1.预读取提高流媒体处理性能;2.由应用程序访存的局部性设计高速缓存;3.应用程序转移行为的重复性和相关性实现CPU的转移猜测算法) • (中间)工艺模型:芯片生产厂家提供给芯片设计者的洁面,提供实现PCIE接口的物理层、提供各种IP • (层4)晶体管
• 最核心思想:将数据和程序分别存在存储器中,CPU从内存中取指令和数据进行运算,再将计算结果存入内存。即:存储程序和指令驱动执行。 • 解决了自动化问题:将人为下达的执行指令,设计成计算机可读的指令存起来。而非像人脑一样“内存中”只存数据。 • 局限:什么都保存在内存中使得访存成为性能瓶颈。
• 完成一个任务的指令数首先取决于算法。比如不同的排序算法,由于时间复杂度不同,执行的指令数可以差100倍。 • 价格:对同一款产品,成本曲线是不断降低的。产量的提高可以加速学习过程,提高成品率,降低一次性成本。 • 功耗:芯片是功耗的主要组成部分。
• 指令系统之前严格划分着pc的软硬件系统,但随着虚拟机和二进制翻译系统的出现,软硬件界面模糊了 • 2010年之后,随着计算机软硬件基础的不断成熟,IT产业的主要创新从工艺转向应用。 • COMS的方法逼近物理极限,面临着原子和量子机制的边界 • 近年:体系结构主要研究都是在解决处理器和内存速度的差距问题——高速缓存 • 访存带宽不够——总线。摩尔定律第一个杀手 功耗;第二个杀手 带宽问题。 • 晶体管工艺中:设计和验证能力的提高赶不上晶体管增加的速度,形成剪刀差。 • 性能功耗比:成为这个阶段计算机体系结构设计的首要目标。追求高性能—变为—高吞吐率 • 发展趋势:网络服务和移动计算;可以处理流式数据,支持数据级和线程级并行
• CPU计算性能和访存带宽平衡的经验原则:峰值浮点运算速度和峰值访存带宽1:1左右 • 主要因素和次要因素的统筹兼顾——优化到不能再优化的时候,次要因素往往会成为瓶颈
• 事件局部性 ——RISC(精简指令集计算机)指令系统的提出就是利用“指令的事件局部性”对频繁发生的事件进行重点优化的例子 • 访存局部性 • 时间局部性:高速缓存 • 空间局部性:TLB、预取
• 时间并行:指令流水线 • 空间并行:多发射、超标量,即乱序执行、允许超车
• 主要指单指令流多数据流(SIMD)的向量结构。作为指令级并行的有效补充,在流媒体领域发挥重要的作用,尤其在专用处理器中应用很多。
• 大量存在于Internet应用中 • 代表是多核处理器、多线程处理器 • 并行粒度大
• 虚拟存储技术:程序员编程时不需要直接和物理内外存打交道 • 多线程(SMT)和虚拟机技术,虚拟了CPU • 虚拟机技术:通过微结构的硬件增强,如设立多组控制寄存器和系统状态等,实现多个操作系统的快速切换,达到在同一台PC上“同时”运行多个操作系统的目的 • catch技术:可以使程序员看到一个“像catch那么快,像内存那么大”的存储空间
• 设计原则:兼容性、通用性、高效性、安全性等、
• CISC:complex instruction set computer,复杂指令集。其指令长度可变,CPU在执行过程中将其翻译成一条或多条微代码。(二八定律)在CISC指令集的各种指令中,其使用频率却相差悬殊,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20%。 • RISC:reduced instruction set computer,精简指令集。指令长度相对固定; • VLIW:very long instruction word,超长指令字。本质上讲是多条同时执行的指令的组合;
• 三者关系:CISC的典型代表是X86,RISC的典型代表是ARM,两者区别在于指令集zhi复杂度,CISC有很多指令集,一个指令可能是一系列底层硬件操作的打包,而RISC相对指令集简单、直接,但相对操作要更复杂,简单点理解:CISC是硬件版VB,你不需要怎么关注底层实现,RISC是硬件版C,VB下很简单实现的事可能要大费周折才能实现,但你折腾下来你会发现能效比较高。现代的CPU往往采用CISC的外围,内部加入了RISC的特性,如超长指令集CPU就是融合了RISC和CISC的优势,成为未来的CPU发展方向之一
• 现代操作系统含保护模式,将程序分为两个权限等级:用户态、和心态。 • 虚拟化服务在服务器领域特别有用,它不绑定任何底层硬件,可当作软件进程。虚拟机中同样支持不同的运行级别。为提高效率,硬件辅助虚拟化已经为虚拟化发展的必然趋势。(如VT、SVM)
• 指令=操作码+操作数
• 运算指令 • 访存指令 • 转移指令 • 过程调用 • 过程返回 • 特殊指令
• P43,列举了过程(函数)调用、流程控制语句等的高级语言与汇编码对应。
• 异常的概念:计算机按照软件执行流进行顺序执行和跳转,有时会需要中断正常的执行流程去处理其他任务,触发这一过程的事件统称为异常。
• 外部事件(中断):例如操作系统中IO的处理。在嵌入式系统中,CPU的主要作用之一就是处理外设相关事务,因此中断发生的数量很多,也非常重要。 • 指令执行中的错误 • 数据完整性问题 • 地址转换异常(常见) • 系统调用和陷入 • 需要软件修正的运算
• 处理器中有存储管理部件,即MMU(memory management unit),负责构建虚拟的内存地址,将虚拟地址转换至物理地址、多进程空间管理管理等工作。 • 具体体现之一是TLB的结构和使用,这部分也属于操作系统的重点内容,笔者已经掌握,不再赘述。
• 关键:API——ABI——ISA,三层实现结构。 • 在API和ISA之间有一层应用程序二进制接口,即ABI(application binary interface),它是应用程序访问计算机硬件及操作系统服务的接口,由计算机的用户态指令和操作系统的系统调用组成;它是程序在某个指令系统上执行时,必须遵循的一些特定的规定;它包括寄存器使用、函数调用、数据表示格式等约定。
• 1.键盘产生一个信号送到南桥芯片,南桥芯片将键盘编码保存在一个寄存器中,并向处理器发出一个外部中断信号。 • 2.中断信号传到CPU内部,把其中一个称为cause的控制寄存器的某一位置为“1”,表示收到了外部中断。 • 3.CPU中另外一个控制寄存器status中的“屏蔽位”确定是否处理这个中断信号 • 4.屏蔽处理后的中断信号附在一条译码后的指令上送到重排序缓冲ROB中,等待CPU处理(exception不会被功能部件执行) • 5.系统态设为核心态,保存exception原因、设置操作系统处理exception的计数器入口。 • 6.操作系统保存现场,向CPU的控制寄存器读取exception原因,发现是有人敲了空格键。 • 7.操作系统查找空格键是谁给的:有没有进程处在阻塞状态等键盘输入——发现是powerpoint • 8.进程响应空格,把powerpoint唤醒,运行状态下ppt发现操作系统传来的数据是键盘输入空格,表示翻页 • 9.ppt把下一页内容准备好,调用操作系统中的显示驱动程序,把要显示的内容送到显存,由图形处理器GPU通过访问显存空间刷新屏幕。
• 系统调用运行在核心态,是操作系统内核为用户态程序实现的子程序
• 基于互斥的同步机制、锁机制、阻塞机制等的使用,帮助软硬件协同工作。
• 疑问:既然fpga不适合实现复杂算法,那我们计算机软件写的那么复杂的算法cpu又是怎么拆解完成实现的? • 这里面有很有意思的南北桥介绍,GPU、CPU之间的通信介绍,计算机总线接口技术(片上总线、单向总线、串行总线等),计算机启动过程各部分初始化细节等知识。(下篇)会更新这部分。
我的专业方向是软件,四五六部分的内容打算略看,需要时再来查阅即可。