对《程序员的自我修养》(龙书)读后思考

来源:互联网 发布:二级access题库软件 编辑:程序博客网 时间:2024/06/07 02:50

一、第一章 温故知新


第一章首先简单说了计算机架构,北桥芯片的来源,南桥芯片的来源,以及系统对内存的基本管理(内存的分段管理,分页)等。然后后面讲到系统中的进程和线程,由于是多进程、多线程,以及安全问题。(线程安全问题其实就是同步问题)

多线程是为了cpu计算资源的更好利用,和资源的并行执行!

对于目前实现线程安全问题有一些概念:

原子操作,因为一些重要的同步计算过程不是原子的,那么在调度器,就有可能中断,让线程执行其他任务,然后回来再计算。那么这就造成这个时间段,有其他线程已经改变了你之前获取的数据。原子问题是同步问题的本质。

多说点:目前有部分同步操作,是基于硬件的,比如CAS操作;其实上层触发一个指令(机器指令),cpu 要处理很多计算,就是在硬件上执行这条指令对应所有步骤,硬件上设计上对应自己支持的所有机器指令。每一条指令就像自己已经记忆的众多指令的一个命令。(所有记忆的指令就是自己支持的指令)

二元信号量

互斥量:是不是正在有执行线程的标志

临界区:自己线程的概念,和正在执行标志位

读写锁

同步过度优化

多线程模式:

即用户态线程(对于开发者的执行引擎或者虚拟机,或者操作系统本身)和内核态的对应关系:一对一,多对一,多对多。


二、第二章 编译和链接


编译主要根据代码文件编译对应的.o或者.obj文件,一个代码文件对应编译一个.obj文件。编译过程首先的就是代码的字符静态检查,或者词法分析,然后就是语法分析。语法分析之后将你的代码建立一个代码书(根据你的代码逻辑),然后就是中间文件的生成。

中间文件是由中间指令和数据字符组成,中间文件中包含定位符,引用符号等。

链接就是将中间文件生成可执行文件,将定位符号,跳转符号,转换成具体的目标地址。链接过程虽是发生在编译器中,但是这个过程却是和操作系统的加载过程息息相关。

对于c/c++编译器 GCC 我们可以操作命令对其进行编译和连接,对于工具类,如svn、编译器、git;或者打包工具,如gradle, ant,msbuild,xcode,或者maven 都是有命令行指令的。在远程调用的时候,我们只能通过网络发出指令,实现自动化。

对于跑在操作系统上的应用,很多都是支持命令行的,因为对于我们的操作不仅仅是图形页面、人为UI操作。更在于我们通过指令,或者远程发送指令操作。


三、第三章 目标文件是什么


目标文件的生成不仅仅和编译器有关系,还和具体生成的目标文件在什么系统上执行有关。(如Windows,Linux,Solaris等)。目标文件中有代码,数据,符号,字符串等,它是以section为单位对代码,数据,符号和字符进行划段管理,.data是放置全局变量和静态变量,.code或者.text  section是放置代码。.bass是存放为初始化的变量(全局变量和静态变量)。对于中间目标文件还存在文件头,是用来存储文件属性,静态链接的信息,如静态链接的入口,链接位置等。如果是可执行文件,那么文件头是文件属性和操作系统的信息。

其实目标中间文件就是两大片段,一个是代码区,一个是数据区,数据和代码分开主要是代码在加载中,是只读的。数据区是可读写的。还有就是代码指令一般是一份,不用创建副本,但是数据可能要创建副本,因为涉及数据的备份等。

对于Linux系统目标文件一般是ELF,Windows系统目标文件一般是.o或者.obj文件。

对于目标中间文件,其中除了.data,.code,.bss,还有rodatal 存储常量数据。

.commemt存储编译器版本信息

.debug 存储调试信息,因为我们可能需要代码在调试下做debug信息处理,断点等等。

.dynamic 动态链接信息

.init/.final 初始化信息

.shstrtab 存储 section表信息  对于一个目标文件可能有很多的section,section 信息我们需要存储的。

.plt/.got 动态链接 入口,全局入口等信息。


四、第四章 静态链接


静态链接做的工作就是:将中间目标文件中的数据section,code section,进行整合,相同类似的section进行合并。代码段中的数据符号,换成引用地址,相同的代码片段进行合并整合。静态链接是以目标文件为单位的,最后生成各个可执行文件。对于编译器,点击run,将会将可执行文件打包成EXE文件(Windows,Linux可执行文件COFF)。

对于我们编译器工具,当然也可以将可执行文件打包成静态库文件(.lib),以供其他可执行文件调用。静态链接给各个段分配相对的目标地址,同时将引用换成目标地址,静态链接过程的耗时很长的,要比编译阶段的耗时要长。

可执行文件也是有和目标文件相同的section,可执行文件中的代码或者数据、字符;都是二进制代码(二进制文件),对于代码的二进制1与0的机器码就是对应每一条汇编指令,换句话说就是机器指令。在字符面上就是对应汇编的每一条用字符标记的人可读的指令,在数字层面就是机器指令。


五、第五章 Windows PE/COFF二进制文件


六、第六章 可执行文件的装载与进程


























类似的书,比如《Compilers: Principles, Techniques, and Tools》这本也是传说中的龙书,还有非常著名的《SICP》和《PLAI》。