1. 程式人生 > >[作業系統] 地址空間和交換技術

[作業系統] 地址空間和交換技術

地址空間和交換技術

1. 地址空間的概念

在最初系統中沒有對記憶體的抽象,直接使用實體地址進行儲存,這種方法會帶來嚴重的問題。

  1. 如果使用者程式可以定址記憶體的每個位元組,它們就可以容易地破壞作業系統。從而使作業系統停止執行
  2. 想要同時執行多個程式很困難,因為使用實體地址很容易將資料覆蓋。

要保證多個應用程式同時存在於記憶體並且不互相影響,要解決兩個問題:保護重定位

一個很好的解決方法是創造一個記憶體抽象:地址空間。地址空間為程式創造了一種抽象的記憶體,地址空間是一個程序可用於定址記憶體的一套地址集合。每個程序都有一個自己的地址空間,並且這個地址空間獨立於其他程序的地址空間(在特殊情況下想要共享除外)。例如,電話號碼00000000000 ~ 99999999999就是一個地址空間。

2. 基址暫存器和界限暫存器

使用地址空間的困難點在於給每個程式一個自己的地址空間,假如A程式想要使用的地址為28,B程式想要使用的地址也為28。兩個程式同時執行,我們不能讓這兩個程式相互影響,就要讓他們想要使用的**邏輯地址**28對應不同的實體地址。

解決這個問題的一種方法是動態重定位。為每個CPU配置兩個特殊的暫存器,基址暫存器界限暫存器。當程式執行時,程式的起始實體地址裝載到基址暫存器,長度裝載到界限暫存器。這樣程式在執行命令時,如果使用邏輯地址就會被解釋為基址暫存器儲存的實體地址。例如,此時程式想要訪問邏輯地址28,使用命令 “JMP 28”,此時基址暫存器中的值為16412,硬體自動把這條指令解釋為”JMP 16412”。

使用這種方法的缺點是,每次訪問記憶體都需要進行加法和比較

3. 記憶體超載

當所有要執行的程序所需要的記憶體大於計算機的實體記憶體時,就不能把所有程序一直儲存在記憶體中。這種情況叫做記憶體超載。要想解決這種問題,有兩種方法。

  1. 交換技術
    即把一個程序完整排程記憶體,使該程序執行一段時間,然後把它存回磁碟。空閒程序主要儲存在磁碟上,就不會佔用記憶體。

  2. 虛擬記憶體
    可以使程式在只有一部分被調入記憶體的情況下執行。

4. 交換技術

記憶體交換技術

如圖所示,陰影區域表示未使用的記憶體。開始時記憶體中只有程序A。之後建立程序B和C或者從磁碟將它們還如記憶體。d圖顯示A被交換到磁碟,D被調入到記憶體,然後B被調出,A再次被調入。

1. 預留空間

通過圖片可見,使用這種方法,記憶體中有很多小的空閒區(陰影),這些小的空閒區大部分無法放置合適的程序,就會造成浪費。通過把所有程序向下移動,將這些空閒區合在一起,可以節省空間,這種方法叫做記憶體緊縮。但是這個操作會耗費大量CPU時間。

使用這種方法我們需要注意一個問題,即如果程序大小不是一成不變的而是動態的該怎麼解決。若該程序與空閒區相鄰,可以使用空閒區來將該程序所佔記憶體擴大。但如果該程序與其他程序相鄰,則無法擴大,此時只能交換出一個或多個程序。

為了解決這個問題,在為程序分配記憶體空間時,可以為它們分配一些額外的記憶體。而寫回磁碟時,只寫回實際使用的記憶體。

動態記憶體分配

a圖為給程序分配多餘空間的普通方法。如果程序有兩個可增長段,如資料段和堆疊段,則可以使用b中的方法。

2. 空閒記憶體管理

在動態分配記憶體時,作業系統必須對記憶體進行追蹤和管理。

  1. 使用點陣圖的儲存管理
    記憶體被劃分為幾個字到幾千位元組的分配單元,每個分配單元對應於為點陣圖中的一位,0表示空閒,1表示佔用(或者相反)。分配單元越小,點陣圖越大。32n位的記憶體需要n位點陣圖。再決定把一個佔k個分配單元的程序調入記憶體中時,儲存管理器需要搜尋點陣圖,在點陣圖中找出有個k個連續為0的串。缺點是比較耗時。

    空閒記憶體管理

  2. 連結串列儲存管理
    連結串列中的結點或者是一個程序,或者是兩個程序間的空閒區。每一個結點包含:空閒區,程序的指示標誌、起始地址、長度。當程序終止時,更新非常直接,如果鄰居沒有空閒去,只把自己變為空閒區就可以。如果鄰居有空閒區則把該程序原有的地址與空閒區合併。所以雙鏈表更好,因為便於找到前後鄰居併合並。

    連結串列儲存管理

