CSAPP 读书笔记 (1)

写在前面的话:虽然不想说,但是新的一年又开始了,整理了硬盘里的书,发现自己真的是光顾着收集书而从来不看,这简直没有意义啊,浪费在找书上的时间并没有得到回报。所以,先从CSAPP这本书开始吧,刚好自己电脑内有个 ubuntu,那么就开始吧。


第1章 计算机系统漫游

1.4 处理器读并解释存储在存储器内的指令

shell 是一个命令行解释器,它输出一个提示符,等待你输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的 shell 命令,那么 shell 就会假设这是一个可执行文件的名字,它将加载并运行这个文件。

关于 shell 的定义,简单明了的解释。

1.4.1 系统的硬件组成
3.内存

主存是一个临时存储设备,在处理执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的,从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(即数组索引),这些地址是从零开始的。
一般来说,组成程序的每条机器指令都由不同数量的字节构成。与C程序变量相对应的数据项的大小是根据类型变化的。

有关内存的定义

4.处理器

处理器的核心是一个字长的存储设备(或寄存器),成为程序计数器(PC)。在任何时刻,PC 都指向主存中的某条机器语言指令(即含有该条指令的地址)。

从系统通电开始,直到系统断电,处理器一直在不断执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集结构来决定的。在这个模型中,指令按照严格的顺序执行,而执行一条指令包含执行指定的步骤。处理器从程序计数器(PC)指向的存储器处读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令,而这条指令并不一定与存储器中刚刚执行的指令相邻。

这样的简单操作并不多,而且操作是围绕着主存、寄存器文件(register file)算术/逻辑单元(ALU)进行的。寄存器文件是一个小的存储设备,有一些1字长的寄存器组成,每个寄存器都有唯一的名字。ALU计算新的数据和地址值。

处理器看上去只是它的指令集结构的简单实现,但是实际上现代处理器使用了非常复杂的机制来加速程序的执行。因此,我们可以这样区分处理器的指令集结构和微体系结构:指令集结构描述的是每条机器代码指令的效果;而微体系结构描述的是处理器实际上是如何实现的。

原来CPU是这么工作的啊……CPU通过寄存器得到主存中的机器指令并执行(按图索骥么这是),这些概念应该在随后还会讲到,这里的简单介绍还比较好理解。

1.6 存储设备形成层次结构

存储器层次结构的主要思想是一层上的存储器作为第一层存储器的高速缓存。因此寄存器文件就是L1的高速缓存,L1是L2的高速缓存,L2是L3的高速缓存,L3是主存的高速缓存,而主存又是硬盘的高速缓存。

一个存储器层次结构的示例

1.7 操作系统管理硬件

我们可以把操作系统看成是应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统。

操作系统有两个基本功能:1)防止硬件被失控的应用程序滥用。2)向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。操作系统通过几个基本的抽象概念(进程、虚拟存储器和文件)来实现这两个功能。如图1-11,文件是对 I/O 设备的抽象表示,虚拟存储器是对主存和硬盘 I/O 设备的抽象表示,进程则是对处理器、主存、和 I/O 设备的抽象表示。

第10页例图

操作系统的作用,想起上操作系统课程的时候老师将硬盘时强调的物理地址和逻辑地址。操作系统应该可以看成是一个超大的底层的应用程序吧?其他所有应用程序都要运行在操作系统之上。

1.7.1 进程

进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像独占地使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。传统系统在一个时刻只能执行一个程序,而先进的多核处理器同时能够执行多个程序。无论是在单核还是多核系统中,一个 CPU 看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换( context switch )

操作系统保持跟踪进程运行所需的所有状态信息,这种状态,也就是context,它包括许多信息,例如 PC 和寄存器文件的当前值,以及主存的内容。在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行**context switch **,即保存当前进程的 context、恢复新进程的 context,然后将控制权传递到新进程,新进程就会从上次停止的地方开始。

