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的
-
键盘输入命令 -> 读取到寄存器 -> 存储到主存
-
主存接收到指令,从磁盘中读取hello.c -> 代码复制到主存 -> 运行
-
主存将
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):操作系统代码常驻主存的部分。
通过内核,可以实现一个进程到另一个进程的转换,它不是一个独立的进程,是所有进程的管理者。
线程
一个进程由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,共享同样的代码和全局数据。
线程的具体概念在第一章中没有具体解释。(等我学到后面几章再说吧
虚拟内存
每个进程看到的内存都是一致的,称为虚拟地址空间,这样,就产生了每个进程都在独占地使用主存的假象。
虚拟地址空间
地址从小到大,虚拟地址空间分为一些准确定义的区。
-
程序代码和数据
代码从同一固定地址开始,存放代码。接下来存放C全局变量的数据。小地址的地方存放只读代码数据,大地址的地方存放可读可写数据。
-
堆
malloc等函数分配的空间分配在运行时堆上。
-
共享库
存放C标准库等库中的内容。
-
栈
用户栈。用来实现函数调用,在程序执行期间可以动态地扩展和收缩,实现函数调用。调用函数时,栈扩展,从函数返回时,栈收缩。(C的默认的数组是不是分配在栈上…?
-
内核虚拟内存
地址空间顶部为内核保留,不允许读写或者调用。
Amdahl 定律
假设系统某部分所需执行时间与总时间的比例为α,该部分性能提升比例为k。
则总的执行时间为 image.png
故加速比为 image.png
简单分析,可得,将一个小部分的性能,即使提升很大的比例,总加速比S还是很难提高。
即使将占比40%的部分加速到 image.png 的程度,也就是和其它部分的耗时相比,所耗时间可以忽略不计,加速比也只有 image.png所以说要对整个系统加速,必须优化系统的绝大部分;未被加速的部分,也就是慢步骤,是大幅削弱了快步骤的加速作用的。
并发和并行
并行(parallelism)是用并发来使一个系统运行得更快。
线程级并发
线程级并发可以使多核处理器的每一个核都同时进行多个线程(其实是决定先执行哪个线程更优)
网友评论