為什么我們要為進程支持巨大的地址空間?
本文內容摘自《操作系統導論》第21節部分內容。
到目前為止,我們一直假定地址空間非常小,能放入物理內存。事實上,我們假設每個正在運行的進程的地址空間都能放入內存。我們將放松這些大的假設,并假設我們需要支持許多同時運行的巨大地址空間。
為了達到這個目的,需要在內存層級(memory hierarchy)上再加一層。到目前為止,我們一直假設所有頁都常駐在物理內存中。但是,為了支持更大的地址空間,操作系統需要把當前沒有在用的那部分地址空間找個地方存儲起來。一般來說,這個地方有一個特點,那就是比內存有更大的容量。因此,一般來說也更慢(如果它足夠快,我們就可以像使用內存一樣使用,對嗎?)。在現代系統中,硬盤(hard disk drive)通常能夠滿足這個需求。因此,在我們的存儲層級結構中,大而慢的硬盤位于底層,內存之上。那么我們的關鍵問題是:
關鍵問題:如何超越物理內存
操作系統如何利用大而慢的設備,透明地提供巨大虛擬地址空間的假象?
你可能會問一個問題:為什么我們要為進程支持巨大的地址空間?答案還是方便和易用性。有了巨大的地址空間,你不必擔心程序的數據結構是否有足夠空間存儲,只需自然地編寫程序,根據需要分配內存。這是操作系統提供的一個強大的假象,使你的生活簡單很多。別客氣!一個反面例子是,一些早期系統使用“內存覆蓋(memory overlays)”,它需要程序員根據需要手動移入或移出內存中的代碼或數據[D97]。設想這樣的場景:在調用函數或訪問某些數據之前,你需要先安排將代碼或數據移入內存。
補充:存儲技術
稍后將深入介紹I/O設備如何運行。所以少安毋躁!當然,這個較慢的設備可以是硬盤,也可以是一些更新的設備,比如基于閃存的SSD。我們也會討論這些內容。但是現在,只要假設有一個大而較慢的設備,可以利用它來構建巨大虛擬內存的假象,甚至比物理內存本身更大。
不僅是一個進程,增加交換空間讓操作系統為多個并發運行的進程都提供巨大地址空間的假象。多道程序(能夠“同時”運行多個程序,更好地利用機器資源)的出現,強烈要求能夠換出一些頁,因為早期的機器顯然不能將所有進程需要的所有頁同時放在內存中。因此,多道程序和易用性都需要操作系統支持比物理內存更大的地址空間。這是所有現代虛擬內存系統都會做的事情,也是現在我們要進一步學習的內容。
21.1 交換空間
我們要做的第一件事情就是,在硬盤上開辟一部分空間用于物理頁的移入和移出。在操作系統中,一般這樣的空間稱為交換空間(swap space),因為我們將內存中的頁交換到其中,并在需要的時候又交換回去。因此,我們會假設操作系統能夠以頁大小為單元讀取或者寫入交換空間。為了達到這個目的,操作系統需要記住給定頁的硬盤地址(disk address)。
交換空間的大小是非常重要的,它決定了系統在某一時刻能夠使用的最大內存頁數。簡單起見,現在假設它非常大。
在小例子中(見圖21.1),你可以看到一個4頁的物理內存和一個8頁的交換空間。在這個例子中,3個進程(進程0、進程1和進程2)主動共享物理內存。但3個中的每一個,都只有一部分有效頁在內存中,剩下的在硬盤的交換空間中。第4個進程(進程3)的所有頁都被交換到硬盤上,因此很清楚它目前沒有運行。有一塊交換空間是空閑的。即使通過這個小例子,你應該也能看出,使用交換空間如何讓系統假裝內存比實際物理內存更大。
我們需要注意,交換空間不是唯一的硬盤交換目的地。例如,假設運行一個二進制程序(如ls,或者你自己編譯的main程序)。這個二進制程序的代碼頁最開始是在硬盤上,但程序運行的時候,它們被加載到內存中(要么在程序開始運行時全部加載,要么在現代操作系統中,按需要一頁一頁加載)。但是,如果系統需要在物理內存中騰出空間以滿足其他需求,則可以安全地重新使用這些代碼頁的內存空間,因為稍后它又可以重新從硬盤上的二進制文件加載。
圖21.1 物理內存和交換空間
21.2 存在位
現在我們在硬盤上有一些空間,需要在系統中增加一些更高級的機制,來支持從硬盤交換頁。簡單起見,假設有一個硬件管理TLB的系統。
先回想一下內存引用發生了什么。正在運行的進程生成虛擬內存引用(用于獲取指令或訪問數據),在這種情況下,硬件將其轉換為物理地址,再從內存中獲取所需數據。
硬件首先從虛擬地址獲得VPN,檢查TLB是否匹配(TLB命中),如果命中,則獲得最終的物理地址并從內存中取回。這希望是常見情形,因為它很快(不需要額外的內存訪問)。
如果在TLB中找不到VPN(即TLB未命中),則硬件在內存中查找頁表(使用頁表基址寄存器),并使用VPN查找該頁的頁表項(PTE)作為索引。如果頁有效且存在于物理內存中,則硬件從PTE中獲得PFN,將其插入TLB,并重試該指令,這次產生TLB命中。到現在為止還挺好。
但是,如果希望允許頁交換到硬盤,必須添加更多的機制。具體來說,當硬件在PTE中查找時,可能發現頁不在物理內存中。硬件(或操作系統,在軟件管理TLB時)判斷是否在內存中的方法,是通過頁表項中的一條新信息,即存在位(present bit)。如果存在位設置為1,則表示該頁存在于物理內存中,并且所有內容都如上所述進行。如果存在位設置為零,則頁不在內存中,而在硬盤上。訪問不在物理內存中的頁,這種行為通常被稱為頁錯誤(page fault)。
補充:交換術語及其他
對于不同的機器和操作系統,虛擬內存系統的術語可能會有點令人困惑和不同。例如,頁錯誤(page fault)一般是指對頁表引用時產生某種錯誤:這可能包括在這里討論的錯誤類型,即頁不存在的錯誤,但有時指的是內存非法訪問。事實上,我們將這種完全合法的訪問(頁被映射到進程的虛擬地址空間,但此時不在物理內存中)稱為“錯誤”是很奇怪的。實際上,它應該被稱為“頁未命中(page miss)”。但是通常,當人們說一個程序“頁錯誤”時,意味著它正在訪問的虛擬地址空間的一部分,***作系統交換到了硬盤上。
我們懷疑這種行為之所以被稱為“錯誤”,是因為操作系統中的處理機制。當一些不尋常的事情發生的時候,即硬件不知道如何處理的時候,硬件只是簡單地把控制權交給操作系統,希望操作系統能夠解決。在這種情況下,進程想要訪問的頁不在內存中。硬件唯一能做的就是觸發異常,操作系統從開始接管。由于這與進程執行非法操作處理流程一樣,所以我們把這個活動稱為“錯誤”,這也許并不奇怪。
在頁錯誤時,操作系統被喚起來處理頁錯誤。一段稱為“頁錯誤處理程序(page-fault handler)”的代碼會執行,來處理頁錯誤,接下來就會講。
21.3 頁錯誤
回想一下,在TLB未命中的情況下,我們有兩種類型的系統:硬件管理的TLB(硬件在頁表中找到需要的轉換映射)和軟件管理的TLB(操作系統執行查找過程)。不論在哪種系統中,如果頁不存在,都由操作系統負責處理頁錯誤。操作系統的頁錯誤處理程序(page-fault handler)確定要做什么。幾乎所有的系統都在軟件中處理頁錯誤。即使是硬件管理的TLB,硬件也信任操作系統來管理這個重要的任務。
如果一個頁不存在,它已被交換到硬盤,在處理頁錯誤的時候,操作系統需要將該頁交換到內存中。那么,問題來了:操作系統如何知道所需的頁在哪兒?在許多系統中,頁表是存儲這些信息最自然的地方。因此,操作系統可以用PTE中的某些位來存儲硬盤地址,這些位通常用來存儲像頁的PFN這樣的數據。當操作系統接收到頁錯誤時,它會在PTE中查找地址,并將請求發送到硬盤,將頁讀取到內存中。
補充:為什么硬件不能處理頁錯誤
我們從TLB的經驗中得知,硬件設計者不愿意信任操作系統做所有事情。那么為什么他們相信操作系統來處理頁錯誤呢?有幾個主要原因。首先,頁錯誤導致的硬盤操作很慢。即使操作系統需要很長時間來處理故障,執行大量的指令,但相比于硬盤操作,這些額外開銷是很小的。其次,為了能夠處理頁故障,硬件必須了解交換空間,如何向硬盤發起I/O操作,以及很多它當前所不知道的細節。因此,由于性能和簡單的原因,操作系統來處理頁錯誤,即使硬件人員也很開心。
當硬盤I/O完成時,操作系統會更新頁表,將此頁標記為存在,更新頁表項(PTE)的PFN字段以記錄新獲取頁的內存位置,并重試指令。下一次重新訪問TLB還是未命中,然而這次因為頁在內存中,因此會將頁表中的地址更新到TLB 中(也可以在處理頁錯誤時更新TLB以避免此步驟)。最后的重試操作會在TLB 中找到轉換映射,從已轉換的內存物理地址,獲取所需的數據或指令。
請注意,當I/O在運行時,進程將處于阻塞(blocked)狀態。因此,當頁錯誤正常處理時,操作系統可以自由地運行其他可執行的進程。因為I/O操作是昂貴的,一個進程進行I/O(頁錯誤)時會執行另一個進程,這種交疊(overlap)是多道程序系統充分利用硬件的一種方式。
21.4 內存滿了怎么辦
在上面描述的過程中,你可能會注意到,我們假設有足夠的空閑內存來從存儲交換空間換入(page in)的頁。當然,情況可能并非如此。內存可能已滿(或接近滿了)。因此,操作系統可能希望先交換出(page out)一個或多個頁,以便為操作系統即將交換入的新頁留出空間。選擇哪些頁被交換出或被替換(replace)的過程,被稱為頁交換策略(page-replacement policy)。
事實表明,人們在創建好頁交換策略上投入了許多思考,因為換出不合適的頁會導致程序性能上的巨大損失,也會導致程序以類似硬盤的速度運行而不是以類似內存的速度。在現有的技術條件下,這意味著程序可能會運行慢10000~100000倍。因此,這樣的策略是我們應該詳細研究的。實際上,這也正是我們下一章要做的。現在,我們只要知道有這樣的策略存在,建立在之前描述的機制之上。
操作系統導論
譯者:王海鵬
美國知名操作系統教材
緊緊圍繞操作系統的三大主題元素:虛擬化 并發和持久性進行講解
豆瓣原版評分9.7
本書內容全面,并給出了真實可運行的代碼(而非偽代碼),還提供了相應的練習,很適合高等院校相關專業的教師開展教學和高校學生進行自學。
本書具有以下特色:
● 主題突出,緊緊圍繞操作系統的三大主題元素——虛擬化、并發和持久性。
● 以對話的方式引入背景,提出問題,進而闡釋原理,啟發動手實踐。
● 包含眾多“補充”和“提示”,拓展讀者知識面,增加趣味性。
● 使用真實代碼而不是偽代碼,讓讀者更加深入透徹地了解操作系統。
● 提供作業、模擬和項目等眾多學習方式,鼓勵讀者動手實踐。
● 為教師提供教學輔助資源。
本文轉載自異步社區。
原文鏈接:https://www.epubit.com/articleDetails?id=8a9706b9e9c049e988938dfe65965011
任務調度 虛擬化
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。