第五章 存儲器管理學習筆記:核心概念與系統服務解析
存儲器管理是操作系統的核心功能之一,它直接關系到計算機系統的性能、穩定性和資源利用率。本章主要探討了操作系統如何高效、公平、安全地管理主存儲器(內存),并為上層的應用程序和系統服務提供支持。
一、存儲器管理的核心目標與功能
存儲器管理的根本目標是提供一個抽象、高效且安全的存儲訪問環境。其主要功能包括:
- 內存的分配與回收:跟蹤內存的使用情況,響應進程的內存請求,為其分配空間,并在進程結束時回收資源。
- 地址映射與重定位:將進程的邏輯地址(相對地址)轉換為物理內存的實際地址。這通過硬件(MMU)和軟件(操作系統)協同完成,是實現進程隔離和多道程序并發的基礎。
- 內存保護:確保每個進程只能訪問其被分配的內存區域,防止進程間相互干擾或破壞操作系統內核。通常通過界限寄存器或頁表保護位實現。
- 內存擴充(虛擬內存):利用外存(如硬盤)模擬出比實際物理內存大得多的“虛擬地址空間”,通過請求調入和置換功能,實現小內存運行大程序,并提高多道程序并發度。
二、關鍵技術與實現機制
1. 連續分配管理方式
- 單一連續分配:最簡單,整個內存除系統區外全部供一個用戶程序使用。適用于單用戶、單任務系統,內存利用率低。
- 固定分區分配:將內存預先劃分為若干個大小固定或可變的區域。雖然管理簡單,但存在內部碎片(分配單元未用完的部分)問題。
- 動態分區分配:根據進程實際需要動態劃分內存分區。雖然更靈活,但會產生外部碎片(分散的、太小而無法利用的內存塊),需要通過緊湊技術或更高級的管理算法(如伙伴系統)來解決。
2. 非連續分配管理方式(離散分配)
這是現代操作系統的基石,完美解決了外部碎片問題。
- 分頁存儲管理:
- 將進程的邏輯地址空間和物理內存都劃分為固定大小的頁/頁框。
- 通過頁表實現邏輯頁號到物理頁框號的映射。
- 優點:無外部碎片,內存利用率高,管理簡單。
- 缺點:存在內部碎片,且需要硬件(如快表TLB)支持以提高地址轉換速度。
- 分段存儲管理:
- 按照程序的邏輯模塊(如主程序、子程序、數據段等)劃分段,段長可變。
- 通過段表實現邏輯段到物理內存區的映射。
- 優點:符合程序員的直觀視圖,易于實現信息共享和保護。
- 缺點:會產生外部碎片。
- 段頁式存儲管理:結合分段和分頁的優點。先將程序分段,再將每個段分頁。兼具了分段在邏輯上的優勢和分頁在物理管理上的高效,但地址轉換過程更復雜,需要段表和頁表兩級查找。
3. 虛擬內存技術
這是存儲器管理技術的集大成者,其核心思想是局部性原理(時間局部性和空間局部性)。
- 請求分頁/請求分段系統:在基本分頁/分段基礎上,增加了請求調頁/調段和頁面/段置換功能。
- 頁面置換算法:當需要調入新頁而內存已滿時,決定淘汰哪個舊頁。常見算法有:
- 最佳置換算法(OPT):理論最優,但無法實現。
- 先進先出算法(FIFO):實現簡單,但可能產生Belady異常(分配頁框數增加,缺頁率反而升高)。
- 最近最久未使用算法(LRU):性能接近OPT,但實現開銷較大。
- 時鐘置換算法(CLOCK):LRU的近似實現,性能和開銷折中,被廣泛采用。
- 工作集模型與抖動:操作系統通過跟蹤進程的“工作集”(當前時間段內活躍訪問的頁面集合)來預防抖動現象——即進程頻繁缺頁,大部分時間用于頁面調入/換出,導致CPU利用率急劇下降。
三、存儲器管理與計算機系統服務
操作系統提供的許多核心系統服務都深度依賴于高效的內存管理:
- 進程管理與調度服務:進程控制塊(PCB)的存放、進程上下文的切換、進程地址空間的創建與銷毀,都離不開內存管理的支持。虛擬內存技術使得系統能夠維持遠超物理內存數量的進程處于“就緒”狀態(提高多道程序度),為調度器提供了更多選擇。
- 文件與I/O系統服務:內存管理中的緩沖區管理是I/O性能的關鍵。磁盤等塊設備的數據通常先被讀入內存緩沖區,再供進程訪問。虛擬內存系統將磁盤空間作為內存的延伸(交換區/頁面文件),使得文件操作和內存管理在底層緊密結合(如內存映射文件)。
- 系統安全與保護服務:內存保護機制(頁表/段表中的讀、寫、執行權限位)是防止惡意代碼或錯誤程序破壞系統或其他進程的第一道防線。它隔離了用戶態和內核態空間,保障了操作系統的安全穩定運行。
- 動態鏈接與共享庫服務:分段存儲便于代碼和數據的共享。現代操作系統中,多個進程可以共享同一份只讀代碼段(如C語言運行庫),節省了大量內存。動態鏈接技術正是在內存管理的支持下,將共享庫在運行時映射到進程的地址空間。
四、
存儲器管理是連接硬件資源與軟件應用的橋梁。從早期的連續分配到現代基于分頁/分段的虛擬內存系統,其演進始終圍繞著高效利用、安全隔離、方便用戶三大目標。它不僅是操作系統內部的關鍵模塊,更是所有上層系統服務得以高效、可靠運行的基石。理解存儲器管理的原理,對于分析系統性能瓶頸、進行系統級編程和優化都具有至關重要的意義。