《深入理解计算机系统(CSAPP)》第一章 学习笔记

CSAPP 第一章

这只是一个书序一样的章节,基本上是对后续章节的概括性描述,也有很多对后续章节的引用。相对来说知识点不是很多,不过对于笔者这样的小白本白来说还是有很多难点的,个人认为难点在于没有对后续章节有一个比较总体的认识……

字,字节和位

这其实是第二章的内容,笔者暂且放在前面介绍。

位(bit)指的是二进制位,非常简单,0和1.

字节

字节(byte)是8个位组成的单位,也是最小的可寻址的内存单位。机器不访问内存中单独的位

字(word)是定长的字节块。在C语言中的指针大小就是一个字的大小——这其实是源于,虚拟地址空间的最大大小就等于一个字的大小

为什么叫虚拟地址空间?“虚拟” (virtual)是虚拟在它是对于实际硬件的一个抽象,是给机器级程序看的,并不是真正在硬件上操作;“地址”就是c的地址概念;“空间”(space)是因为它是所有可能的地址的集合,具有封闭性。像不像数学里的space?

32位系统(x86)字长就是32个位(8个十六进制位,0x00 00 00 00 到 0xFF FF FF FF),也即4字节。64位同理。

系统硬件组成

总线

携带信息字节并且分配到各个部件。被设计成传送定长的字节块(字)。

I/O设备

显示屏,键盘鼠标这些。注意:磁盘驱动器也属于I/O设备网络可以看作一种特殊的I/O设备。

通过控制器或者适配器和I/O总线相连。

  • 控制器:I/O设备本身,或者主板上的芯片组。键盘/鼠标,磁盘使用控制器。

  • 适配器:插在主板上的卡。显示器使用适配器。

主存

临时存储设备,存放处理器处理数据的时候,所需的那些程序处理的数据,或者存放程序本身。

处理器(CPU)

中央处理单元的简称。

用来解释/执行存储在主存的指令。

名词解释

  • 寄存器(register file)是大小为一个字的存储设备。

  • 程序计数器(PC)是一个单独而特殊的寄存器,不停地指向主存中的不同简单指令的地址。

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

  • 算术/逻辑单元(ALU)计算新的数据,以及下一个指令所处的地址。

处理器的操作

读取PC指令→解释指令→执行PC的指令(通常是一些简单操作)→更新PC,使其指向下一条指令→……

指令集架构(比处理器的实际实现简单许多)决定。这些指令都是简单指令,包括主存和寄存器的互相读取数据(到寄存器:加载/到主存:存储),简单的算术运算(操作),将指令读取到PC(跳转)。

系统是怎么处理一个hello.c的

  1. 键盘输入命令 -> 读取到寄存器 -> 存储到主存

  2. 主存接收到指令,从磁盘中读取hello.c -> 代码复制到主存 -> 运行

  3. 主存将Hello, world!\n 的位级表示加载到寄存器 -> 寄存器将代码放到显示屏

高速缓存

原因:小设备快,大设备慢;小设备储存不下需要处理的数据,但若直接交给大设备,整个系统速率又会显著降低(Amdahl定律,决速步的数学表示)。

利用静态随机访问存储器(SRAM)实现L1和L2高速缓存,速度比主存(动态随机访问存储器,DRAM)快,空间比寄存器大,程序可以在高速缓存中完成运行。

从寄存器(L0),L1,L2,L3,主存(L4),本地磁盘(L5),服务器(L6),这样一级一级下来,每一个上级都是下级的高速缓存,实现了存储器层次结构。(L:layer)

计算机当中的抽象

抽象的概念在CSAPP中被反复强调。

  • 文件是对I/O设备的抽象:个人理解是我们通过文件向计算机传输信息,并且通过文件输出信息,类似于软件版的I/O设备。

  • 虚拟内存是对程序存储器的抽象,也是对主存+I/O设备的抽象。

  • 进程是对一个正在进行的程序的抽象,也是对处理器+主存+I/O设备的抽象。

  • 虚拟机是对整个计算机的抽象,包括操作系统+处理器+主存+I/O设备的抽象。

进程

对于机器级程序来说,在操作系统上运行时,会产生一种假象,即程序看起来独自占据处理器、主存和输入输出设备,但是这只是由于后三者被抽象成了进程,在进程上,来运行一个程序。

  • 并发:一个进程的指令和另一个进程交错执行。

    这个概念比较普及,在很多科普读物中甚至都有提到,对于单个的CPU而言,虽然看起来可以同时执行多个进程,但是事实上是在多个进程之间相互切换。

  • 上下文切换:操作系统实现进程间交错执行的机制。

    何谓上下文?上下文是指保持跟踪进程运行所需的所有状态信息。系统在进行上下文切换的时候,保存系统的当前状态,再切换到新的进程当中,并且把系统的状态调成这个新进程所依赖的状态值。

    这些状态值包含:程序计数器、寄存器文件、主存的内容等。

    实际上,也就是说,把多个进程在停止时刻的状态信息“冻结”起来,保存到某处,在需要用的时候,再拿出来,重新开启,这样就实现了并发。

  • 内核(kernel):操作系统代码常驻主存的部分。

    通过内核,可以实现一个进程到另一个进程的转换,它不是一个独立的进程,是所有进程的管理者。

线程

一个进程由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,共享同样的代码和全局数据。

线程的具体概念在第一章中没有具体解释。(等我学到后面几章再说吧

虚拟内存

每个进程看到的内存都是一致的,称为虚拟地址空间,这样,就产生了每个进程都在独占地使用主存的假象。

虚拟地址空间

地址从小到大,虚拟地址空间分为一些准确定义的区。

  1. 程序代码和数据

    代码从同一固定地址开始,存放代码。接下来存放C全局变量的数据。小地址的地方存放只读代码数据,大地址的地方存放可读可写数据。

  2. malloc等函数分配的空间分配在运行时堆上。

  3. 共享库

    存放C标准库等库中的内容。

  4. 用户栈。用来实现函数调用,在程序执行期间可以动态地扩展和收缩,实现函数调用调用函数时,栈扩展,从函数返回时,栈收缩。(C的默认的数组是不是分配在栈上…?

  5. 内核虚拟内存

    地址空间顶部为内核保留,不允许读写或者调用。

Amdahl 定律

假设系统某部分所需执行时间与总时间的比例为α,该部分性能提升比例为k。

则总的执行时间为
image.png

故加速比为
image.png

简单分析,可得,将一个小部分的性能,即使提升很大的比例,总加速比S还是很难提高。

即使将占比40%的部分加速到
image.png

的程度,也就是和其它部分的耗时相比,所耗时间可以忽略不计,加速比也只有
image.png

所以说要对整个系统加速,必须优化系统的绝大部分;未被加速的部分,也就是慢步骤,是大幅削弱了快步骤的加速作用的。

并发和并行

并行(parallelism)是用并发来使一个系统运行得更快。

线程级并发

线程级并发可以使多核处理器的每一个核都同时进行多个线程(其实是决定先执行哪个线程更优)

你可能感兴趣的:(《深入理解计算机系统(CSAPP)》第一章 学习笔记)