清華大學《操作系統》(七):虛擬存儲、覆蓋、交換

接下來幾節都是對虛擬存儲的講解。虛擬存儲是非連續存儲管理的擴展。通過將內存中的數據暫存到外存的方式,為進程提供更大的內存空間。虛擬存儲出現的主要原因是因為程序規模的增長速度遠遠大于存儲器容量的增長速度,導致內存空間不夠用。其實針對內存空間不夠用的問題有多重解決方案,比如覆蓋、交換、虛擬存儲。它們的概念如下:

  • 覆蓋:應用程序手動把需要的指令和數據加載到內存;
  • 交換:操作系統自動把暫時不能執行的程序保存到外存中;
  • 虛擬存儲:在有限的內存中,以頁為單位自動裝入更多更大的程序

覆蓋

目標:在較小的可用內存中運行較大的程序。

方法:依據程序邏輯,將程序劃分為若干功能相對獨立的模塊,不會同時執行的模塊共享同一塊內存區域。具體有以下幾點:

  • 必要部分(常用功能)的代碼和數據常駐內存;
  • 可選部分(不常用功能)放在其它程序模塊中,只在需要時加載到內存;
  • 不存在調用關系的模塊可以相互覆蓋,共用同一塊內存區域。

具體操作如下:假設有一個程序總大小190K,調用關系如下圖。我們按照上述原則對程序進行分組,比如A單獨一組,B與C沒有調用關系因此B、C一組,D、E、F沒有調用關系分為一組,分配內存時按照組內最大的模塊分配內存,如圖中右側,A劃分20K,B、C這組分配50K,D、E、F這組分配40K,按照需求向內存中加載。這樣這個程序可以在內存大小為110K的機器中運行。那么這種分組方式是不是最優的呢?答案是否定的,我們可以將大小相近的分到一組,比如A單獨一組20K,B、E、F無調用關系50K,C、D無調用關系30K,總共需要100K內存。因此不同的分組方式對內存的需求是不一樣的。想要嚴格討論哪種方式內存需求最小是很復雜的。

缺點

  • 增加編程困難。需要程序員劃分功能模塊,并確定模塊之間的覆蓋關系,增加了編程的復雜度;
  • 增加執行時間。需要將各程序模塊在內存模塊中換入換出,實際是用時間換空間。

交換

交換與覆蓋討論的尺度是不太一樣的。覆蓋是一個程序內,如果無法全部加載到內存,而交換是內存足夠放一個程序,而無法放多個程序。

目標:增加正在運行或需要運行的程序的內存。

實現方法:

  • 可將暫時不能運行的程序放到外存;
  • 換入換出的基本單位是進程;
  • 換出是把一個進程的整個地址空間保存到外存;
  • 換入是把一個進程的整個地址空間從外存加載到內存。

問題

  • 交換時機:只當內存空間不足或有不足的可能的時候才進行換入換出;
  • 交換區大小:存放所有用戶進程的所有內存映像的拷貝;
  • 程序換入時的重定位:換入時不是放回原處,因此需要程序運行過程中采用動態地址映射。

覆蓋與交換對比:

  • 覆蓋:
  1. 只能發生在沒有調用關系的模塊之間;
  2. 程序員須給出模塊之間的邏輯覆蓋關系;
  3. 發生在運行程序的內部模塊間。
  • 交換:
  1. 以進程為單位;
  2. 不需要模塊間的邏輯覆蓋關系;
  3. 發生在內存進程間。

交換是可以通過操作系統實現的,而覆蓋是無法在操作系統中實現的,必須有程序員具體實現,增大了編程的難度。

虛擬存儲

虛擬存儲是想把一部分內存中的內容暫時存放到外存中,以提供更大的內存空間。例如

虛擬存儲的目標:

  • 只把部分程序放到內存中,從而運行比物理內存大的程序。并且由操作系統完成,無需程序員的干涉。
  • 實現進程在內存和外存在之間交換,從而獲得更多的空閑內存空間。在內存與外存之間只交換進程的部分內容。

