• 《深入理解计算机系统》笔记


    第一章 计算机系统漫游

    1. 信息就是位+上下文
    2. 程序被其它程序翻译成不同的格式
      • 预处理器、编译器、汇编器、链接器、装载器
    3. 了解编译系统如何工作是大有益处的
      • 优化程序性能
      • 理解链接时出现的错误
      • 避免安全漏洞
    4. 处理器读并解释储存在内存中的指令
      • 总线
      • IO设备
      • 主存
      • 处理器:加载、存储、操作、跳转
    5. 高速缓存至关重要
    6. 存储设备形成层次结构
    7. 操作系统管理硬件
      • 进程
      • 线程
      • 虚拟内存
      • 文件
    8. 系统之间利用网络通讯
    9. 重要主题
      • Amdahl定律:当我们对系统的某个部分加速时,其对系统性能的整体影响取决于该部分的重要性和加速程度
      • 并发和并行
      • 计算机系统中抽象的重要性

    we

    第二章 信息的表示和处理

    这一章主要讲数据在计算机中是怎么存储的,有些东西就不记这么细了。

    1. 大小端:大端和人的计数习惯相似,即高位放在低地址。
    2. !(非零)==FALSE;!!(非零)==TRUE;!(零)==TRUE
    3. 逻辑右移:高位添0;算数右移:高位添符号位
    4. 关于浮点数的记法,书上讲的太数学了,虽然严谨,但是看起来很费劲,添个讲得好的链接https://xiaolincoding.com/os/1_hardware/float.html

    第三章 程序的机器级表示

    1. 历史观点:摩尔定律
    2. 程序编码:gcc -c产生汇编代码
    3. 数据格式:
    数据类型汇编代码后缀大小(字节)
    字节b1
    w2
    双字l4
    四字q8

    比如说数据传送指令:movb、movw、movl、movq

    1. 访问信息

    64位寄存器r开头,32位寄存器e开头。之前的小甲鱼汇编笔记记了一些大概得汇编基础,现在看又学到了一些:

    寄存器使用惯例
    ax返回值
    bx被调用者保存
    cx第四个参数
    dx第三个参数
    si第二个参数
    di第一个参数
    bp被调用者保存,栈基址
    sp栈指针
    r8第五个参数
    r9第六个参数
    r10调用者保存
    r11调用者保存
    r12被调用者保存
    r13被调用者保存
    r14被调用者保存
    r15被调用者保存

    寻址方式有:立即数寻址、寄存器寻址、绝对寻址、间接寻址、(基址+偏移量)寻址、变址寻址、比例变址寻址

    传送指令的两个操作数不能都指向内存位置。

    1. 算数和逻辑操作:各种算数和逻辑操作的指令,感觉知道在哪里查就好,要都记下来要太多脑细胞了。

    leaq:load effective address:实际上是movq指令的变形,可以做一些算数运算。

    1. 控制:

      • 条件码:标志寄存器中某一些位,有CF、ZF、SF、OF这些比较常用的标志位
      • 跳转指令:无条件跳转jmp、有条件跳转j*
      • 条件控制-条件分支:即if-else:CPU的流水线工作模式,导致jmp不高效
      • 条件传送-条件分支:即指令cmovge,符合条件进行赋值,无需jmp,但是需要多做计算。(和上一点比较,编译器必须考虑浪费的计算和由于分支预测错误所造成的性能处罚之间的性能对比)
      • 循环:do-whilewhile;for三种循环的翻译,理解是,不同优化等级,可能会进行不同方案的翻译
      • switch语句:跳转表实现
    2. 过程:

    寄存器最多传6个参数,超过6个参数的部分,需要使用栈来进行传递。所以,这一小节的重点是栈帧的分布,多余6个的参数和返回地址是由调用函数的栈帧来保存,切换函数需要保存的寄存器、局部变量的信息由被调函数来维护。用栈保存的参数使用rbp进行访问。
    在这里插入图片描述

    1. 数组分配和访问:

    对于定长多维数组按照行优先的顺序在内存中存放。

    1. 异质的数据结构

    内存对齐

    对于结构体,编译器维护关于每个结构体类型的信息,只是每个字段的字节偏移,它一这些偏移作为内存引用指令中的位移,从而产生对结构元素的引用。
    对于联合体,每个元素的访问偏移都是0.

    1. 在机器级程序中将控制与数据结合起来

    对抗缓冲区溢出攻击:

    • 栈随机化:随机,让地址变化莫测
    • 栈破坏检测:金丝雀
    • 限制可执行代码区域 :对不同的段分配权限

    变长栈帧:使用rbp实现

    第四章 处理器体系结构

    1. ISA:Instruction-Set Architecture
    2. 这一章最重要的就是下面这个图,来自https://blog.csdn.net/weixin_58165485/article/details/123551737
      在这里插入图片描述
      指令集的一个重要性质就是字节编码必须有唯一的解释。任意一个字节序列要么是一个唯一的指令序列的编码,要么就不是一个合法的字节序列。
      汇编代码在转化为机器代码时,是一一对应的。所以反汇编才得以实现。

    RISC:精简指令集计算机
    CISC:复杂指令集计算机

    HCL:Hardware Control Language

    ALU是通过与或非门的组合电路来实现运算的。

    1. 指令被CPU执行起来分成如下阶段
      • 取指:读取机器码,得到指令代码和指令功能
      • 译码:得到两个寄存器对应的操作数
      • 执行:ALU将寄存器中的数,按照对应指令做运算
      • 访存:将数据写入内存,或者从内存读出数据
      • 写回:将结果写到寄存器
      • 更新PC:将PC设置成下一条指令的地址

    后面的内容是对这6步做很详细的讲解,只看了个大概,觉得没必要了解这么深,就不做相应笔记了。

    1. CPU流水线:每条指令的不同阶段并行执行。

    2. 流水线冒险:数据冒险和控制冒险。

      • 对于数据冒险:下一条指令会用到这一条指令计算出的结果,可以采用暂停、转发来避免数据冒险
      • 对于控制冒险:是因为分支预测,例如在执行跳转、调用或者返回指令时,流水线上预测错下一条指令,可以采用避免控制冒险的方法,例如执行ret语句时,暂停流水线执行新的指令,发现预测错分支时,将已经在流水线上执行的指令终止掉。

    第五章 优化程序性能

    1. 编译器必须很小心地对程序只使用安全的优化,因为对于有些代码,可能看上去能进行优化,但是认真地去做分析,在有些场景下它并不能安全的优化,可能会出现出其不意的结果。妨碍优化的两个因素:1. 内存别名使用;2. 函数调用。编译器总会假设最糟的假设。

    2. CPE(cycles per element):每元素的周期数

    3. 几种提高循环效率的方法:

      • 消除循环的低效率:将循环次数的计算放在循环外(代码移动)
      • 减少过程调用:将循环内的函数调用改成非函数
      • 消除不必要的内存引用:即增加中间变量,而不是通过指针每次都在原数据上进行修改
      • 指令集并行
      • 循环展开:一个循环计算两次
    4. 指令乱序执行:指令的执行顺序不一定要与他们在机器级程序中的顺序一致。通过一些限制,使得在乱序执行指令的基础上得到预期的结果。整个设计有两个主要部分:指令控制单元,执行单元。一个处理器内,有多个功能单元,包括:分支、算术运算、加载、存储等。而且一个功能可能有多个单元。

    5. 延迟:完成运算所需要的总时间;发射:两个连续的同类型的运算之间需要的最小时钟周期数;容量:能够执行该运算的功能单元的数量。

    第六章 存储器层次结构

    1. RAM(随机访问存储器)分SRAM、DRAM。SRAM用于高速缓存(cache),又可分为i-cache和d-cache;DRAM用于主存。ROM(只读存储器)断电不丢失数据,可以存放系统启动程序。

    2. SSD(固态硬盘)和旋转磁盘,对于旋转磁盘,必须得密封包装,因为怕有灰尘落到磁道上面,读写头碰到灰层的时候就会出错。

    3. PCI(外围设备互联)模型中,系统中所有的设备共享总线,一个时刻只能有一台设备访问这些电路。

    4. CPU使用一种称为内存映射IO的技术来向IO设备发射指令。在使用内存映射IO的系统中,地址空间中有一块地址是为与IO设备通信保留的。每个这样的地址称为一个IO端口。当一个设备连接到总线时,它与一个或多个端口相关联。举个例子:假设磁盘控制器映射到端口0xa0。随后,CPU可能通过执行三个对地址0xa0的存储指令,发起磁盘读:第一条指令时发送一个命令字,告诉磁盘发起一个读,同时还发送了其他参数,例如当读完成时,是否中断CPU,第二条指令致命应该读的逻辑块号,第三条指令指明应该存储磁盘三区内容的主存地址。

    5. 设备可以自己执行读或者写总线事务而不需要CPU干涉过程,称为DMA(直接内存访问)。这种数据传送称为DMA传送。

    6. 计算机倾向于用邻近于其他最近引用过的数据项的数据项,说着最近引用过的数据项本身,这种倾向性,被称为局部性原理

    7. 存储器层次结构的本质是:每一层存储设备都是较低一层的缓存。

    8. 几种高速缓存映射策略:直接映射高速缓存、组相联高速缓存、全相连映射(TLB)。命中缓存分三步:1. 组选择;2. 行匹配; 3. 字抽取

    9. 抖动:高速缓存反复地加载和驱逐相同的高速缓存块的组

    10. 写命中:直写(每次都写回内存)、写回(驱逐时再写进内存);写不命中:写分配(先读进内存)、非写分配

    11. 所有的SRAM高速缓存器都在CPU芯片上

  • 相关阅读:
    vue3:arco design message封装
    VScode断点调试vue
    Web开发-登录页面设计流程
    Maven 使用
    Linux环境安装jdk
    Python面试1-50题汇总,都是常问的面试题!
    随着模型的复杂度增加,过拟合是怎么导致的?如何解决?
    scp传输数据文件
    [附源码]java毕业设计高校教师教学工作量核算系统
    敏捷开发与Scrum区别(敏捷开发(Agile)教程)
  • 原文地址:https://blog.csdn.net/weixin_42065178/article/details/126712544