为读《CSAPP》II做准备。
读《CSAPP》2E II笔记。
2015.01.02 – 01.03
计算机内存中的一段二进制码,在不同的“上下文”中其含义不同,它可以表示一个整数、浮点数、字符串或者指令。“上下文” ---- 比如“char ch = ‘a’;”ch地址中所存的’a’的二进制码,其类型char(源程序级)就算一种上下文。
对编译器的最初层次的认识:
[汇编语言中的伪指令等由编译器来解释,只有汇编指令会被对应的转换为机器指令,最后被机器执行]
理解程序和硬件之间的交互关系(硬件资源是如何被用来执行指令)。然后再理解编译器和机器代码,达到编写高性能C程序,最大化程序性能的目标。
2014.12.30 – 2015.01.02
信息存储(二进制):
Figure 1. 内存级别
计算机中的整数、浮点数(二进制):
Figure 3. 浮点数
2015.01.03
《CSAPP》“程序的机器级表示”一章窥视了C语言的抽象层下面的东西(C经过编译器的机器级程序表示)。通过让编译器产生机器级程序的汇编代码表示,让人了解编译器和它的优化能力,以及机器、数据类型和指令集。个人学习“程序的机器级表示”章节路线:
2014.01.08
书中的“Y86指令集”说明了不管是汇编语言还是寄存器都只是“助记符”,它们都对应一个编码。计算机不同的功能需要不同的电平(集合)驱动,这些电平对应了逻辑上的0, 1串,将这些0, 1串间接或者直接地用助记符(汇编指令,寄存器名)来一一对应(对于人来说,助记符更符合人们的习惯[当然,咱得先学几个单词])。如此,在设计了编译器后,我们就可以使用助记符来指定计算机的功能(助记符 --> 机器码[0, 1串] --> 高/低电平 + 时钟指定计算机中组合/时序电路工作)。
“逻辑设计和HCL”指出计算机中的运算等操作都是经过最基本的逻辑门来实现的。根据组合/时序逻辑设计方法,可以设计出具一定功能的电路,如比较器、寄存器、存储器等。我们可以去设计这些属于数字电路的内容(如通过FPGA)。
通过“Y86顺序实现”来说明计算机执行指令的过程。这部分内容跟《计算机组成原理/体系结构》中涉及的内容/思维相同,《CSAPP》还涉及了处理器的设计思想,如流水线(实现);还涉及到处理器不能处理的情况(异常处理)。知己知彼的状态更有利于作战,所以,这部分内容可熟读并理解。毕竟,咱虽没有加工制作过处理器,但还是有少许可能去设计它的。
2015.01.08 –01.09
2015.01.09
把存储器系统当作一个线性的字节数组是一个有效的模型,但它没有反映现代系统实际工作的方式。实际上,存储系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。存储器层次结构对应用程序的性能有着巨大的影响,如果程序所需要的数据是保存在CPU寄存器中的,那么在指令的执行期间,在零个周期内就能访问到它们;如果存储在高速缓存中,需要1 ~ 30个周期;如果存在主存中,需要 50 ~ 200个周期;如果存在磁盘上,大约需要几千万个周期。
如果理解系统是如何将数据在存储器层次结构中上上下下移动的,那就可以这样编写应用程序:使其中的数据项存储在层次结构较高的地方,在那里CPU能更快地访问到它们。倾向于一次又一次地访问相同的数据项集合,或是更倾向于访问邻近的数据项集合称为计算机程序的局部性。具有良好局部性的程序比局部性差的程序更多地倾向于从存储层次结构中较高层次处访问数据项,因此运行得更快。
阅读此章从“编写高速缓存友好的代码”(告诉缓存对应用程序性能的影响最大)的实际掌握其中的技巧,并随便学习与存储相关的科普知识。涉及此部分内容的其它书本有《计算机组成原理》。
掌握程序和操作系统之间的交互关系。
2015.01.09
学习链接的作用:
涉及到链接内容的书本有《Linux C编程一站式学习》、《C专家编程》。
2015.01.09
学习异常控制的作用:
理解跳转、调用和返回等概念(描述的现象)可以看书本《汇编语言》 ---- 王爽。
2015.01.10
一个系统中的进程是与其它进程共享CPU和主存资源的。为了更加有效地管理存储器并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟存储器。虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。通过一个很清晰的机制,虚拟存储器提供了三个重要的能力:1)它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。2)它为每个进进出出提供了一致的地址空间,从而简化了存储器管理。3)它保护了每个进程的地址空间不被其他进程破坏。
虚拟内存不需要应用程序员的任何干涉,但学习虚拟内存有以下作用:
学完此章要理解虚拟存储器是如何工作的,应用程序如何使用和管理虚拟存储器。若掌握了这些细节知识,就可以手工模拟一个小系统的虚拟存储机制,通过显式的存储器映射和对像malloc程序这样的动态存储分配器的调用来管理虚拟存储器,还会对虚拟内存的概念更加清晰。
应用程序利用操作系统提供的服务来与I/O设备及其他程序通信。学习这部分内容后,可以学习编写诸如Web服务器这样的可以同时为多个客户端提供服务的并发程序。编写并发应用程序还能使程序在现代多核处理器上执行得更快。
2015.01.11
输入/输出(I/O)是在主存和外部设备(如磁盘驱动、终端和网络)之间拷贝数据的过程。输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝到数据到I/O设备。
所有语言的运行时系统都提供执行I/O的较高级别的工具(如ANSI C提供标准I/O库,包含像prinf和scanf这样执行带缓冲区的I/O函数)。大多时候,高级别I/O函数工作良好,没有必要直接使用Unix I/O。那么学习系统级I/O的作用有:
涉及到系统级I/O和标准库I/O的书籍有《Linux C编程一站式学习》。
2015.01.11
网络应用(浏览Web、发送E-mail、弹X window)基于相同的基本编程模型,有着相似的整体逻辑结构,并且依赖相同的编程接口。网络编程依赖的基础有“进程”、“信号”、“信号”、“字节顺序”、“存储器映射”以及“动态分配”,然后再掌握客户端-服务器编程模型,以及如何编写使用因特网提供的服务的客户端-服务器程序。结合这些概念能够开发一个小但功能齐全的Web服务器,能够为真实的Web浏览器提供静态和动态的文本和图片内容。
2015.01.11
逻辑控制流在时间上重叠就是并发(硬件异常处理程序、进程和Unix信号处理程序等),并发可以出现在计算机系统的许多不同层面上。并发不仅是操作系统内核用来运行多个应用程序的机制,它也可以在应用程序中成为重要角色。
应用级并发程序的作用有:
使用应用级并发的应用程序称为并发程序,现代操作系统提供了三种基本的构造并发程序的方法:
看到11章时,不禁想起《鹿鼎记》中澄观师侄跟韦小宝说一段对话 要练易筋经,得先练好般若掌……需得从少林长拳、罗汉拳、伏虎拳、韦陀掌、大慈大悲千手式……到能练成小宝最想学的一指禅功夫,便少说也得三四十年。
|
因为《CSAPP》中各章节几乎都需要有Linux OS的本,因此不涉及有本或无本的优先读书顺序。因此就只剩下个人直觉上的读章顺序(遇到多书讲同一章节的数就同时看多书,用一本)如下: