《深入理解计算机系统》----总结

第一章     计算机系统漫游

主要内容:主要是全面精炼的概括了本书的内容,也就是“计算机系统概述”,包括:

a)      解释计算机系统中“信息”的概念:就是二进制位;

b)      解释源程序(以C源程序为例)到可执行程序的过程:

   预处理 → 编译 → 汇编 → 链接

c)      通过可执行程序被shell加载执行流程,讲解了计算机的硬件组成:

 总线、I/O设备、主存、处理器

然后,简单了述说了高级缓存的作用以及计算机存储设备的体系结构-------金字塔层次结构。

d)      解释了操作系统、应用进程、计算机硬件三者之间的关系:操作系统管理硬件,为应用程序提供简单一致的机制来控制复杂而又大相径庭的硬件。进而讲解了操作系统提供进程间的上下文切换、线程、虚拟存储器等;

e)      最后,简单讲解了网络通信(这部分内容需要看《UNIX网络编程》)和相关重要课题:并发与并行、抽象

第二章     信息的表示和处理

主要内容:主要讲解自然界中的各种信息在计算机系统中的表示和处理方法。

1. 所有的数据都以二进制存储,附带讲解了进制表示法、c语言中各种数据类型大小、大小端寻址、机器码以及各种位运算等;

2. 深入讲解了计算机对整数的表示及其编码,从数学上详细推导了UINT ←→ INT 间相互转换的公式;之后,讲解计算机的整数运算,分析各种溢出、截断等;

3. 讲解了计算机浮点数的表示与运算:单精度浮点数4byte(1—符号位、8---阶码、23---编码尾数),双精度浮点数8byte(1---符号位、11---阶码、52---尾数)

第三章     程序的机器级表示

主要内容:以Intel X86架构为例,讲解了最接近机器码的程序汇编代码,包括汇编语言中的算数与逻辑操作、控制操作、程序执行过程(栈帧、控制抓你也)、数组分配、异质结构(结构体、联合体)等。

1.      汇编内容可以找一本《汇编语言》的书详细查看;

2.      讲解了X86过度到X86-64的进程;

3.      讲解了数据对齐(字节对齐)

补充:学会看懂汇编代码对编写C代码有很大益处,所以这部分内容需要深入学习。

第四章     处理器体系结构

主要内容:在第三章《程序的机器级表示》基础上,讲解了处理器(cpu)的体系结构。类似于intel X86架构,讲解了一个自定义的架构:Y86,主要是为了后续对这种的架构进行硬件设计的论述,包括利用各种逻辑门实现各种指令、CPU的时序、流水线实现、异常处理等等,这部分内容太硬件化,加之我对汇编只是略懂皮毛,很难看懂,所以略过。

第五章     优化程序性能

主要内容:在前几章的基础上,简单分析了C程序员如何利用CPU、编译器的各种特性优化程序性能。主要有如下几点:

1、  GCC编译其的几级优化:  -O1  O2  O3选项,

Gcc –O1 xxx.c –o xxx.out

2、  用一个求和的例子,将程序性能的概念数学化:每元素的周期数(CPE),后续都是优化这个求和程序:

a)        将for循环中多次被执行的语句提出来,消除循环的低效率。如数组求和,应先把数组的大小算出来(不会改变),然后进行for循环。

b)        减少过程调用:同样如数组求和,每次都取出一个元素的方法很低效。可以取出一个元素的后,用地址偏移的方法获得后续的元素。

c)        消除不必要的存储器引用。例如,函数的结果由入参指针返回,在函数体内部可以先申请一个临时变量,计算完结果后,将临时变量的值赋给指针所指向的地址值。

3、  用数据流的方法讲解了现代处理器对数据的处理流程,从而通过分析数据流,将程序优化。讲解了几种通用的方法:将循环展开(循环一次,计算数组的多个元素)、提高并行性等。

4、  后面还有一些内容,讲寄存器溢出、分支预测与预测错误惩罚、存储器的性能等。有点深奥,需要慢慢体会。

第六章     存储器层次结构

主要内容:讲解了计算机中存储器的金字塔体系结构寄存器→ 一级缓存 → 二级缓存 → 三级缓存 → 主存 → 硬盘 → 网络存储。自上而下,存取速率越来越慢,价格也越来便宜。上层为下层提供缓冲。

         通过分析存储器性能,讲解了程序设计的一个原则:局部性。包括时间局部性空间局部性。时间局部性是指被引用过一次的存储器位置很可能在不远的将来再次被引用。空间局部性是指一个存储器被引用一次,很可能在不远的将来,程序有引用其附近的一个位置。

         深入讲解了高速缓存存储器的原理,以及缓存不命中后的程序处理:缓存行替换。讲解了不同的替换策略最不常使用(Least-Frequently-Used,LFU)策略、最近最少使用(Least-Recently-Used,LRU)策略。

         关于缓存数据写会到磁盘中,讲解了两种方法:直写(write-through),就是立即将缓存数据写会到紧挨着的第一层存储器中;写回(write-back),尽可能的推迟存储器的更新,只有当替换算法要驱逐更新过的块时,才把它写到紧挨着的下一层存储器中。

第七章     链接

主要内容:本章的内容和《程序员的自我修养—链接与装载》整书内容一样,简单的说就是编译器如何解释、翻译的文件的各个符号。然后将它们重定位,最终形成一个可执行文件。

Linux可执行文件格式为ELF格式,讲解了ELF文件的各个段,讲解了链接器如何对ELF文件的未定符号进行重定位与链接(静态链接、动态链接)。

最后讲解了linux API如何加载和链接共享库,也就是几个系统调用的使用:dlopen、dlclose、dlerror等,以及处理目标文件的几个linux工具(ar、strings、nu、size、readelf、objdump、ldd)。

         个人认为本章内容重点:

