操作系統導論——第13章 抽象:地址空間

一、早期系統

? ? ???從內存來看,早期的機器并沒有提供多少抽象給用戶。基本上,機器的物理內存如圖13.1所示

????????操作系統曾經是一組函數(實際上是一個庫),在內存中(在本例中,從物理地址0開始),然后有一個正在運行的程序(進程),目前在物理內存中(在本例中,從物理地址64KB開始), 并使用剩余的內存。這里幾乎沒有抽象,用戶對操作系統的要求也不多。

二、多道程序和時分共享

? ? ? ? 由于機器昂貴,人們開始更有效地共享機器。因此,多道程序系統時代開啟,其中多個進程在給定時間準備運行,比如當有一個進程在等待 I/O 操作的時候,操作系統會切換這些進程,從而增加了 CPU 的有效利用率

? ? ? ? 但很快,分時系統的時代誕生了,許多人意識到批量計算的局限性,尤其是程序員本身,厭倦了長時間的(低效率的)編程——調試循環。交互性變得很重要,因為許多用戶可能同時在使用機器,每個人都在等待(或希望)它們執行的任務及時響應。

????????一種實現時分共享的方法,是讓一個進程單獨占用全部內存運行一小段時間(見圖 13.1),然后停止它,并將它所有的狀態信息保存在磁盤上(包含所有的物理內存),加載其他進程的狀態信息,再運行一段時間,這就實現了某種比較粗糙的機器共享。?

? ? ? ? 這種方法的問題:太慢,特別是當內存增長的時候。雖然保存和恢復寄存器級的狀態信息(程序計數器、通用寄存器等)相對較快,但將全部的內存信息保存到磁盤就太慢了。因此,在進程切換的時候,我們仍然將進程信息放在內存中,這樣操作系統可以更有效率地實現時分共享(見圖13.2)。

????????在圖13.2中,有3個進程(A、B、C),每個進程擁有從 512KB 物理內存中切出來給它們的一小部分內存。假定只有一個CPU,操作系統選擇運行其中一個進程(比如A),同時其他進程(B和C)則在隊列中等待運行。?

???????隨著時分共享變得更流行,對操作系統又有了新的要求。特別是多個程序同時駐留在內存中,使保護(protection) 成為重要問題不希望一個進程可以讀取其他進程的內存,更別說修改

三、地址空間

? ? ? ? 操作系統需要提供一個易用的物理內存抽象。這個抽象叫做地址空間,是運行的程序看到的系統中的內存。理解這個基本的操作系統內存抽象,是了解內存虛擬化的關鍵。

?????????一個進程的地址空間包含運行的程序的所有內存狀態。比如:程序的代碼(code,指令) 必須在內存中,因此它們在地址空間里。當程序在運行的時候,利用(stack)來保存當前的函數調用信息分配空間給局部變量傳遞參數和函數返回值。最后,(heap)用于管理動態分配的、用戶管理的內存,就像從C語言中調用 malloc() 或面向對象語言(如C ++ 或Java)中調用new 獲得內存。當然,還有其他的東西(例如,靜態初始化的變量),但現在假設只有這3個部分:代碼、棧和堆

? ? ? ? 在圖 13.3 的例子中,有一個很小的地址空間(16KB)。程序代碼位于地址空間的頂部(本例中從 0 開始,并且裝入到地址空間的前 1KB)。代碼是靜態的(因此很容易放在內存中),所以可以將它放在地址空間的頂部,我們知道程序運行時不再需要新的空間。

????????接下來,在程序運行時,地址空間有兩個區域可能增長(或者收縮)。它們就是堆(在頂部) 和棧(在底部)。通過將它們放在地址空間的兩端,可以允許這樣的增長:它們只需要在相反的方向增長。因此堆在代碼(1KB) 之下開始并向下增長(當用戶通過 malloc()請求更多內存時),棧從 16KB 開始并向上增長(當用戶進行程序調用時)。然而,堆棧和堆的這種放置方法只是一種約定,如果你愿意, 可以用不同的方式安排地址空間 [當多個線程(threads)在地址空間中共存時,就沒有像這樣分配空間的好辦法了]。

