深入理解計算機系統讀書筆記四

2022-04-03 00:23:36 字數 3998 閱讀 4919

從給處理器加電開始,直到斷電為止,程式計數器假設乙個值的序列:a0,a1,a2...a n-1,

其中a k是相應的指令的位址,每次從a k到a k-1的過渡稱為控制轉移(control transfer)。這樣的控制轉移序列稱為處理器的控制流(flow of control)。

異常是異常控制流的一種形式,它一部分由硬體實現,一部分由作業系統實現。異常(exception)就是控制流中的突變,用來響應處理器狀態中的某些變化。

在任何情況下,當處理器檢測到有事件發生時,它就會通過一張叫做異常表(exception table)的跳轉表,進行乙個間接過程呼叫,到乙個專門設計的用來處理這類事件的作業系統子程式(異常處理程式(exception handler))。當異常處理程式處理完成後,根據引起異常的事件型別,會發生以下3種情況種的一種。

1.處理程式將控制返回當前指令

2.處理程式將控制返回下一條

3.處理程式終止被中斷的程式

系統將每種可能出現的異常都分配了乙個唯一的非負整數的異常號。一部分異常號是由處理器設計者分配的,另一部分異常號是由作業系統核心的設計者分配的。

當系統啟動時,作業系統分配和初始化一張異常跳轉表,使得每個異常號與異常處理程式對應。

當執行時,處理器檢測到發生了乙個事件,並且確定了相應的異常號k。隨後,處理器觸發異常,方法是執行間接過程呼叫,通過異常表的條目k,跳轉到指定的異常處理程式。而且異常處理程式執行在核心模式下,這意味著它們對所有的系統資源都由完全的訪問許可權。

程式設計師通過中斷實現系統呼叫。

異常可以分為:

1.中斷(interrupt),來自i/o裝置的訊號(非同步:不是由特定的專門的指令造成的)

2.陷阱(trap):有意的異常(同步)

3.故障(fault):潛在可以恢復的錯誤(同步)

4.終止(abort):不可恢復的錯誤(同步)

程序就是乙個執行種程式的例項。系統中的每個程式都執行在某個程序的上下文(context)中。上下文是由程式正確執行所需的狀態的組合。這個狀態包括存放在記憶體中的程式的**和資料,它的棧、通用目的暫存器的內容、程式計數器、環境變數以及開啟檔案描述符的集合。

程序為應用程式提供了兩個關鍵的湊抽象:

1.乙個獨立的邏輯控制流,它提供乙個假象,好像我們的程式獨佔處理器。

2.乙個私有的位址空間,它提供乙個假象,好像我們的程式獨佔記憶體系統。

乙個邏輯流(程序的程式計數器的值的序列)的執行時間與另乙個流重疊,稱為併發流(concurrent flow)。

多個流併發地執行的一般現象被稱為併發(concurrency)。乙個程序和其它程序輪流執行的概念稱為多工。乙個程序執行它的控制流的一部分的每一時間段叫做時間片(time slice)。因此,多工也叫做時間分片(time slicing)。

並行流是併發流的真子集。如果兩個流併發的執行在不同的處理器和或者計算機上,那麼我們稱它們為並行流(parallel flow)。

程序為每個程式提供它自己的私有位址空間,一般而言,這個空間是不能被其它程序讀或者寫的。

處理器提供一種機制來限制乙個應用可以執行的指令和它可以訪問的位址空間範圍。處理器通常是用某個控制暫存器中的乙個模式位來提供這種功能的,該暫存器描述了程序當前享有的特權。

1.當設定了模式位時,程序就執行在核心模式中。乙個執行在核心模式中的程序可以執行指令集中的任何指令,並且可以訪問系統中的任何記憶體位置。

2.沒有設定模式位時,程序就執行在使用者模式中。使用者模式中的程序不允許執行特權指令,比如停止處理器、改變模式位,或者發起乙個i/o操作,也不允許訪問核心區內的**和資料。

linux通過/proc檔案系統,使得使用者模式程序訪問核心資料結構的內容。/proc檔案系統將許多核心資料結構的內容輸出為乙個使用者程式可以讀的文字檔案的層次結構。

作業系統核心使用一種稱為上下文切換(context switch)的較高層次形式的異常控制流來實現多工。核心為每個程序維持乙個上下文(context)。上下文時核心重新啟動乙個被搶占的程序所需的狀態。

訊號就是一條訊息,它通知程序系統中發生了乙個某種型別的事件。每種訊號型別都對應於某種系統事件。linxu系統中支援30種不同型別的訊號。

