深入理解计算机系统(兰德尔)

编译系统如何工作

  • 预处理器 | 编译器 | 汇编阶段 | 链接器
    深入理解计算机系统(兰德尔)_第1张图片
  • 预编译:根据 字符 # 开头的命令
  • 编译阶段:生成汇编语言
  • 汇编阶段:翻译成 机器码指令,可重定位目标程序,将结果保存在二进制文件
  • 链接阶段:合并乘可执行目标文件(单独预编译好的 printf.o 文件)
  • 了解编译系统如何工作:① 知道怎么写代码会得到更优的性能 ② 理解链接时的错误 ③ 避免一些安全的漏洞

计算机硬件入门

深入理解计算机系统(兰德尔)_第2张图片

  • 总线:携带信息字节并负责在各个部件之间的传递,设计出传送定长的字节快(word字),字长在32位系统下4个字节,64位则为8个字节
  • IO设备:联系系统和外界世界的联系通道(键鼠显示器等),每个设备都由一个 控制器或者适配器 与IO总线相连,控制器一般为IO设备本身或是系统主印刷电路板上的芯片,适配器是插在主板上插槽上的卡
  • 主存:临时存储设备,用于存放程序运行时用来存放程序和数据,一块 动态随机存取芯片 DRAM芯片,逻辑上就是一个线性的字节数组,每个字节都有唯一的字节构成
  • 处理器:中央处理单元CPU 解释或执行 存储在 主存中指令的 引擎,核心是一个 大小为一个字的存储设备寄存器 程序计数器 PC,每个时刻都指向主存的某条机器语言指令,指令集架构,算术逻辑单元 ALU
  • 高速缓存:
    深入理解计算机系统(兰德尔)_第3张图片
  • 存储设备的层次结构
    深入理解计算机系统(兰德尔)_第4张图片
  • 操作系统管理硬件:1、防止硬件被失控的应用程序滥用;2、向应用程序提供简单一致的机制来控制复杂而通常大不相同的低级硬件设备(进程 + 虚拟内存 + 文件)
    深入理解计算机系统(兰德尔)_第5张图片
  • 进程:是操作系统对一个正在运行的程序的一种抽象,进程之间 交错执行的机制 成为 上下文切换
  • 操作系统 保存跟踪 进程运行所需的所有状态信息,又叫上下文(PC寄存器等的值,主存内容)
  • 并发机制
  • 一个进程 由 多个执行单元(线程)组成,多线程之间比多进程之间 更容易共享数据 且更加高效!
  • 虚拟内存:虚拟地址空间,用户栈,实现函数调用;基本思想:把进程虚拟内存的内容存储在磁盘上,然后你有主存作为磁盘的高速缓存!
    深入理解计算机系统(兰德尔)_第6张图片
  • 文件:字节序列,所有IO设备都可以看作文件
  • 系统之间的网络通信:
    深入理解计算机系统(兰德尔)_第7张图片
  • 系统是 硬件和系统软件互相 交织的集合体,需要共同协作
  • Amdahl 定律:当对系统的某个部分进行加速,其对整个系统的性能影响 取决于该部分重要性程度和加速程度!
  • 并发和并行:计算机做的更多 + 运行的更快
  • Concurrency:同时具有·多个活动的系统
  • Parallelism:使用并发让系统更快,可以在计算机系统中多个抽象层次中使用,注重结果
  • 并行的多个层次:① 线程级并行:超线程又叫 同时多线程(Simultaneous Multi-threading)② 指令级并行:处理器同时处理 多条指令 ③ 单指令多数据并行:SIMD并行
    深入理解计算机系统(兰德尔)_第8张图片
    深入理解计算机系统(兰德尔)_第9张图片
  • 计算机中的抽象:
    深入理解计算机系统(兰德尔)_第10张图片

程序的结构与执行

信息的表示及处理

  • 无符号 unsigned + 补码 two’s complement + 浮点数 floating point 编码
  • 前两者属于整数编码,可以表示范围较小的精确数字;后者可以表示范围较大的不精确数值(这里的精确是表示计算式的潜在损失)
  • 字节:8位,最小的寻址块,虚拟地址空间,虚拟内存
  • 程序对象(Program Object):程序数据 + 指令 + 控制信息
  • 16进制
  • 寻址与字节顺序:多字节 需要两个信息:对象的地址 + 在内存中如何排列(基本都是连续内存存储)
  • 有两种排列顺序:小端法little endian:最低有效字节在最前面;大端法big endian:最高有效字节在前面
    • 每个系统基本都确定了大小端,在不同类型的机器之间通过网络传输数据的时候会造成困扰,可能需要reverse!
    • 反汇编之后,阅读表示整数数据的字节序列也要注意 大端和小端
    • 类型强制转换cast 联合union,允许一个数据类型引用一个对象,但是也要注意 字节的顺序(强制类型转换 只是告诉编译器以新的数据类型 看待被指向的数据!)
  • 布尔代数:{0,1} & | ^ ~ 位向量
  • 逻辑运算:&& || !短路效应,FALSE 0,TRUE 非0
  • 移位运算:左移:从左往右可结合 x << i << j = (x << i) << j
  • 右移:逻辑右移:补0,算术右移补最高位
  • 对有符号的数进行 算术右移(C++默认进行算术位移,而java的 x >> k 算术位移,x >>> k 逻辑位移!)
    深入理解计算机系统(兰德尔)_第11张图片
  • 无符号的编码,唯一的,一对一在这里插入图片描述
  • 补码编码:同样唯一在这里插入图片描述
  • 反码 Ones’ Complement 对0有多表示 -0 +0
    在这里插入图片描述
  • 原码 Sign Magnitude 对0有多表示 -0 +0
    在这里插入图片描述
  • 有符号 / 无符号:unsigned
  • 补码转无符号 数:
    在这里插入图片描述
    在这里插入图片描述
  • 无符号 转 补码:
    在这里插入图片描述
    在这里插入图片描述
  • 扩展数字的位运算
    • 无符号数补0就行了
    • 有符号数:补最高位!
  • 无符号数 加法
    在这里插入图片描述
  • 补码加法
    深入理解计算机系统(兰德尔)_第12张图片
  • 补码的非
    在这里插入图片描述
  • 乘法 …
  • 浮点数字:二进制小数
    深入理解计算机系统(兰德尔)_第13张图片
  • IEEE 浮点运算
    深入理解计算机系统(兰德尔)_第14张图片
    深入理解计算机系统(兰德尔)_第15张图片
    深入理解计算机系统(兰德尔)_第16张图片
  • 浮点数的舍入:
  • 浮点运算:

程序的机器级表示

程序运行在系统上

你可能感兴趣的:(笔记)