程序員的修養--讀書筆記

第一章 溫故而知新

-- cpu、內存、顯示設備、io設備早期都鏈接在一個總線上。後來出現了北橋芯片使得cpu,內存和高速的圖形設備能夠高速的交換數據。南橋芯片處理低速設備,比如磁盤,usb,鍵盤,鼠標等設備。
--名言 計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決。
--充分利用cpu:分時系統(每個程序運行一段時間以後都主動讓出cpu給其他程序),多任務系統(操作系統接管了所有的硬件資源,所有應用程序都以進程的方式運行在比操作系統權限更低的級別,每個進程都有自己獨立的地址空間,使得進程之間的地址空間相互隔離。Cpu由操作系統統一分配,先根據進程優先級的高低分配,但是運行超過一定時間後,操作系統會暫停該進程,將cpu分配給其他等待的進程,這叫做搶先式)。
--虛擬地址:把程序給出的地址看作一種虛擬地址,通過某些映射的方法,將這個虛擬地址轉換爲實際的物理地址。分頁的策略:把地址空間人爲地等分爲固定大小的頁,每一頁的大小由硬件決定,或者硬件支持多種大小的也,由操作系統選擇決定頁的大小。當我們把進程的虛擬地址空間按頁分割,把常用的數據和代碼頁裝載到內存中,把不常用的代碼和數據保存在磁盤中,當需要用到的時候再把它從磁盤裏取出來。
--虛擬存儲的實現需要依靠硬件的支持,對於不同的cpu來說是不同的。但是幾乎所有的硬件都採用一個叫mmu(Memory Management Unit)的部件來進行頁映射。在頁映射的模式下,cpu發出的是程序的虛擬地址。經過mmu轉換後就變成了物理地址。Mmu一般就集成在cpu內部。
--線程 是程序執行流的最小單元。一個標準的線程由線程id、當前指令指針、寄存器集合和堆棧組成。一個進程由多個線程組成,各個線程之間共享程序的內存空間(包括代碼段,數據段,堆等)及一些進程級的資源(如打開文件和信號)。
--線程調度 有優先級調度和輪轉法的方法。
--線程安全 同步與鎖。過度優化帶來的問題。
--用戶態多線程庫的實現方式。用戶實際使用的線程並不是操作系統內核裏的內核線程,而是存在與用戶態的用戶線程,它們之間可以是一對一模型,多對一模型或者多對多模型。

第二章 編譯和鏈接。

-- 編譯一個程序包含了以下的過程:預處理、編譯、彙編和鏈接。
-- 預處理:主要處理源代碼文件中的以”#”開始的預編譯指令。
-- 編譯:把預處理完的文件進行一系列詞法分析、語法分析、語義分析及優化後生產相應的彙編代碼文件。
-- 彙編:將彙編代碼轉變成機器可以執行的指令,每一個彙編語句幾乎都對應一條機器指令。這個過程只是根據彙編指令和機器指令的對照表一一對應就可以了。
-- 鏈接:地址和空間分配,符號決議和重定位。
-- 編譯器做了什麼:掃描,語法分析,語義分析,源代碼優化,代碼生成和目標代碼優化。
-- 鏈接:模塊之間的拼接。
-- 靜態鏈接(模塊拼裝) 把每個源代碼模塊獨立的編譯,然後按照需要把它們組裝起來。從原理上來講,它的工作無非是把一些指令對其它符號地址的引用加以修正。鏈接過程主要包括了地址和空間分配、符號決議和重定位等這些步驟。

第三章 目標文件裏有什麼

-- 編譯器編譯源代碼後生成的文件叫做目標文件。目標文件中的內容至少有編譯後的機器指令代碼,數據。除了這些,目標文件中還包括了鏈接時所需要的一些信息,比如符號表,調試信息,字符串等。結構爲文件頭,.text段保存了程序指令,.data段保持了程序數據,.bss段爲未初始化的全局變量和局部靜態變量預留文職,沒有內容,在文件中也不佔據空間。
-- 代碼段.text,包含的是函數的指令。
-- 數據段(.data)和只讀數據段(.rodata)。數據段保存的是已經初始化了的全局靜態變量和局部靜態變量。只讀數據段存放的是隻讀數據,一般是程序裏面的只讀變量(如const修飾的變量)和字符串常量。
-- bss段存放的是未初始化的全局變量和局部靜態變量。
-- 鏈接的接口—符號。鏈接的過程就是要把多個不同的目標文件之間相互粘在一起,爲了達到這個目的,這些目標文件之間必須有固定的規則。在鏈接中,目標文件之間相互拼合實際上是目標文件之間對地址的引用,即對函數和變量的地址的引用。函數和變量統稱爲符號,函數名或變量名就是符號名。鏈接過程中很關鍵的一部分就是符號的管理,每一個目標文件都會有一個相應的符號表,記錄了目標文件中所用到的所有符號。每個定義的符號有一個對應的值,叫做符號值,一般是它們的地址。

第四章 靜態鏈接。

...to be continued

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章