傳送訊號。核心通過更新目的程序上下文種的某個狀態,傳送乙個訊號給目的程序。

接收訊號。當目的程序被核心強迫以某種方式對訊號的傳送做出反應時,他就接收了訊號。程序可以忽略這個訊號,終止或通過執行乙個訊號處理程式的使用者層的函式捕獲這個訊號。

將主存看作時乙個儲存在磁碟上的位址空間的高速緩衝,在主存種只儲存活動區域。

它為每個程序提供了一致的位址空間,從而簡化了記憶體管理。

它保護了每個程序的位址空間不被其它程序破環。

物理定址:

計算機系統的主存被組織為乙個由m個連續的位元組大小的單元組成的陣列。每個位元組都有乙個唯一的實體地址。cpu通過唯一的實體地址訪問記憶體的方式稱為物理定址(physical addressing)

作業系統維護著乙個叫做頁表的資料結構,頁表將虛擬頁對映到物理頁。每次位址翻譯硬體將乙個虛擬位址轉換為實體地址時,都會讀取頁表。每個程序都有自己的頁表。

乙個程序的虛擬記憶體

如果cpu想要讀取包含vp2中的虛擬記憶體的乙個字時。位址翻譯硬體將虛擬位址作為乙個索引來定位pte2,並從記憶體種讀取它。因為設定了有效位,那麼位址翻譯硬體就知道vp2時快取在記憶體種的,所以它使用pte種的物理記憶體位址,構造出這個字的實體地址。

如果cpu想要讀取包含vp3中的虛擬記憶體的乙個字時,vp3並未被快取。位址翻譯硬體讀取pte3,根據有效位判斷vp3並沒有被快取,並且觸發了乙個缺頁異常。缺頁異常呼叫核心的缺頁異常處理程式。該程式會選擇乙個犧牲頁,此例犧牲的是存放在pp3中的vp4.如果被犧牲vp4有過修改,那麼他會被重新整理回磁碟。接下來核心從磁碟複製vp3到記憶體中的pp#,更新pte3.隨後缺頁異常處理程式返回,這時會重新啟動導致缺頁的指令,這時候就會是頁命中了。

在一些早期系統中支援比物理記憶體更小的虛擬位址空間。虛擬記憶體簡化了記憶體管理,提供了一種自然的保護記憶體的方法。

簡化載入。虛擬記憶體還使得容易向記憶體中載入和執行檔案和共享物件檔案。linux載入器會為**和資料段分配虛擬頁,並它們標記為無效的。只在需要時,才從磁碟載入。

簡化共享。獨立位址空間為作業系統提供了乙個管理使用者程序和作業系統自身之間共享的一致機制。

簡化記憶體分配。當乙個執行在使用者程序中的程式需要額外的堆空間時,作業系統分配連續的虛擬記憶體頁面,並將它們對映到物理記憶體。由於頁表的工作方式,炒作系統沒有必要分配連續的物理記憶體頁面。

任何現代計算機系統必須為作業系統提供手段來控制堆記憶體系統的訪問。

採用虛擬記憶體的方式提供獨立的位址空間,使得區分不同程序的私有記憶體變得容易。也可以在pte上新增一些額外的許可位來控制對乙個虛擬頁面內容的訪問。如果指令違反了許可條件,那麼cpu就會觸發乙個一般保護故障。(一些系統中將這種異常報告為「段錯誤」)

《深入理解計算機系統》讀書筆記

小端模式 低有效位元組在前,高有效位元組在後 代表處理器 intel 大端模式 高有效位元組在前,低有效位元組在後 代表處理器 ibm power sun c語言允許無符號整數與有符號整數之間的轉換,轉換規則是 底層的位保持不變 當執行乙個運算時,若兩個數乙個為無符號數,乙個是有符號數,則c語言隱式...

《深入理解計算機系統》讀書筆記

ip位址是乙個32為無符號整數,ip位址存放在ip位址結構體中 struct in addr tcp ip規定統一的網路位元組順序 大端位元組順序 因為主機位元組順序 host byte order 是小端法,所以必須有函式用於轉換。htonl函式和ntohl是32位整數,short是16位整數 i...

深入理解計算機系統(讀書筆記)

計算機的資訊儲存和處理都是以二進位制為基礎的,通過一系列的0,1組合,我們能夠去表示有限的整數和實數。首先了解三種重要的符號表示方法 有符號表示 用於表示大於或等於0的整數 無符號表示 用於表示有正有負的整數 浮點數 以科學計數法為基礎的二進位制表示方法 在計算機內部資料是按照字進行儲存的,字有著統...