? ? ? ? 當然,描述地址空間時,所描述的是操作系統提供給運行程序的抽象。程序不在物理地址0~16KB的內存中,而是加載在任意的物理地址。回顧圖13.2中的進程 A、B和C,可以看到每個進程如何加載到內存中的不同地址。因此問題來了:

?????????????????????????????????????????????????關鍵問題:如何虛擬化內存

????????操作系統如何在單一的物理內存上為多個運行的進程(所有進程共享內存)構建一個私有的、可能很大的地址空間的抽象?

????????當操作系統這樣做時,我們認為操作系統在虛擬化內存(virtualizing memory),因為運行的程序認為它被加載到特定地址(例如 0)的內存中,并且具有非常大的地址空間(例如 32 位或64位)。現實很不一樣。

????????例如,當圖13.2中的 進程A 嘗試在地址0(我們將稱其為虛擬地址,virtual address) 執行加載操作時,然而操作系統在硬件的支持下,出于某種原因,必須確保不是加載到物理地址0,而是物理地址320KB(這是A載入內存的地址)。這是內存虛擬化的關鍵,這是世界上每一個現代計算機系統的基礎。

四、目標

? ? ? ? 操作系統的工作——虛擬化內存。操作系統不僅虛擬化內存,還有一定的風格。為了確保操作系統這樣做,我們需要一些目標來指導。

?????????虛擬內存(VM)系統的一個主要目標透明(transparency)。操作系統實現虛擬內存的方式,應該讓運行的程序看不見。因此,程序不應該感知到內存被虛擬化的事實,相反,程序的行為就好像它擁有自己的私有物理內存。在幕后,操作系統(和硬件)完成了 所有的工作,讓不同的工作復用內存,從而實現這個假象。

?????????虛擬內存的另一個目標是效率(efficiency)。操作系統應該追求虛擬化盡可能高效 ,包括時間上(即不會使程序運行得更慢)和空間上(即不需要太多額外的內存來支持虛擬化)。在實現高效率虛擬化時,操作系統將不得不依靠硬件支持,包括TLB這樣的硬件功能。

?????????虛擬內存第三個目標是保護(protection)。操作系統應確保進程受到保護(protect), 不會受其他進程影響,操作系統本身也不會受進程影響。當一個進程執行加載、存儲或指令提取時,它不應該以任何方式訪問或影響任何其他進程或操作系統本身的內存內容(即在它的地址空間之外的任何內容)。因此,保護讓我們能夠在進程之間提供隔離(isolation) 的特性,每個進程都應該在自己的獨立環境中運行,避免其他出錯或惡意進程的影響。

????????在接下來的章節中,我們將重點介紹虛擬化內存所需的基本機制(mechanism),包括硬件和操作系統的支持。我們還將研究一些較相關的策略(policy),你會在操作系統中遇到它們,包括如何管理可用空間,以及在空間不足時哪些頁面該釋放。通過這些內容,你 會逐漸理解現代虛擬內存系統真正的工作原理①。

五、小結

????????介紹了操作系統的一個重要子系統:虛擬內存。虛擬內存系統負責為程序提供一 個巨大的、稀疏的、私有的地址空間的假象,其中保存了程序的所有指令和數據。操作系統在專門硬件的幫助下,通過每一個虛擬內存的索引,將其轉換為物理地址,物理內存根據獲得的物理地址去獲取所需的信息。操作系統會同時對許多進程執行此操作,并且確保程序之間互相不會受到影響,也不會影響操作系統。整個方法需要大量的機制(很多底層機制)和一些關鍵的策略。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74709.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云端存儲新紀元:SAN架構驅動的智能網盤解決方案

