对《程序员的自我修养》(龙书)读后思考
一、第一章 溫故知新
第一章首先簡單說了計算機架構,北橋芯片的來源,南橋芯片的來源,以及系統對內存的基本管理(內存的分段管理,分頁)等。然后后面講到系統中的進程和線程,由于是多進程、多線程,以及安全問題。(線程安全問題其實就是同步問題)
多線程是為了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》。
總結
以上是生活随笔為你收集整理的对《程序员的自我修养》(龙书)读后思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 盛松成:别死盯着M2不放,社会融资规模更
- 下一篇: 如何设置iPhone的WIFI?