局部性原理

具體講虛擬存儲之前先了解一下局部性原理。局部性原理是指程序在執行過程中的一個較短時期,所執行的指令地址和指令的操作數地址,分別局限于一定區域。比如通常指令在代碼段,操作數在數據段。具體體現在以下幾個方面:

  • 時間局部性。一條指令的一次執行和下次執行,一個數據的一次訪問與下次訪問都集中在一個較短時期內;
  • 空間局部性。當前指令和鄰近的幾條指令,當前訪問的數據和鄰近的幾條數據都集中在一個較小的區域內;
  • 分支局部性。一條跳轉指令的兩次執行,很可能跳轉到相同的內存位置。

由于局部性原理的存在,從理論上講,虛擬存儲技術是能夠實現的,可以取得滿意的效果。

虛擬存儲基本概念:

  1. 思路:將不常用的部分內存塊暫存到外存。
  2. 原理:裝載程序時,只將當前指令執行需要的部分頁面或段裝入內存;指令執行中需要的指令或數據不在內存中(缺頁或缺段)時,處理器通知操作系統將相應的頁或段調入內存中;操作系統將內存中暫時不用的頁面或段保存到外存中,如何判定哪些不常用,需要后續的置換算法。
  3. 實現方式:虛擬頁式存儲、虛擬段式存儲。

虛擬存儲的基本特征:

  1. 不連續性。物理內存分配非連續,虛擬地址空間使用非連續。
  2. 大用戶空間。提供給用戶的虛擬內存可大于實際的物理內存。
  3. 部分交換。虛擬存儲支隊部分虛擬地址空間進行調入和調出。

虛擬存儲的支撐技術:

  • 硬件支持。頁式或段式存儲中的地址轉換機制。除之前非連續內存管理中所講的地址轉換,還要增加判斷所需要的內容不再內存中。
  • 操作系統支持。管理內存和外存間頁面或段的換入和換出。

虛擬頁式存儲:

在頁式存儲管理的基礎上,增加請求調頁和頁面置換。具體思路是當用戶程序要裝載到內存運行時,只裝入部分頁面就啟動程序運行。進程在運行中發現有需要的代碼或數據不在內存時,則向系統發出缺頁異常請求。操作系統在處理缺頁異常時,將外存中相應的頁面調入內存,使得進程能夠繼續運行。如下圖所示,在頁表中加入標志位,當發現缺頁時觸發缺頁異常,操作系統接管,找到相應頁面置入內存,并將標志位修改為有效。

虛擬頁式管理中,頁表項結構有相應調整,如下圖:增加了幾個標志位。其中駐留位用來表示是否在內存中;修改位表示在內存中的該頁是否被修改過,因為如果沒有修改過而外存中又有這一頁面時不需要置換,直接作廢該頁表項即可,如果被修改過則需要重新置換;訪問位表示該頁是否被訪問過(讀或寫),用于置換算法,用于近似統計是否經常訪問;保護位表示該頁的允許訪問方式,如可讀可寫。

示例:

下面是X86 32位系統以4K為頁幀大小時的頁表項結構:幀號項占20位,標志位中除了前面提到的駐留位、可寫標志、訪問位、修改位,還有幾個沒提到過的。一個是用戶態標志,表示用戶態是否可以訪問;保留位,用于擴展,比如現在很多32位系統不僅支持4G內存;CD位,緩存是否有效,是否允許啟用高速緩存;WT是否寫通。

缺頁異常:

缺頁異常即發現需要的內存頁不在內存中。缺頁異常處理流程如下圖:

執行命令時CPU給出需要的邏輯地址,查找頁表;發現缺頁,產生缺頁異常;操作系統啟用缺頁異常例程,查找頁面在外存中的位置;從物理內存中找空閑頁幀并將頁面換入空閑處;將頁表項修改為有效;重新執行導致異常的指令。