一、企業存儲的"不可能三角"破局 1.1 傳統存儲架構的困局 性能瓶頸:NAS架構在1000并發訪問時延遲飆升300%容量限制:傳統RAID擴容需停機維護,PB級存儲擴展耗時超48小時成本矛盾:全閃存陣列每TB成本高達$3000&#xff0…

Android adb自身調試log開關

本文介紹下如何打開adb源碼中的debug log 1.adb源碼log是可以動態打開和關閉的&#xff0c;控制邏輯代碼如下 static NoDestructor<std::mutex> log_mutex; static NoDestructor<CachedProperty> log_property GUARDED_BY(log_mutex)("debug.adbd.logging&q…

Axure RP 9.0教程: 基于動態面板的元件跟隨來實現【音量滑塊】

文章目錄 引言I 音量滑塊的實現步驟添加底層邊框添加覆蓋層基于覆蓋層創建動態面板添加滑塊按鈕設置滑塊拖動效果引言 音量滑塊在播放器類APP應用場景相對較廣,例如調節視頻的亮度、聲音等等。 I 音量滑塊的實現步驟 添加底層邊框 在畫布中添加一個矩形框:500 x 32,圓…

rocky linux 與centos系統的區別

Rocky Linux 和 CentOS 都是基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的社區發行版&#xff0c;但兩者在目標定位、更新策略和社區管理上有顯著差異。以下是核心區別的詳細對比&#xff1a; 一、背景與定位 特性Rocky LinuxCentOS起源由 CentOS 聯合創始人…

洛谷題單1-B2002 Hello,World!-python-流程圖重構

題目描述 編寫一個能夠輸出 Hello,World! 的程序。 提示&#xff1a; 使用英文標點符號&#xff1b;Hello,World! 逗號后面沒有空格。H 和 W 為大寫字母。 輸入格式 無 輸出格式 無 輸入輸出樣例 #1 輸入 #1 無輸出 #1 Hello,World!方式-print() 代碼 class Solut…

網絡基礎-路由器和交換機工作配置

三、路由器和交換機的工作原理配置以及華為體系下的小型網絡的搭建 3.1路由基礎 3.1.1數據轉發 通過鏈路層交換機和網絡層路由器進行數據轉發 交換機&#xff08;鏈路層&#xff09;mac地址表的數據轉發路由器&#xff08;網絡層&#xff09; ip路由表的數據轉發 隔離廣播域…

愛普生SG-3031CMA有源晶振在汽車雷達中的應用

隨著自動駕駛技術的普及&#xff0c;汽車雷達已成為高級駕駛輔助系統&#xff08;ADAS&#xff09;和自動駕駛系統的核心感知組件。雷達模塊需要精確的時鐘信號來確保發射/接收時序的準確性、信號處理的同步性以及低功耗運行。這些系統對時鐘信號的穩定性、抗干擾性及環境適應性…

案例實踐 | 招商局集團以長安鏈構建“基于DID的航運貿易數據資產目錄鏈”

概覽 案例名稱 基于DID的航運貿易數據資產目錄鏈 業主單位 招商局集團 上線時間 2024年10月 用戶群體 供數用數企業和個人 用戶規模 集團內20企業 案例背景 招商局集團深入落實“促進數據高效流通使用、賦能實體經濟”精神&#xff0c;深化集團數字化水平&#xff0c…

【docker】docker-compose安裝RabbitMQ

docker-compose安裝RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目錄請勿修改&#xff09;2、啟動mq3、訪問mq4、查看服務器映射目錄5、踩坑5.1、權限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目錄請勿修改&#xff09; versi…

Maven工具學習使用(二)——Maven基礎用法

pom常見屬性說明 詳細見官方文檔說明 https://maven.apache.org/ref/3.8.6/maven-model/maven.html#class_releases <modelVersion>4.0.0</modelVersion> POM模型的版本 <groupId>org.apache.maven.plugins</groupId> 項目屬于哪個組&#xff…

藍橋杯高頻考點——二分(含C++源碼)