示例场景中有两个并发的进程:shell 进程和 hello 进程。起初,只有 shell 进程在运行,即等待命令行上的输入。当我们让它运行 hello 程序时,shell 通过调用一个专门的函数,即系统调用,来执行我们的请求,系统调用会将控制权交给操作系统。操作系统保存 shell 进程的 context,创建一个新的 hello 进程及 context,然后将控制权传递给新的 hello 进程,hello 进程终止后,操作系统恢复 shell 进程的 context,并将控制权传回给它,shell 进程将继续等待下一个命令行输入。

根据书中给的例子,基本能看懂 context switch 在例子中是怎样一回事了,话说回来看这本书真的好像在看操作系统啊。

1.7.2 线程

在现代系统中,一个进程实际上可以由多个成为线程的执行单元组成,每个线程都运行在进程的 context 中,并共享同样的代码和全局数据。

1.7.3 虚拟存储器

虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存,每个进程看到的是一致的存储器,成为虚拟地址空间。下图所示的是 Linux 进程的虚拟地址空间(其他 Unix 系统的设计也与此类似)。在 Linux中,地址空间的底部区域存放用户进程定义的代码和数据。下图所示的地址是从下往上增大的。

12页例图

每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。我们从最低的地址开始,逐步向上介绍

  • 程序代码和数据。对于所有的进程来说,代码是从同一固定地址开始,紧接着的是和 C 全局变量相对应的数据位置。代码和数据区是直接按照可执行目标文件的内容初始化的。在示例中就是可执行文件 hello。
    (PS:hello 是通过链接器在链接阶段获得的,可被加载到内存中)
  • 堆。代码和数据后紧随的是运行时堆。代码和数据区是在进程一开始运行时就被规定了大小,于此不同,当调用如 mallocfree 这样的 C 标准库函数时,堆可以在运行时动态地拓展和收缩。
  • 共享库。大约在地址空间的中间部分是一块 用来存放像 C 标准库和教学库这样共享库和代码的数据。
  • 栈。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用,和堆一样,用户栈在程序执行期间可以动态地拓展和收缩。特别是每次我们调用一个函数时,栈就会增长,从一个函数返回时,栈就会收缩。
  • 内核虚拟存储器。内核总是驻留在内存中,是操作系统的一部分。地址空间顶部的区域是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。
1.7.4 文件

文件就是字节序列。每个 I/O 设备,包括磁盘、键盘、显示器,甚至网络,都可以视为文件。系统中的所有输入输出都是通过一小组称为 Unix I/O 的系统函数调用读写文件来实现的。
文件向应用程序提供了一个统一的视角,来看待系统中可能含有的所有各式各样的 I/O 设备。进一步说,同一个程序可以在使用不同磁盘技术的不同系统上运行。

这说的是硬件无关性么?

1.9 重要主题

1.9.1 并发和并行

并发(concurrency) 是一个通用的概念,指一个同事具有多个活动的系统;而术语并行(parallelism)指的是用并发使一个系统运行得更快。

1.9.2 计算机系统中抽象的重要性

在处理器里,指令集结构提供了对实际处理器硬件的抽象。使用这个抽象,机器代码程序代码程序表现得好像它是运行在一个一次只执行一条指令的处理器上。底层的硬件比抽象描述的要复杂精细的多,它并行地执行多条指令,但又总是与那个简单有序的模型保持一致。只要执行模型一样,不同的处理器实现也能执行同样的机器代码,而又提供不同的开销和性能。

17页例图

在学习操作系统时,我们介绍了三个抽象,文件是对 I/O 的抽象,虚拟存储器是对程序存储器的抽象,而进程是对一个正在运行的程序的抽象。而虚拟机提供对整个计算机(包括操作系统、处理器和程序)的抽象。

1.10 小结

  • 因为计算机把大量的时间用于存储器、I/O 设备和 CPU 寄存器之前复制数据,所以将系统中的存储设备划分为层次结构。
  • 在层次结构中,高层的存储设备比底层的存储设备要快,单位比特开销也更高。较高层次存储设备可以作为较低层次设备的高速缓存。通过理解和运用这种存储层次结构的知识,程序员可以优化 C 程序的性能。
  • 从特殊角度来看,网络就是一种 I/O 设备。

PS : 书中的1.9节中,关于并行和并发的三个层次(15-17页)可以说完全没看懂……应该在随后的章节中还会进一步解释吧。先记录下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容