5. 連結串列儲存管理中用來建立程序的演算法

假設儲存管理器知道要為程序分配多大記憶體。

  1. 首次適配
    儲存器沿著段鏈進行搜尋,找到第一個足夠大的空閒區,將空閒區的一部分給程序使用,另一部分變為新的空閒區(除非大小正好一樣)。這種方法速度很快。

  2. 下次適配
    工作方式與首次適配相似,但是不同於首次適配每次從頭開始尋找,下次適配會記錄下上次分配的位置,然後從上次分配過的地方開始。

  3. 最佳適配
    搜尋整個連結串列,找到能容納程序的最小空閒區。浪費時間,並且會產生許多無用的小空閒區。

  4. 最差適配
    與最佳適配相反,該方法總是總是分配最大空閒區給程序。

    如果想要增加以上4個演算法速度,可以為程序和空閒區維護各自的連結串列。但會增加記憶體釋放速度,因為要將結點從程序連結串列刪除,並加入到空閒區連結串列。
    
    可以將空閒區連結串列進行增序排序,以減少最佳適配的速度。當單獨維護空閒區時,可以直接用空閒區儲存資訊,每個空閒區的第一個字可以為大小,第二個字可以指向下一個空閒區。
    
  5. 快速適配:為常用大小的空閒區維護單獨列表。例如有一個n項的表。表的第一項指向大小4KB空閒區,第二項為8KB,第三項為12KB。以此類推,21KB的空閒區可以放在代表20KB連結串列中,也可以單獨放置在特別連結串列中。

參考書目:現代作業系統第三版

相關推薦

[作業系統] 地址空間交換技術

地址空間和交換技術 1. 地址空間的概念 在最初系統中沒有對記憶體的抽象,直接使用實體地址進行儲存,這種方法會帶來嚴重的問題。 如果使用者程式可以定址記憶體的每個位元組,它們就可以容易地破壞作業系統。從而使作業系統停止執行 想要同時執行

第5章 IP地址子網劃分(2)_IP地址分類NAT技術

sts 端口 主機數 int 2.3 主機ip 主機 和源 找到 3. IP地址的分類 (1)五類IP地址 (2)數軸表示法 4. 保留地址 (1)網段的地址:主機ID全0。如192.168.100.0/24,其中的192.168.10.0指的是網段。 (2)廣播地

覆蓋技術交換技術

bsp 程序 交換 狀態 主存 0kb 獨立 原來 存儲空間 覆蓋和交換是從邏輯上擴充主存的方法。 1.覆蓋:主要在早期的操作系統中使用 把程序劃分為若幹個功能獨立的程序段,這些程序段不會同時被CPU執行,且讓他們共享同一個主存區。當前沒有被CPU執行的程序段放在外存,需要

sed高級命令及模式空間交換空間簡介

模式空間 保持空間 sed 高級命令 之前我們用到的sed命令都是一行一行的進行處理文本的,不過有些時候單行處理可能並不能滿足我們的需要,所以sed還提供了多行模式,多行模式的命令主要有NPD這三個,N:讀取匹配到的行的下一行追加至模式空間P:打印模式空間開端至\n內容,並追加到默認輸出之前D:如

實體地址空間虛擬地址空間

http://blog.csdn.net/jiasike/article/details/38852485 一、實體地址(空間)     因為CPU是32位的,其地址匯流排是32位的,所以其地址匯流排可編碼的個數是2^32(4G),這2^32個實體地址的集合

作業系統核心空間使用者空間的互訪問

前面寫了很多的文章來說明了這個問題,並且在文章中均舉了一些例子,如果為了解決具體問題,那麼那些就已經足夠了,但是如果想實現一個作業系統,這些就遠遠不夠了。 硬體是軟體的底層,這是一個前提,硬體是舞臺,軟體都是舞者,作業系統是應用程式的底層,作業系統是舞臺,應用程式是舞者

程序地址空間記憶體檔案對映

程序地址空間 每個程序都有自己的地址空間。對32位程序來說,由於32位指標可以表示從0x00000000到0xFFFFFFFF之間的任一值,地址空間的大小為4GB。對64位程序來說,由於64位指標可以表示從0x00000000'00000000到0xFFFFFFFF'FFF

【計算機網絡】數據交換技術多路復用技術的正(nao)確(can)打開方式

分割 image user 信號 也不能 soft 所有 什麽是 收費 交換的作用 數據交換是計算機網絡中兩個終端進行數據傳輸的方式,它又可以分成兩種類型:電路交換和分組交換。很顯然,問題的核心在於“交換”,那麽我們首先要思考的是:交換的作用

Docker02:Docker核心技術探索(3)網絡命名空間網絡隔離