二分 基本框架整數查找&#xff08;序列二分的模版題 建議先做&#xff09;滿分代碼及思路solution 子串簡寫滿分代碼及思路solution 1&#xff08;暴力 模擬雙指針70分&#xff09;solution 2&#xff08;二分 AC&#xff09; 管道滿分代碼及思路樣例解釋與思路分析solution 最…

【谷粒商城踩坑記】第五坑 拖拽組件三級菜單拖不了問題

第五坑 拖拽組件三級菜單拖不了問題 直接進入或刷新頁面后,拖動第三級菜單項,無法修改排序位置&#xff0c;我嘗試了直接用源碼包中提供的老師的代碼也不行&#xff0c;本身就有這個小 Bug &#xff0c;或者說是其它什么地方有問題。 原始內容是這樣的。 countNodeLevel(node){…

《深度剖析Android 12 SystemUI鎖屏通知布局亮屏流程:從源碼到實現》

優化后文章結構&#xff1a; 1. 前言 強調鎖屏通知布局的重要性及分析目的&#xff0c;引出后續源碼分析的必要性。 2. 核心類解析 KeyguardViewMediator&#xff1a;鎖屏核心邏輯控制&#xff0c;處理亮屏/息屏事件分發。 PhoneWindowManager&#xff1a;系統輸入事件&…

Android系統的安全問題 - Android的keymaster和gatekeeper

Android 的 Keymaster 和 Gatekeeper 是兩大關鍵安全組件,分別負責硬件級別的密鑰管理和設備解鎖認證。它們在 Android 的安全架構中扮演重要角色,尤其在支持 硬件級安全特性(如可信執行環境 TEE 或專用安全芯片)的設備上。以下是它們的詳細對比和功能解析: 1. Keymaster(…

springBoot中雪花算術法

在 Spring Boot 中&#xff0c;雪花算法&#xff08;Snowflake Algorithm&#xff09;通常指的是 Twitter 開發的一種分布式唯一 ID 生成算法。它被廣泛用于分布式系統中生成全局唯一的 ID&#xff0c;尤其是在高并發場景下。雪花算法生成的 ID 是一個 64 位的長整型數字&#…

鴻蒙開發之ArkTS聯合類型

在鴻蒙開發中&#xff0c;ArkTS是一種基于TypeScript的編程語言&#xff0c;專為鴻蒙應用開發而設計。聯合類型&#xff08;Union Types&#xff09;在ArkTS中是一個重要的概念&#xff0c;它允許一個變量存儲多種類型的數據&#xff0c;從而增加了代碼的靈活性&#xff0c;同時…

K8S學習之基礎五十五:k8s中jenkins部署blueOcean

jenkins部署blueOcean 安裝插件 BLUE OCEAN 之后會多出一個菜單&#xff0c;可以更詳細方便的查看pipeline流程

DeepSeek概述

一、DeepSeek概述 1.1 DeepSeek是什么 DeepSeek是一家專注 通用人工智能&#xff08;AGI&#xff0c;Artificial General Intelligence&#xff09;的中國科技公司&#xff0c;主攻大數據研發與應用。DeepSeek-R1是其開源的推理模型&#xff0c;擅長處理復雜任務且可免費商用…

學習記錄(14):iOS部署

時隔多年后&#xff0c;再次部署開發iOS&#x1f601;&#x1f601; 1. Unity端設置&#xff0c;在此不再進行贅述&#xff08;網上一大堆&#xff09; 2. ??&#xff1a;要保證mac比待部署的設備版本要高 3. Xcode: (1) 打開從 Unity 3D 里打包的文件中&#xff0c;找到有…

如何使用DeepSeek編寫測試用例?

一、DeepSeek在測試用例設計中的定位 DeepSeek作為AI工具,并非直接替代測試設計,而是通過以下方式提升效率: 快速生成基礎用例框架(等價類、邊界值等) 智能補充易遺漏場景(如特殊字符、異常流) 自動化腳本片段生成(Python/pytest/JUnit等) 測試數據構造建議(符合業務…