可以看到這是最順利的情況,如果換入時發現沒有空閑頁幀的話則需要額外幾步:根據頁面置換算法選擇要被換出的頁幀;判斷該頁幀是否被修改過,如果被修改過則寫回外存,否則直接作廢;將其對應的頁表項改為無效;然后將需要的頁幀換入空出來的區域,后續與最開始的流程一致。

虛擬頁式存儲中的外存是如何管理的呢?首先是在何處保存未被映射的頁?因為必須能夠方便地找到在外存中的頁面內容,因此我們需要一個交換空間,有兩種方式實現:磁盤或文件。Linux就是直接有交換分區。或者文件采用特殊格式存儲未被映射的頁面。

虛擬頁式存儲中的外存選擇也是個問題。代碼段本身就是存儲在可執行文件中的,因此代碼段是直接指向你的可執行文件;動態加載的共享庫程序段也直接指向相應的文件;其他段放在對換區。

虛擬頁式存儲管理的性能如何評價呢?

我們定義了一個有效存儲訪問時間(effective memory access time)EAT。

舉個例子:可以看到想要效率較高,需要缺頁率p極小。

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

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

相關文章

遵義大數據中心項目工程概況_市委書記張新文到曹州云都大數據中心等項目現場調研建設情況...

4月25日,市委書記張新文到曹縣調研重點項目建設情況,研究推進措施。市委常委、秘書長任仲義參加活動。張新文首先來到曹州云都大數據中心項目建設現場,查看項目推進情況。曹州云都大數據中心,是涵蓋云計算區、研發辦公區、公寓生活…

linux 可執行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年,Richard Stallman發起了自由軟件運動,GNU (Gnus Not Unix)項目應運而生,3年后,最初版的GCC橫空出世,成為第一款可移植、可優化、支持ANSI C的開源C編譯器。GCC最初的全名是GNU C Com…

Cassandra 的數據存儲結構——本質是SortedMapRowKey, SortedMapColumnKey, ColumnValue

Cassandra 的數據存儲結構 Cassandra 的數據模型是基于列族(Column Family)的四維或五維模型。它借鑒了 Amazon 的 Dynamo 和 Googles BigTable 的數據結構和功能特點,采用 Memtable 和 SSTable 的方式進行存儲。在 Cassandra 寫入數據之前&a…

清華大學《操作系統》(八):置換算法

功能:置換算法是指當出現缺頁異常時,需要調入新頁面而內存已滿時,置換算法選擇被置換的物理頁面。 設計目標: 盡可能減少頁面的調入調出次數;把未來不再訪問或短期內不訪問的頁面調出。 頁面鎖定: 了解具…

python email模塊詳解_python模塊之email: 電子郵件編碼解碼 (一、解碼郵件)

python自帶的email模塊是個很有意思的東西,它可以對郵件編碼解碼,用來處理郵件非常好用。處理郵件是一個很細致的工作,尤其是解碼郵件,因為它的格式變化太多了,下面先看看一個郵件的源文件:Received: from …

爛泥:通過vsphere給esxi添加本地硬盤

公司ESXi服務器的硬盤空間不夠使用,現在新加了一塊硬盤在ESxi服務器上。在服務器上添加完硬盤后,在Vsphere上是看不到新加硬盤的。 下面我們來通過虛擬機模擬該情況,先添加一塊硬盤。如下圖: 在Esxi添加完硬盤后,現在通…

清華大學《操作系統》(九):進程和線程

進程 定義: 進程是指一個具有一定獨立功能的程序在一個數據集合上的一次動態執行的過程。 組成: 代碼數據狀態寄存器(正在運行的一個程序的所有狀態信息):CPU狀態CP0、指令指針IP通用寄存器:AX、BX、CX…

開始Flask項目

1.新建Flask項目。2.設置調試模式。3.理解Flask項目主程序。4.使用裝飾器,設置路徑與函數之間的關系。5.使用Flask中render_template,用不同的路徑,返回首頁、登錄員、注冊頁。6.用視圖函數反轉得到URL,{{url_for(‘login’)}}&am…

