文章目录
前言
本文章为天池“深入理解计算机系统”小组学习的Task01-学习日志,旨在初步了解程序执行过程中所涉及的编译系统、硬件架构、操作系统管理等。
一、编译系统
1.工作流程
2.流程步骤定义
-
预处理器:以 # 开头的代码,来修改原始程序。程序中引入了头文件,预处理器会读取该头文件中的内容,将其中的内容直接插入到源程序中,结果就得到了另外一个 C 程序。
-
编译:编译器将 X.i 文件翻译成X.s 文件,包括词法分析、语法分析、语义分析、中间代码生成以及优化等中间操作。
-
汇编:根据指令集将汇编程序 X.s 翻译成机器指令,并将机器指令按照固定的规则进行打包,得到可重定位目标文件 X.o 。该文件为二进制的文件,但不被执行,需进行链接。
-
链接:负责把 X.o 和 printf.o 按照一定规则进行合并。X.o 被称之为可重定位目标文件。其中,调用了 printf 函数,这个函数是标准 C 库中的一个函数,存储在名为 printf.o 的文件中。最终经过链接阶段可以得到可执行目标文件 X。
二、硬件架构
1.硬件架构组成
1.1硬件架构图
1.2.CPU 架构
1.2.1.CPU 定义
- 中央处理单元(CPU):也称处理器,包含 PC ( 程序计数器: Program Count )、寄存器堆(Register file)、 ALU(算数/逻辑计算单元:Arithmatic/logic Unit)三个部分。
1.2.2.CPU内部结构
- 程序计数器 PC: 是一个 4 字节或是 8 字节的存储空间,里面存放的是某一条指令的地址。处理器不断执行PC 指向的指令,然后更新 PC,使其指向下一条要执行的指令。执行顺序不一定为相邻命令。
- 寄存器: 临时存放数据的空间,会存在数据覆盖。
- 算数/逻辑计算单元 ALU: 计算速度极快,且专攻算数与逻辑的计算,计算机核心部分。
1.3.内存
- 主存:也称为内存、运行内存,处理器在执行程序时,内存主要存放程序指令以及数据。从物理上讲,内存是由随机动态存储器芯片组成;从逻辑上讲,内存可以看成一个从零开始的大数组,每个字节都有相应地址.
1.4.总线
- 总线:内存和处理器之间通过总线来进行数据传递。总线负责将信息从一个部件传递到另外一个部件。通常总线被设计成传送固定长度的字节块,也就是字(word),根据系统不同,可分为32 位的机器(一个字长是 4 个字节)和64 位的机器(一个字长是 8 个字节)。
1.5.输入输出设备
- 定义:例如键盘、鼠标等。每一个输入输出设备都通过一个控制器或者适配器与IO 总线相连。
- 控制器与适配器区别:封装方式,无论是控制器还是适配器,其功能都是在 IO 设备与 IO 总线之间传递数据.
2.程序在架构中的执行流程
2.1.流程步骤
- 键盘输入”./hello” 的字符串,shell 程序会将输入的字符逐一读入寄存器,处理器会把 hello 这个字符串放入内存中。
- 完成输入,按下回车键时,shell 程序明确完成输入,然后执行后续指令来加载可执行文件hello。
- 指令将 hello 中的数据和代码从磁盘复制到内存。复制的过程将利用 DMA(Direct Memory Access)技术,数据可以不经过处理器,从磁盘直接到达内存。
- 当可执行文件 hello 中的代码和数据被加载到内存中,处理器就开始执行 main函数中的代码。
2.2.流程步骤图
3.设备容量
- 大容量的存储设备的存取速度要比小容量的慢,运行速度更快的设备的价格相对于低速设备要更贵。存储容量越小,速度越快,价格越高.
4.存储设备的层次结构
- 针对处理器和内存之间的差异,系统设计人员在寄存器文件和内存之间引入了高速缓存(cache)。一般有三级高速缓存,分别为 L1 cache , L2 cache 以及 L3 cache。
三、操作系统管理硬件
1.操作系统的作用
- 无论是shell程序还是hello程序都没有直接访问键盘、显示器等硬件设备,真正操挫硬件的是操作系统,可以把操作系统看成是应用程序和硬件之间的中间层,所有的应用程序对硬件的操作必须通过操作系统来完成。
- 作用:1. 防止硬件被失控的应用程序滥用
2.提供统一的机制来控制这些复杂的底层硬件 - 文件:文件是对 IO 设备的抽象;虚拟内存是对内存和磁盘 IO 的抽象;进程是对处理器、内存以及 IO 设备的抽象。
2.程序在操作系统中的进程
- shell等待合行输入指令
- 在shell进程加载hello进程,shell通过系统调用来执行请求,系统调用会将控制权从 shell 进程传递给操作系统,操作系统保存 shell进程的上下文,然后创建一个新的 hello 进程及其上下文,然后将控制权转交给新的 hello 进程。
- hello 进程完成后,操作系统就会恢复 shell 进程的上下文,并转回shell。整个进程均有操作系统参与。
四、虚拟内存
1.定义
- 虚拟地址空间:操作系统为每个进程提供了一个假象,每个进程均独自占用整个内存空间,且内存一样。
2.结构
- 由下至上,地址增大;
- 最底层为0地址,该区域区域是用来存放程序的代码和数据的,该区域的内容是从可执行目标文件中加载而来的;
- 顺着地址增大的方向,继续往上看就是堆(heap);
- 之后为共享库的存放区域,这个区域主要存放像 C 语言的标准库和数学库这种共享库的代码和数据;
- 再向上为用户栈,函数调用的本质就是压栈;
- 最顶部的区域为内核保留的区域,应用程序代码不能读写这个区域的数据,也不能直接调用内核中定义的函数,该区域对应用程序是不可见的。
3.利用网络通信的流程
五、系统加速
1.定义与假设
- 任务 (task):并行计算所处理的对象.
- 工作量 (workload):处理某任务的所需的各种开销的总和.
- 处理器 (processor):并行计算中所使用的最基本的处理器单元.
- 执行率 (execution rat):每个处理器单位时间能完成的工作量.
- 执行时间 (execution time):处理某任务所需的时间.
- 加速比 (scalability):当处理器个数增多时,完成某固定工作量任务所需执行时间的减少倍数.
- 理想加速比 (ideal scalability):处理器个数增多的比例.
- 并行效率 (parallel effciency): 加速比 ÷ 理想加速比 ×100%.
2.阿姆达尔定律
- 记 α ∈ [0, 1] 是某任务无法并行处理部分所占的比例. 假设该任务的工作量固定,则对任意n个处理器,相比于1个处理器,能够取得的加速比满足:S(n) < 1/α.
3.古斯塔法森定律
- 记 α ∈ [0, 1] 是某任务无法并行处理部分所占的比例. 假设该任务的工作量可以随着处理器个数缩放,从而保持处理时间固定. 则对任意 n 个处理器,相比于 1 个处理器,能够取得的加速比 S(n) 不存在上界.
4.孙-倪定律
- 记 α ∈ [0, 1] 是某任务无法并行处理部分所占的比例. 假设该任务的可并行部分随着处理器个数 n 按照因子 G(n) 缩放,则对任意 n,相比于 1 个处理器,能够取得的加速比S∗(n) 满足:
5. 三定理关系
六、并发和并行
1.获得更高的计算能力三种途径
- 线程级并发: CPU 内部,像程序计数器类型的硬件部件有多个备份,而像浮点运算部件类型硬件还是只有一份,常规单线程处理器在做线程切换时,需要较长周期,而超线程处理器可以在单周期的基础上决定执行哪一个线程,CPU 可以更好利用处理资源。当一个线程读取数据进入等待状态时,CPU 可以去执行另外一个线程,其中线程之间的切换只需要极少的时间代价。
- 指令级并行:现代处理器可以同时执行多条指令的属性称为指佘级并行,近几年的处理器可以保持每个周期 2 4 条指令的执行速率。
- 单指令多数据并行:允许一条指令产生多个并行的操作,这种方式称为单指令多数据(Single Instruction Multiple Data)。SIMD 的指令多是为了提高处理视频、声音这类数据的执行速度。