1.      掌握链接、加载原理;

2.      学会制作动态链接库。

第八章     异常控制流

主要内容:讲解了计算机系统异常的概念:控制流的突变。主要包括:中断陷阱故障终止。部分由硬件实现(如:I/O设备信号中断),部分由操作系统实现(如系统调用引起陷阱、缺页异常引起故障异常、硬件错误引起终止异常等)。Linux/IA32的系统调用是通过一条称为int n的陷阱指令来提供,其中n可能是IA32异常表中256个条目中的任何一个。

1.      讲解了linux系统进程的概念。它是一个抽象的概念:包括进程的进程逻辑控制流、进程私有空间(X86:0x08048000;X64:00400000)、用户模式和内核模式、进程上下文切换;

2.      简单的讲解了linux系统进程控制的一个系统调用:getpid、getppid、exit、fork、waitpid等;

3.      简单讲解了更高层的软件形式异常:信号。包括信号的发送(kill程序、键盘发送、kill函数、alarm等),这其中有进程组的概念(每个进程都属于一个进程组),fork出来的子进程的进程组号默认是父进程ID;信号的接收(注册信号处理函数、忽略信号);信号的处理-----待处理信号被阻塞、待处理信号不会排队等待(之多只有一个待处理信号)、系统调用可以中断,这里面就有个问题:多个并发发生的信号由于有待处理信号可能会被阻塞,导致后面的信号丢失。

4.      非本地跳转:用户级异常控制流形式,将控制直接从一个函数转移到另外一个正在执行的函数,而不需要正常的调用—返回序列。Setjmp调用一次,返回多次(第一次返回0,保存当前返回环境,后面返回longjmp的非零返回值)、longjmp调用一次,从不返回。Sigsetjmp和siglongjmp是可以被信号处理程序使用的版本。

5.      介绍了linux系统操作进程的工具:STRACE、PS、TOP、PMAP、/proc。

第九章     虚拟存储器

主要内容:虚拟存储器(virtual memory, VM)是计算机系统一种对主存的抽象概念。本章首先讲解虚拟存储器是如何工作的,之后讲解应用程序如何使用和管理虚拟存储器。

1.      物理寻址和虚拟寻址:物理寻址是CPU直接生成物理地址返回物理内存,虚拟寻址是CPU生成虚拟地址经地址翻译后转化为物理地址对其进行寻址;

2.      虚拟存储器作为缓存的工具:

1)  虚拟存储器被组织为存放在磁盘上的N个连续的字节大小的数组。VM系统通过将虚拟存储器分割为称为虚拟页的大小固定的块来处理。任意时刻,虚拟页面的集合分为三种:未分配的、缓存的、未缓存的。

2)  虚拟页与物理页(内存/主存)的缓存关系由页表来维持,页表就是一个页表条目(Pagetable entry,PTE),将虚拟页映射到物理页。

3)  简单的讲解了虚拟存储器页命中、缺页、页面分配的基本处理流程,以及因为程序局部性而保证虚拟存储器系统能高效工作的原理。

3.      虚拟存储器作为存储器管理的工具:实际上,操作系统为每个进程提供了一个独立的页表,因为也就是一个独立的虚拟地址空间。

1)  简化链接:独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不管代码的数据实际存放在物理存储器的何处。

2)  简化加载:简单的来说exec类函数可以方便的执行,操作系统只需要更改适当修改页表条目。同时,还为存储器映射(将一个虚拟页映射到任意一个文件中的任意位置)提供可能:mmap。

3)  简化共享:

4)  简化存储器的分配:malloc类函数

4.      虚拟存储器作为存储器保护的工具:通过在PTE(页表条目)上添加一些额外的许可位可控制程序对相关虚拟页的访问权限。

5.      地址翻译:涉及到深入的硬件知识。忽略···

6.      Linux存储器系统,也就是linux内存管理。

7.      动态存储器分配。讲解了linux系统malloc/free类函数的实现原理,并配有小的实践代码。

8.      垃圾回收:C语言不存在垃圾回收,malloc分配的存储空间需要程序员显式释放。主要讲解了垃圾回收的原理。

9.      C程序中常见的与存储器有关的错误:空指针、野指针、越界、泄漏等。

第十章     系统级I/O

主要内容:本章所有内容都讲述了linux系统对文件的操作,包括打开/关闭、读/写、读取文件元数据(fstat/stat)、文件共享、I/O重定向等。此外,本章在系统I/O函数的基础上,开发了一个带缓冲的lib可供参考。

第十一章           网络编程

主要内容:讲解了当今主要的网络应用模型:C/S模型,简单了讲解了HTTP协议并开发了一个小型的Web服务器,学习web开发可以作为入门参考。

第十二章           并发编程

并发编程是一个深奥的内容,但是本章介绍的比较粗略。主要讲解了三种基本的并发:基于进程的并发(fork)基于I/O复用的并发(select/poll/epoll模型)以及基于线程的并发

基于线程的并发要考虑线程间如何共享变量、线程间同步等问题。

最后介绍了并发可能产生的问题:可重入性、竞争、死锁等。

总之,并发是个深奥的话题,本书由于主要介绍计算的原理,讲的比较粗略,需要深入体会。

 

 

个人认为本书重点:

1.      第二章:信息表示和处理,特别是相关数学原理;

2.      第三章:程序的机器级表示,要熟练的看懂/使用汇编语言;

3.      第五章:程序性能优化的几种基本方法和思想;

4.      第六章:计算机存储器体系;

5.      第八章:计算机异常控制;

6.      第九章:虚拟存储器原理-------------最重要。

你可能感兴趣的:(计算机原理)