《深入理解计算机系统》从程序设计与性能优化的角度介绍了计算机系统,让我从程序员的角度了解了计算机系统,更深入地理解了硬件、操作系统和编译系统等对应用程序性能和正确性的影响,并掌握了基本的程序优化设计技术,为编写更高效可靠的程序打下了基础。下面是我在阅读过程中的一些技术领悟与心得体会。
1、信息表示
在信息表示板块我了解了数据在计算机中的表示,不同的机器有不同的字长和顺序约定,包括大端法和小端法,就连程序也是字节序列。当然,计算机中的数据都有一定的类型,决定了它的范围、大小和操作方式。如果不注意这些性质就容易在程序中产生致命的错误。例如,有符号数在和无符号数比较时,有符号数会被隐式转换为无符号数。隐式转换过程中位表示形式没有变化,但是理解方式发生了变化,于是就会出现负数变为大正数的现象。在符号拓展时,会出现符号位复制的现象,在进行加法和乘法运算时,还要注意溢出问题。在大多数机器中,移位和加运算比乘法快得多,但负数除以2的幂需要注意按情况进行修正。以上这些虽然看起来是小问题,但在编写程序过程中却极容易出错,对计算机算术的深刻理解是编写可靠程序的关键。
2、汇编语言
这部分首先介绍了Intel处理器的发展史,概览了处理器核心数及频率变化,及x86指令集和64位架构发展史,然后介绍了c语言、汇编码和机器码,汇编语言中的数据传送指令及算术指令。接下来介绍了用于控制的条件码以及条件分支结构,各种循环的异同和switch语句。
我体会到,由于汇编代码非常接近于计算机执行的实际机器代码,阅读这些代码使我们更能够理解编译器的优化能力,并分析出代码中的潜在低效率。我们还了解了栈帧结构,知道了过程调用离不开栈指针和帧指针,以及转移控制指令。在数组介绍中,我知道了高维数组的内存分配的行优先顺序,进一步学习了指针访问方式;在结构数据类型中,我惊讶的发现结构成员的顺序会影响结构变量的大小,因为对齐条件——某种数据类型的地址必须是某个值的倍数——以及边界条件,即结构末尾可能会有填充。最后我还了解了缓冲区溢出。这是因为c对数组引用不进行任何边界检查,所以对越界的数组元素的写操作会破坏储存在栈中的状态信息,从而可能出现很严重的错误。对于程序员而言,使用gets等能导致储存溢出的函数,都是不好的习惯。
以前写程序,都只关注最表面的东西,从未了解过计算机的实现过程和代价。初读这本书,了解一些计算机的实现过程,不但能帮助我理解计算机的优化原理,对学习其他课程也有帮助。