1.硬體架構
最為關鍵的三個部件:cpu,記憶體,i/o控制晶元。
i/o裝置相比於cpu和記憶體的速度很慢,為了協調i/o裝置和匯流排之間的速度,每個裝置都會有乙個i/o控制器;
由於cpu核心頻率的提公升,導致記憶體跟不上cpu的速度,於是產生了和記憶體頻率一致的系統匯流排,而cpu採用倍頻的方式與系統匯流排進行通訊;
北橋晶元:協調cpu,記憶體和高速的圖形裝置,使其能夠高速地交換資料;
南橋晶元:磁碟、usb、鍵盤、滑鼠等裝置連線在南橋,再由南橋彙總後連線到北橋;
系統匯流排採用pci結構,低速裝置踩踏isa匯流排;
cpu頻率限制在4ghz;
多核處理器:處理器廠商將多個處理器「合併在一起打包**」,這些處理器之間共享較昂貴的快取部件,只保留多個核心。
2.軟體架構
2.1 系統軟體分類
1)平台性的,如作業系統核心,驅動程式,執行庫,系統工具
2)用於程式開發的,編譯器,彙編器,鏈結器,開發庫。
2.2 軟體體系分層
應用程式,開發工具
(介面):作業系統應用程式程式設計介面api
執行庫(介面):系統呼叫介面
作業系統核心
(介面):硬體規格
硬體3.作業系統
3.1 功能
1)提供抽象的介面
2)管理硬體資源
multiprogramming->分時系統->多工系統
作業系統接管所有硬體資源,本身執行在乙個受硬體保護的級別;
所有應用程式都以程序的方式執行在比作業系統許可權更低的級別,每個程序有自己獨立的位址空間,使得程序間的位址空間相互隔離;
3.2 對cpu的管理
cpu由作業系統進行分配,每個程序根據程序優先順序得到cpu;
若執行超出一定時間,作業系統會暫停該程序,將cpu分配給其他待執行的程序,即搶占式分配cpu;
3.3 對i/o控制器的管理
繁瑣的硬體細節由作業系統的硬體驅動程式完成,其與作業系統核心執行在特權級。
作業系統開發者為硬體生產廠商提供一系列介面和框架,由他們為硬體開發驅動程式。
硬碟:基本儲存單位為扇區(sector),每個扇區一般為512位元組,假設硬碟有2個碟片,每個盤面分65536磁軌,每個磁軌分1024個扇區,則硬碟容量為2*2*65536*1024*512位元組。
3.4 對記憶體的管理
分段(segmentation):把一段程式所需要的記憶體空間大小的虛擬空間對映到某個實體地址空間。該方法解決了位址隔離和程式重定位問題,但未解決記憶體使用效率低問題,因為若記憶體不足,換入換出到磁碟的都是整個程式;
頁錯誤:程序需要用到的頁不在記憶體而在磁碟中。此時由作業系統接管程序,將頁從磁碟讀出並裝入記憶體,再將其與虛擬頁建立對映關係。
幾乎所有硬體採用mmu(記憶體管理單元)的部件進行頁對映,其整合在cpu中。
cpu----(virtual address)----mmu----(physical address)----物理記憶體
4.執行緒
4.1 執行緒概念
執行緒:1)又稱輕量級程序lwp,是程式執行流的最小單元;
2)乙個標準的執行緒包括執行緒id,當前指令指標(pc),暫存器集合,堆疊;
3)通常乙個程序由一到多個執行緒組成,各執行緒間共享程式的記憶體空間(**段,資料段,堆等)及一些程序級資源(開啟檔案和訊號);
4)多個執行緒可以互不干擾地併發執行,並共享程序的全域性變數和堆資料;
執行緒訪問許可權
1)執行緒私有:區域性變數,函式引數,執行緒區域性儲存
2)執行緒間共享:全域性變數,堆資料,函式靜態變數,程式**,開啟檔案
4.2 執行緒排程
概念:單處理器讓多執行緒程式輪流執行
執行緒狀態:
1)執行(running):此時執行緒正在執行
2)就緒(ready):此時執行緒可以立刻執行,但cpu已經被占用
3)等待(waiting):此時執行緒正在等待某一事件發生(通常是i/o或同步),無法執行
io密集型執行緒:該執行緒頻繁進入等待狀態,即放棄可占用的時間份額(通常優先順序更高)
cpu密集型執行緒:該執行緒頻繁進行大量計算,將時間片耗盡
為避免執行緒餓死,排程系統會逐步提公升等待了過長時間的低優先順序執行緒
執行緒優先順序改變方式
1)使用者指定優先順序
2)根據進入等待狀態的頻繁程度提公升或降低優先順序
3)長時間得不到執行而被提公升優先順序
linux核心中不存在真正意義上的執行緒,而將所有的執行實體(執行緒或程序)都稱為任務,每個任務類似於乙個單執行緒的程序,不同任務間可以選擇共享記憶體空間,即共享了同一記憶體空間的多個任務構成乙個程序,這些任務成立程序裡的執行緒。
linux可以使用以下方式建立任務:
1)fork:複製當前程序
2)exec:使用新的可執行映像覆蓋當前可執行映像
3)clone:建立子程序並從指定位置開始執行
fork只能產生本任務的映象,需要使用exec配合啟動新任務;因此,fork產生乙個心任務後,新任務呼叫exec來執行新的可執行檔案;使用clone來產生新執行緒。
4.3 執行緒安全
單指令的操作是原子的(atomic),即單條指令是不會被打斷的。
同步:指在乙個執行緒訪問資料未結束時,其他執行緒不得對同乙個資料進行訪問
鎖:同步最常見的方法,每個執行緒在訪問資料或資源前先試圖獲取鎖(acquire),並在訪問結束後釋放鎖(release);在鎖已經被占用時試圖獲取鎖,執行緒會等待,直到鎖重新可用。
二元訊號量(binary semaphore):最簡單的一種鎖,只有兩種狀態:占用/非占用,適合只能被唯一乙個執行緒獨佔訪問的資源;同一訊號量可以由乙個執行緒獲取後由另乙個執行緒釋放
多元訊號量,即訊號量:允許多個執行緒併發訪問的資源,乙個初始值為n的訊號量允許n的執行緒併發訪問
互斥量(mutex):資源僅同時允許乙個執行緒訪問,要求哪個執行緒獲取互斥量,則該執行緒負責釋放鎖
臨界區(critical section):比互斥量更嚴格的同步手段
1)進入臨界區:獲取鎖
2)離開臨界區:釋放鎖
3)與訊號量和互斥量區別:臨界區作用範圍僅限本程序,而訊號量和互斥量在系統的任何程序都可見;誰獲取誰釋放
讀寫鎖(read-write lock):上述同步手段對於讀取頻繁,而偶爾寫入的場景較低效
讀寫鎖獲取方式:共享式(shared)和獨佔式(exclusive)
讀寫鎖狀態
以共享方式獲取
以獨佔方式獲取
自由成功
成功共享
成功等待
獨佔等待
等待條件變數(condition variable):類似於柵欄,執行緒可以等待條件變數,也可以喚醒條件變數
使用條件變數可以讓許多執行緒一起等待某個事件發生,當事件發生時,所有執行緒可以一起恢復執行
函式可重入(reentrant):表示該函式沒有執行完成,由於外部因素或內部呼叫,又一次進入該函式執行,包括兩種情況
1)多個執行緒同時執行該函式
2)函式自身呼叫自身
函式可重入,表明該函式被重入後沒有不良後果;可重入是併發安全的強力保障,乙個可重入的函式可以在多執行緒環境下放心使用
特點:1)不使用任何(區域性)靜態或全域性的非const變數
2)不返回任何(區域性)靜態或全域性的非const變數的指標
3)僅依賴於呼叫方提供的引數
4)不依賴任何單個資源的鎖
5)不呼叫任何不可重入的函式
volatile關鍵字作用
1)阻止編譯器為提高速度將乙個變數快取到暫存器內而不寫回
2)阻止編譯器調整操作volatile變數的指令順序
4.4 使用者執行緒與核心執行緒的對映
使用者態多執行緒庫的實現方式
1)一對一模型
乙個使用者使用的執行緒唯一對應乙個核心使用的執行緒(反之,乙個核心裡的執行緒在使用者態不一定有對應的執行緒存在)
缺點:由於許多作業系統限制了核心執行緒的數量,因此一對一執行緒會讓使用者的執行緒數量受限制;許多作業系統核心執行緒排程時,上下文切換開銷較大,導致使用者執行緒執行效率下降
2)多對一模型
將多個使用者執行緒對映到乙個核心執行緒,執行緒間切換由使用者態**實現
缺點:若乙個使用者執行緒阻塞,則所有執行緒都無法執行,此時核心的執行緒也阻塞
優點:高效的上下文切換和無限制的執行緒數量
3)多對多模型
將多個使用者執行緒對映到少數但不止乙個核心執行緒
《程式設計師的自我修煉》學習筆記(二)
1.概述 本質 軟體執行背後的機理及支撐軟體執行的各種平台和工具 2.編譯過程分解 2.1 預編譯 主要處理源 檔案中以 開始的預編譯指令,如 include define gcc e hello.c o hello.i 處理規則如下 1 將所有的 define 刪除,並且展開所有巨集定義 2 處理...
《程式設計師修煉之道》筆記(一)
這幾天開始看 程式設計師修煉之道 也許不少人看了書的標題,第一時間會覺得這是雞湯一類的書。但至少以我自己的感受來看,這是很棒的書,現代人文主義不是提倡自我意識嘛,自己感覺好的就是好的。況且人家也是經過了時間和口碑的雙重考驗的,真心值得好好閱讀。作者在再版的序中寫道 寫完 程式設計師修煉之道 至今已有...
程式設計師修煉之道閱讀筆記(一)
書的第一章的名字叫注重實效的哲學。其實不像很多人想的那樣,程式設計師並不是乙個冷冰冰的枯燥的集體。反而,程式設計師是更多善於思考的乙個集體,不僅僅是對工作,對於人生 世界,程式設計師都有屬於自己的解釋。所以才會有這麼多的程式設計師的紛爭,從大了講有自由與封建 開源 閉源 之爭 往具體處說,又有諸如u...