2022年《深入理解计算机系统》读后感 .pdf
深入理解 计算机系 统读后感第一次听到这本书还是我们的导师袁志斌老师介绍的。在这之前我是对它毫无概念可言。袁老师对这本书可谓是推崇备至,因此就介绍给我们全班,并希望说让我们能够静下心好好的去看它、了解它。于是我开始了阅读 深入的征程。之所以说是 征程 是因为这本说的内容确实是很难。至少是对于我来说。很多东西之前都没有接触过。除了那点少的可怜的C语言底子之外就剩下数字电路的东西了。其他的基本上是听都没听过。毕竟这本书要求先修的课程有很多,神马计算机组成原理,汇编程序设计。这些都没有学过。但是,就算是这样,凭着被袁老师鼓起的热情,硬着头皮买了它,开始了啃 深入 的日子。在这里先简单的介绍一下 深入 的基本章节内容。第一章 A Tour of Computer System 对计算机系统总体的做了一个简单的介绍,第二章 Representing and Manipulating Information 主要说的是信息在计算机中的表示形式。包括整数和浮点数的表示形式。第三章 Machine-Level Representation of Program 汇编语言的复习。过程调用,尤其是过程调用(包括递归调用 ) 中堆栈的使用情况是经常会考到的。数据在内存中的 对齐 方式,也是经常出现在考题中的。比如定义一个结构体数组,打印出其中一个元素的地址,问这个地址相对数组起始地址有多少个字节的距离。第四章 Processor Architecture 计算机体系结构的内容。处理器结构,各种逻辑门、功能单元,指令集,指令的执行,指令执行的流水线等。第五章 Optimizing Program Performance 如何优化程序的执行效率,包括代码的优化,编译器的优化,及CPU 级别的优化。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 6 页 - - - - - - - - - - CPU 级别的优化,微指令的概念,功能单元上微指令的并行,程序分支的预测等。第六章 The Memory Hierarchy 详细介绍了计算机系统中的存储结构。6.1 介绍了不同种类的存储设备以及对应的存取数据的方式。6.2-6.5介绍了存储设备的组织形式,着重介绍了Cache及其工作方式。6.6-6.7介绍了程序如何和 cache 打交道,不同的循环嵌套顺序、遍历方向等对 cache 命中的影响。第七章 Linking 顾名思义,详细讲解了程序的链接过程,主要分为静态链接和动态链接,以及链接过程中使用到的技术。第八章 Exceptional Control Flow 顾名思义,本章主要讲解异常控制,不过这里的 异常 并不是 Java 或者C+ 里的狭义的异常,而是一个广义的Exceptions的概念,包括中断(Interrupt,硬件层面,主要是I/O 中断 ) ,陷阱 (Trap, 主动产生的异常,主要用于用户程序和系统内核间的交互,如系统调用) ,错误 (Falut ,如除 0 错误;页错误:在虚拟内存中,所请求页面并不在内存中,需要从硬盘读取等。错误可能恢复 ) ,中止 (Abort ,致命错误,无法恢复,如硬件问题等) 。在介绍异常处理的同时,引入了进程的概念,对进程控制也进行了详细介绍,以及进程级别的 Exception :信号 (signal),这个级别的异常处理由操作系统完成,通常叫做上下文切换 (context switch)。第九章 Measuring Program Execution Time 本章介绍了如何尽可能准确的测量程序执行的时间。第十章 Virtual Memory 非常重要的一章,虚拟存储机制是计算机实现多任务的一项重要技术。计算机正是通过时间片技术使得每个进程在执行时仿佛独占CPU ,进而又通过虚拟存储机制使得每一个进程在执行时,仿佛独占内存。10.1 介绍了虚拟地址和物理地址,CPU进行寻址操作产生的是虚拟地址,通过存储管理单元 (memory management unit) 转换为实际的物理内存地址。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 6 页 - - - - - - - - - - 10.310.5 讲述了虚拟存储机制的优点:使得内存可以作为硬盘的cache;能够更方便的管理内存;能更好的提供内存保护机制。10.6 介绍了虚拟地址如何转换为物理地址。10.7 很精彩的一节,通过Intel Pentium和 Linux 的实例讲述了整个存储管理机制。记得以前上操作系统课的时候,各种理论、机制学了一大堆,但是就是不知道实际的操作系统到底用的哪套方法。而本节内容正是通过实例让你对刚学的理论机制有一个直观的了解。10.810.10 讲述了存储映射 (Memory Mapping)、动态内存分配和垃圾回收机制。10.11 很实用的一节,列举了一些C编程中容易犯的内存引用错误。第十一章 System-Level I/O 介绍类 Unix 系统下的 I/O 读写,主要介绍系统层面的I/O 接口。由于我们日常编程所用的I/O 接口都是各种高级语言提供的经过封装的标准接口,故而如果不进行嵌入式编程的话这部分知识不是必须的,我跳过没读。第十二章 Network Progranmming 简单介绍了网络模型, TCP/IP 协议,类 Unix 系统的 socket 接口等。第十三章 Concurrent Programming 本章简单介绍了并发程序设计的内容,主要包括:进程级别的并发,各子进程拥有不同的虚拟地址空间,需要IPC(InterProcess Communication)机制共享数据,进程之间切换开销大。I/O 复用,事件驱动,单进程运行,共享虚拟地址空间,并发效果不理想。线程,介于上述两种中间,各子线程共享进程的虚拟地址空间,线程间切换开销较小。另外介绍了并发编程中访问共享变量的信号量机制。给出了4 类容易引起线程不安全的函数。上面这些是我粗略的通读一遍所了解的。限于各种原因,如专业课程,时间安排不来等等,我只能精读过了前面三章,所以与其说是读后感倒不如说是读书笔记。下面便是我的学习所得。1)对于一个无符号数字x, 截断它到 k 位的结果就相当于计算x mod 2k. 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 6 页 - - - - - - - - - - (2) 在大多数的机器上 , 整数乘法指令相当地慢 , 需要 12 或者更多的始终周期, 然而其他整数运算 - 例如加法、减法、位移运算和移位-只需要 1 个时钟周期. 因此, 编译器使用的一项重要的优化就是试着使用移位和加法运算的组合来代替乘以常数因子的乘法. (3) 在大多数的机器上 , 整数除法要比整数乘法更慢- 需要 30 或者更多的始终周期 . 除以 2 的幂也可以用移位运算来实现, 只不过我们用的是右移 , 而不是左移 . 对于无符号和二进制补码数, 分别使用逻辑移位和算术移位来达到目的. (4) 反汇编器一些特性说明:(5)IA32 指令长度从 115个字节不等 . 指令编码被设计成使常用的指令以及操作较少的指令所需的字节数少, 二那些不太常用或操作数较多的指令所需字节数较多 . (6) 指令格式是按照这样一种方式设计的, 从某个给定位置开始 , 可以将字节唯一地解码成机器指令. 例如, 只有指令 pushlp 是以字节值 55 开头的 . (7) 反汇编器只是根据目标文件中的字节序列来确定汇编代码的. 它不需要访问程序的源代码或汇编代码. (8) 反汇编器使用的指令命名规则与GAS(Gnu ASembler) 使用的有些细微的差别 . (9) 与 code.s 中的汇编代码相比 , 我们发现结尾多了一条nop指令. 这条指令根本不会被执行 ( 它在过程返回指令之后 ), 即使执行了也不会有任何影响( 所以称之为 nop, 是no operation的简写 , 同城读作 no op).编译器插入这样的指令是为了填充存储该过程的空间. (10)IA32 加了一条限制 , 传送指令的两个操作数不能都指向存储器位置.将一个值从一个存储器位置拷到另一个存储器位置需要两条指令- 第一条指令将源值加载到寄存器值写入目的位置. (11) 根据惯例 , 所有返回真书或指针值的函数都是通过将结果放在寄存器x 中来达到目的的 . (12) 加载有效地址 (Load effective address)指令 leal实际上是 movl指令的变形 . 它的指令形式是从存储器读取数据到寄存器, 但实际上它根本就没有引用存储器 . 它的第一个操作数看上去是一个存储器引用, 但该指令并不是从指定的位置读入数据 , 而是将有效地址写入到目的操作数(如寄存器 ). 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 6 页 - - - - - - - - - - (13) 一元操作 , 只有一个操作数 , 既作源 , 也作目的 . 这个操作数可以是一个寄存器 , 也可以是一个存储器位置. 比如说 incl(%esp) 会是栈顶元素加1. 这种语法让人想起C中的加 1 运算符 (+) 和减 1(-). (14) 二元操作 , 第二个操作数既是源又是目的. 这种语法让人想起C中向+=这样的赋值运算符 . 不过要注意 , 源操作数是第一个 , 目的操作数是第二个 , 这是不可交换操作特有的 . 例如, 指令 sublx,x使寄存器 x 的值减去 x 中的值. 第一个操作数可以是立即数、寄存器或存储器位置. 第二个操作数可以是寄存器或是存储器位置 . 不过同 movl 指令一样 , 两个操作数不能同时都是存储器位置. (15)divi指令执行无符号除法 , 通常会事先将寄存器x 设置为 0. 深入 很难,这是无需质疑的,但是,不是有一句话么:万事开头难。我想这句话用在学这本书上也是适合的。随着学习的深入,原先觉得难以理解的概念变的平易近人起来。感觉没有受到很大的挫败感。好吧,写到这觉得是时候结束这篇文章了,不过以后还是会更新的。前提是我还能继续学下去。精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 6 页 - - - - - - - - - - 文档编码:KDHSIBDSUFVBSUDHSIDHSIBF-SDSD587FCDCVDCJUH 欢迎下载 精美文档欢迎下载 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 6 页 - - - - - - - - - -