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

第一章 溫故而知新安全

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

第二章 編譯和連接。ide

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

第三章 目標文件裏有什麼優化

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

第四章 靜態連接。線程

...to be continued指針

相關文章
相關標籤/搜索