gcc交叉編譯的實現

gcc支持多種不同的語言,也支持多種不同的CPU架構。在它的實現上,不同語言編譯的實現是通過conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;這個結構體的不同定義來實現的。比如c語言的編譯器就通過gcc/c-lang.c指定了lang_hooks這個結構體的…

爛泥:mysql數據庫使用的基本命令

1、連接數據庫的格式 mysql -h IP -u用戶名 -p密碼; 1.1連接遠程數據庫 mysql -h 192.168.1.214 -uroot -p123456 也可寫成: mysql -h 192.168.1.214 -u root -p 123456 1.2連接本地數據庫 mysql -uroot -p123456 也可寫成: mysql -u root -p 123456 2、…

mse均方誤差計算公式_PCA的兩種解讀:方差最大與均方誤差最小的推導

這張圖片很關鍵,來自統計學習方法的PCA插圖又要考試了,推導一下方差最大化與均方差最小化,老師上課講了一些均方差最小化,推導的過程很詳細不過自己沒有記下來,復習的時候再推一遍加深印象。感謝 耳東陳 老師的精彩課件…

《操作系統》OS學習(十):進程控制

進程切換(上下文切換): 定義:暫停當前運行進程,從運行狀態變成其他狀態,調度另一個進程從就緒狀態變成運行狀態要求:切換前,保存進程上下文;切換后,恢復進程…

日志管理

1、錯誤日志配置 錯誤日志屬于核心功能模塊的參數 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置這一行即可 events {worker_connections 1024; }語法規則:error_log file level 錯誤的日志級別有[debug|info|notice|warn|err…

GCC 命令選項使用詳解

GCC 命令行詳解[轉帖] 1、gcc包含的c/c編譯器 gcc、cc、c、g gcc和cc是一樣的,c和g是一樣的,一般c程序就用gcc編譯,c程序就用g編譯 2、gcc的基本用法 gcc test.c這樣將編譯出一個名為a.out的程序 gcc test.c -o test這樣將編譯出一個名為t…

mvn 打包_Spark源碼打包編譯的過程

前言上篇文章介紹了下 安裝sbt環境 啟動scala項目安裝SBT環境運行Scala項目為什么要弄這個 因為我本來是想對spark源碼編譯部署spark是用scala語言編譯的spark源碼https://gitee.com/pingfanrenbiji/sparkspark提供的編譯方式編譯的前提是將所有的依賴包都下載下來而資源包管理…

審計日志功能監控

背景:公司的審計日志經常出現不記錄命令的情況,但是又無法監控到審計功能是否正常。所以我們思路是,每天從CMDB服務器 ssh登錄到每一臺主機。如果審計功能正常,則一定會在auditlog.info文件中有登錄的記錄。如果24小時內這個文件沒…

清華大學《操作系統》(十一):處理機調度

一、處理機調度概念 進程切換(上下文切換):切換CPU的當前任務,從一個進程/線程到另一個,保存當前在PCB/TCB中的執行上下文,讀取下一個的上下文 CPU調度:從就緒隊列中挑選一個進程/線程作為CPU…

通過純css實現圖片居中的多種實現方式

html結構&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 實現img位于外層div的居中顯示…

GCC 命令行詳解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c編譯器 gcc,cc,c,g,gcc和cc是一樣的&#xff0c;c和g是一樣的&#xff0c;(沒有看太明白前面這半句是什 么意思:))一般c程序就用gcc編譯&#xff0c;c程序就用g編譯 2。gcc的基本用法 gcc test.c這樣將編譯出一個…

Java網絡編程從入門到精通(5):使用InetAddress類的getHostName方法獲得域名

該方法可以得到遠程主機的域名&#xff0c;也可以得到本機名。getHostName方法的定義如下&#xff1a; publicString getHostName() 下面是三種創建InetAddress對象的方式&#xff0c;在這三種方式中&#xff0c;getHostName返回的值是不同的。 1&#xff0e;使用getLocalHost方…