程式設計師的自我修養 chapter 1
DESCRIPTION
TRANSCRIPT
第一篇 簡介
1. Chapter 1 溫故而知新a. 從Hello World說起b. 萬變不離其宗c. 站得高,望得遠d. 作業系統的功能e. 記憶體不夠麼辦f. 團結力量大
g. 本章小結
從Hello World說起
#include <stdio.h> int main (){ printf ("Hello World\n"); return 0;} 你知道這個Hello World從編譯、靜態鏈結到作業系統如何載入程式、動態鏈結及執行階段程式庫和標準程式庫的實作嗎?
萬變不離其宗
● CPU、記憶體、I/O控制晶片
匯流排【Bus】
PCI/ISA及南北橋設計的硬體架構
SMP與多核
● CPU幾乎已經達到實體限制,4GHz● 對稱式多重處理,Symmetrical Multi-
Processing● CPU的數量和處理的速度並不成正比● 將多個處理器合併在一起,以一個處理器的外
包裝出售
站得高,望得遠
作業系統的功能
● 管理CPU、記憶體、I/O設備● CPU
○ 多重程式,Multiprogramming○ 分時系統,Time-Sharing System○ 多工系統,Multi-tasking
■ 行程,Process■ 先佔式,Preemptive
● 硬體驅動程式(Device Driver)○ 讀檔
記憶體不夠怎麼辦
● 位址空間不隔離● 記憶體使用效率低● 程式執行的位址不確定● 虛擬位址,Virtual Address
○ 分段○ 分頁
分段
分頁
● 虛擬頁,Virtual Page● 實體頁,Physical Page● 磁碟頁,Disk Page● 分頁錯誤(Page Fault)● MMU,Memory Management Unit
分頁(cont.)
團結力量大
● 緒程,Thread,有時稱為羽量級行程(Lightweight Process)
● 由緒程ID、PC、暫存器集合和堆疊組成
緒程的存取權限
緒程排程
緒程排程(cont.)
● 優先順序排程(Priority Schedule)○ 緒程優先順序(Thread Priority)
● 輪轉法(Round Robin)● 餓死(Starvation)
○ 使用者指定優先順序○ 根據進入等待狀態的頻繁程度提升或降低優先順序
■ IO密集型緒程(IO Bound Thread)■ CPU密集型緒程(CPU Bound Thread)
○ 長時間得不到執行而被提升優先順序
● 先佔(Preemption)
Linux的多緒程
● 無論緒程或行程都稱為任務(Task)● 不同的Task之間可以共用記憶體空間。怎麼知
道Task實際使用多少?● 寫時複製(Copy-on-Write)
緒程安全
● void inc_x () { x++; }● 原子(Atomic)操作,glib● Semaphore《Glib Semaphores》
○ 可以被任意緒程獲取並釋放
● Mutex《類似binary semaphore》glib○ 哪個緒程獲取了互斥器,哪個緒程就要負釋放這個鎖
定
● Criticsl Section● Read-Write Lock
○ Sema、Mutex、CS遇到偶爾寫入的情況,效能不彰
● Condition Variable
緒程安全(cont.)
● 可重入(Reentrant)● 過度最佳化
○ volatile(C語言中volatile關鍵字)●CPU動態排程換序,
○ 參考(《大话处理器》连载——微架构(19) 乱序执行
总结)
○ barrier防止指令交換
多緒程內部情況
本章小結
● 有夠雜的