我带着一个要成为编程大牛的理想,下定决心开始看《深入理解计算机系统》这本书了。由于正在读研究生,没有全力去看这本书,更新速度比较慢。但是,这是一个起点,我相信也不是一个终点。
应该带着目标去学习。我们就以解决问题为导向开始着手这件事。文章记录一些我比较关心的知识点。越来越发现,书中的图才是精华。
能解决的问题:
1.奇怪的数字错误;
2.学会通过一些小窍门来优化自己的C代码。
3.了解编译器是如何实现过程调用的,以及如何利用这些知识来避免缓冲区溢出错误带来的安全漏洞。
4.学会如何编写自己的Unix shell、自己的动态内存分配包,甚至于自己的Web服务器。
5.认识并发带来的希望和陷阱,这个主题随着单芯片上集成了多个处理器核变得越来越重要。
知识点总结:
1.系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特bit表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
每个字节表示程序中的某些文本字符。大部分的现代计算机系统都使用ASCII标准来表示文本字符。用于英语类语言文本。这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符。
ASCII字符集适合于编码英文文档。但是在表示一些特殊的字符方面并没与太多办法。基本编码,称为Unicode的“统一字符集” 解决了这一问题,使用32位来便是字符,即每个文本串中每个字符要占用4个字节。它支持广泛的语言种类。
UTF-8表示将每个字符编码为一个字节序列。即所有的ASCII字节序列在UTF-8中是一样的。
2. 目标程序即可执行目标文件。它的生成如下:每一条C语言都被其他程序转化为一系列的低级及其语言指令,然后这些指令按照一种称为可执行目标程序的格式打包好,并以二进制磁盘文件的形式存放起来。
预处理器、编译器、汇编器和链接器一起构成了编译系统compilation system.
3.系统的硬件组成:总线 + I/O设备 + 主存 +处理器。
I/O设备、主存和处理器是计算机的核心。
字(word),通常总线被设计成传送定长的字节块,也就是字。字中的字节数(字长)是一个基本的系统参数。32位字长系统的字长是4个字节,64位使8个字节。
中央处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
CPU围绕着主存、寄存器文件(register file)和算术/逻辑单元(ALU)进行。
寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有一个唯一的名字。
ALU计算新的数据和地址值。
4.所有应用程序对硬件的操作尝试都必须通过操作系统。
5.进程是操作系统对一个正在运行的程序的一种抽象。并发运行指多个进程在同一时间段内交错执行。
无论是在单核还是多核系统中,一个CPU看上去都想是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换。
一个进程可以由多个线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。一个线程只属于一个进程。使用线程,我们甚至能够在一个进程中执行多个控制流。
超线程,即同时多线程(simultaneous multi-threading),是一项允许一个CPU(即一个进程)执行多个控制流的技术。即一个进程多个线程。