net running all pack 網卡 roo span 命名空間 collision 在Docker中可以為Docker容器創建與原始宿主系統以及其它容器中的虛擬系統之間相互隔離的虛擬網絡環境。 Docker的網絡分為以下幾種模式: (1)bridge模式。這將配

Linux虛擬地址空間布局以及進程棧線程棧總結(轉)

開始 系統初始 後來 文本 lov fault 和數 ps命令 變量大小 一:Linux虛擬地址空間布局 (轉自:Linux虛擬地址空間布局) 在多任務操作系統中,每個進程都運行在屬於自己的內存沙盤中。這個沙盤就是虛擬地址空間(Virtual Address Spac

java NIO 快取區之核心空間、使用者空間虛擬地址

  IO是基於快取區來做的,所謂的輸入和輸出就是從快取區中移入和移出資料。以IO輸入為例,首先是使用者空間程序向核心請求某個磁碟空間資料,然後核心將磁碟資料讀取到核心空間的buffer中,然後使用者空間的程序再將核心空間buffer中的資料讀取到自身的buffer中,然後程序就可

淺析實體記憶體、虛擬記憶體程序的地址空間

   ●在一個系統中,程序是和其他程序共享CPU和主存資源。但是共享資源會造成一些不可避免的問題,例如由於儲存器不夠而         程序無法執行,亦或是儲存器被外來的惡意程序破壞等。 早期的記憶體管理機制:  分派方式

Android 地址空間隨機化(ALSR)緩解技術

出發點 常規的緩衝區溢位利用技術以及其衍生的Ret2libs和ROP利用技術在利用棧緩衝區溢位漏洞進行攻擊時,需要事先熟悉被攻擊程序的虛擬地址空間佈局以便採用硬編碼方式佈局棧記憶體。由於作業系統每次載入程序和動態連結庫時,基地址都載入到固定虛擬記憶體地址處,使緩衝區溢位漏洞

虛擬地址空間佈局編譯連結執行原理

一、 利用中間層訪問實體記憶體,一是提高了記憶體使用效率和最優分配,二是提高了安全性。中間層又被稱作虛擬地址空間,由此一來,程式訪問的不再是實際的實體記憶體地址,而是訪問虛擬地址,作業系統再將虛擬地址對映到實體記憶體上;linux系統下虛擬地址空間是這樣劃分的: .d

CPU地址空間,IO埠IO記憶體

1)實體地址:CPU地址匯流排傳來的地址,由硬體 電路控制其具體含義。實體地址中很大一部分是留給記憶體條中的記憶體的,但也常被對映到其他儲存器上(如視訊記憶體、BIOS等)。在程式指令中的虛擬地址經過段映 射和頁面對映後,就生成了實體地址,這個實體地址被放到CPU的地址線

作業系統原理:程序地址空間

Linux程序虛擬儲存 先回憶一下ELF檔案的組織結構,可以看這篇文章:Linux 連結與ELF檔案。程式執行後進程地址空間佈局則和作業系統密切相關。在將應用程式載入到記憶體空間執行時,作業系統負責程式碼段與資料段的載入,並在記憶體中為這些段分配空間。Linu

Kubernetes權威指南第2版 Docker技術入門與實戰第2版 兩本容器的書下載地址

Docker技術入門與實戰第2版目錄[0第0]2版前言[0第0]1版前言[0第0]一部分 基礎入門[0第0]1章 初識容器與Docker 31.1 什麼是Docker 31.2 為什麼要使用Docker 51.3 Docker與虛擬化 71.4 本章小結 9[0第0]2章 核心概念與安裝配置 102.1 核心

cpu的定址空間記憶體的地址

轉自:http://blog.chinaunix.net/uid-30234312-id-5076067.html 儲存器裡以位元組為單位儲存資訊,每個位元組單元存放的是一個8位二進位制數(例如,11001100這個8位二進位制數存放在一個位元組單元裡),每個位元組單元都給

ARM結構MIPS結構的地址空間

無論在哪種體系結構中,地址空間的訪問都是CPU執行的基本,CPU的每一條指令的地址,都必須在CPU所能訪問的地址空間內,當然這個空間指的是虛擬地址空間。每個CPU所能訪問多大的虛擬地址這是和CPU的位數有關的,32位地址匯流排,最大的虛擬地址就是2的32次方,64位同理。當然

作業系統——記憶體管理虛擬地址對映那些事

為什麼會有記憶體管理??? 隨著計算機的高速發展,計算機早已不是單道處理模式了,不再使用古老的紙帶打孔的方式,將持續輸入到cpu,讓其執行了,而是將程式載入到記憶體中去,那麼當多個程式同時執行的情況下,怎麼去給程式分配位置就是發明者要考慮的問題了。因此有了記憶