第01章 计算机系统漫游

Posted by allon li on 2017-02-22

#第01章 计算机系统漫游

Tags: 深入理解计算机系统

[TOC]


第一章


image_1beikj90n1f6gv9a1fjbv6n18m49.png-133.7kB

  • 预编译阶段 - 生成.i文件: g++ -E hello.c -o hello.i
  • 编译阶段 - 生成汇编文本.s文件: g++ -S hello.i -o hello.s
  • 汇编阶段 - 生成.o文件: g++ -c hello.s -o hello.o
  • 链接阶段 - 生成可执行文件: g++ hello.o -o hello

g++ gcc编译参数

参数 说明
-c 只编译不链接,生成*.o文件
-S 生成汇编代码*.s文件
-E 预编译 生成*.i文件
-g 在可执行程序里包含了调试信息,可用 gdb 调试
-o 把输出文件输出到指定文件里
-static 链接静态链接库
-library 链接名为library的链接库

###系统硬件组成
image_1beionion1pao1p14p7u5v81kbo13.png-320.4kB
####总线####
32位系统总线是4个字节(32个位)
64位系统总线是8个字节(64个位)
总线宽度一般就是一个字长

####I/O设备
I/O设备通过控制器和适配器与I/O总线相连:

  • 控制器是镶在主板的芯片组,如集显。
  • 适配器就是插槽,如独显。

####CPU 中央处理单元(Central Processing Unit)

  1. 处理器的核心是一个大小为一个的存储设备(或寄存器),称为程序计数器(PC)。在任何时 刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
  2. 从开机到关机,CPU一直更新PC使其指向一下条指令地址。
  3. 指令是按照严格顺序执行的,执行完一条就更新PC指向下一条。两条指令地址不一定是相邻的。

####主存
主内存就是一个从index 0开始的字节数组,每个内存字节都有唯一的index也就是唯一的地址。

寄存器

寄存器文件是一个小的存储设备,由一组单个字长的寄存器组成。每个寄存器都有唯一的名字。

CPU指令执行过程

几乎所有的冯•诺伊曼型计算机的CPU,其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数和结果写回
image_1bgvo3oi51mtlrjp1ijf1ek4t39m.png-46.2kB

(1)指令周期

CPU取出一条指令并执行该指令所需的时间称为指令周期。
指令周期的长短与指令的复杂程度有关。

(2)CPU周期

指令周期常常用若干个CPU周期数来表示。
由于CPU内部的操作速度较快,而CPU访问一次主存所花的时间较长,因此通常用从主存读取一条指令的最短时间来规定CPU周期。
CPU周期也称为机器周期。

(3)时钟周期

一个CPU周期包含有若干个时钟周期。
时钟周期是处理操作的最基本时间单位,由机器的主频决定。
一个CPU周期的时间宽度由若干个时钟周期的总和决定。

采用定长CPU周期的指令周期示意图

(4)取出和执行任何一条指令所需的最短时间为两个CPU周期。

任何一条指令,它的指令周期至少需要两个CPU周期,而复杂指令的指令周期则需要更多的CPU周期。这是因为,一条指令的取出阶段需要一个CPU周期时间,而一条指令的执行阶段则需要至少一个CPU周期时间。由于不同复杂度指令的执行周期所需的CPU周期数不尽相等,因此,各种指令的指令周期也是不尽相同的。z

一个hello world程序执行过程

  • 利用直接存储器存取(DMA)直接从磁盘不经过cpu拷贝运行文件到主存
  • cpu从主存拷贝字符串到寄存器再从寄存器拷贝到显示器

存储器

####CPU缓存
运行速度很多消耗在拷贝过程, 由于寄存器越来越快,主存的速度严重跟不上。中间出现了L1 L2 L3这种高速缓存。为CPU提前从主存中获取数据到缓存。

  • 寄存器(几百字节)速度最快比主存快100倍
  • L1(几万字节,位于处理器芯片上) 访问速度和寄存器几乎一样
  • L2(数十至百万字节特殊总线连接到处理器)比主存快5-10倍
  • 主存(几十亿字节)
  • 磁盘读取单个字的时间开销比主存大1000万倍
    image_1bejtnn9t1lp2aiqk2a1hrjes0m.png-138.7kB

结构图

image_1bejuddb8lan1ou51l0v93915bp13.png-281kB

虚拟内存

虚拟内存和CPU缓存作用一样,它是用来做磁盘的缓存。

多核处理器结构

image_1bel90rvjdr376a1ag913e84951g.png-433.5kB

  • 由高到低:线程级->多指令并行->单指令并行

超线程

4核能跑8条线程,就是一种超线程。比如当一个CPU在正等L1缓存的数据,那么这会它也可以跑另一个线程的运算。Intel Core I7就带有超线程技术。

指令级并行

一口气执行多条指令,超标量。

单指令多数据并行(SIMD)

SIMD 指令多是为了提高处理影像 、 声音和视频数据应用的执行速度。虽然有些编译器试图从程序中自动抽取 SIMD 并行性,但是更可靠的方法是使用编译器支持的特殊向量数据类型来写程序,例如GCC 就支持向量数据类型。作为对比较通用的程序优化讲述的补充,在网络旁注 OPT:SIMD 中描述了这种编程方式 。