操作系統【三】內存管理基礎+連續內存分配

內存的基礎知識

內存分為按字節編址(8位)和字編制(不同計算機不一樣,64位計算機就是64位,即8個字節)

相對地址=邏輯地址 絕對地址=物理地址

在這里插入圖片描述

從邏輯地址到物理地址的轉換由裝入解決。

裝入的三種方式

  1. 絕對裝入:在編譯時知道程序放在內存中的哪個位置,編譯程序將產生絕對地址的目標代碼。
    靈活性很低,只適用于單道程序環境,只有單道程序環境可以在程序運行之前就能確定程序將要放入哪個位置
  2. 靜態重定位:又稱為可重定位裝入。裝入模塊全部使用邏輯地址,在裝入的時候將邏輯地址全部轉換為物理地址。
    特點是必須分配其要求的全部內存空間,如果沒有足夠的內存,就不能裝入作業。作業一旦進入內存后,在運行期間就不能再移動,也不能再申請內存空間。
  3. 動態重定位:又稱為動態運行時裝入。裝入模塊使用相對地址。相對地址到物理地址的轉變要等到實際運行的時候才能確定。因此裝入內存后所有的地址仍然是邏輯地址。這種方式需要一個重定位寄存器的支持。
    重定位寄存器:存放裝入模塊存放的起始位置。當實際運行的時候實時地將邏輯地址轉換為物理地址。
    采用動態重定位允許程序在內存中發生移動。可以將程序分配到不連續的存儲區:在程序運行前只需要裝入他的部分代碼即可投入運算,然后在程序運行期間根據需要動態申請分配內存,便于程序段的共享,可以向用戶提供一個比存儲空間大得多的地址空間。

鏈接的三種方式

  1. 靜態鏈接:在程序運行之前,先將各個目標模塊以及他們所需要的庫函數連接成一個完整的可執行文件(裝入模塊),之后不再拆開。
  2. 裝入時動態鏈接:將各目標模塊裝入內存時,邊裝入邊鏈接
  3. 運行時動態鏈接:在程序執行中需要該目標模塊時才對他進行鏈接,優點是便于修改和更新,便于實現對目標模塊的共享。

內存管理需要解決的問題

  1. 內存空間的分配與回收
  2. 操作系統需要提供某種技術從邏輯上對內存空間進行擴充
  3. 地址轉換(三種裝入方式:絕對裝入、可重定位裝入/靜態重定位、動態運行時裝入/動態重定位)
  4. 內存保護:保護各個進行運行互不干擾
    方法一:在CPU中設置一對上下限寄存器,存放進程的上下限地址。進程的指令要訪問某個地址時,CPU檢查是否越界。
    方法二:采用重定位寄存器(基址寄存器)和界地址寄存器(限長寄存器)進行越界檢查。重定位寄存器中存放的是進程的起始物理地址,界地址寄存器中存放的是進程的最大邏輯地址。

內存空間的擴充

覆蓋技術

用于解決“程序大小超過物理內存總和”的問題

覆蓋技術的思想:將程序分為多個段(多個模塊)。常用的段常駐內存,不常用的段在需要時調入內存。

內存中分為固定區 和 若干個覆蓋區

需要常駐內存的段放入固定區中,調入后就不再調出(除非運行結束)。不常用的段就放在覆蓋區中。按照自身邏輯結構,讓那些不可能同時被訪問的程序段共享同一個覆蓋區。

在這里插入圖片描述

程序員必須聲明覆蓋結構,操作系統完成自動覆蓋。缺點:對用戶不透明,增加了用戶編程負擔。(已經沒人用了)

交換技術

也叫做對換技術:內存空間緊張時,系統將內存中某些進程暫時換到外存中,把外存中某些已經具備運行條件的進程換入內存(中級調度)

進程的PCB需要常駐內存

中級調度(內存調度):決定將哪個處于掛起狀態的進程重新調入內存。
暫時換出外存等待的進程的狀態為掛起狀態。

掛起狀態可以分為:就緒掛起、阻塞掛起兩種狀態。

在這里插入圖片描述

  1. 應該在外存的什么位置保存被換出的進程?
    具有對換功能的操作系統中,通常把磁盤文件分為文件區對換區兩部分。文件區主要用于存放文件,主要追求存儲空間的利用率,因此對文件區空間的管理采用離散分配方式;對換區空間只占磁盤空間的一小部分,被換出的進程數據就存放在對換區。對于對換的速度直接影響到系統的整體速度,因此對換區空間的管理主要追求換入換出速度,因此通常對換區采用連續分配方式。總之,對換區的I/O速度比文件區的更快。

  2. 應該什么時候交換?
    交換通常在許多進程運行且內存吃緊時進行,而系統負荷降低就暫停。例如:在發現許多進程運行時經常發生缺頁,就說明內存緊張,因此可以換出一些進程;如果缺頁率明顯下降,就可以暫停換出。

  3. 應該換出哪些進程?
    可優先換出阻塞進程;可換出優先級低的進程;為了防止優先級低的進程饑餓,有的系統還會考慮進程在內存的駐留時間。。。(PCB常駐內存

覆蓋技術和交換技術的區別:

  • 覆蓋是同一個程序或者進程中
  • 交換是在不同進程/作業中的

內存分配

連續分配管理

系統為用戶進程分配必須是一個連續的內存空間。

單一連續分配

內存被分為系統區和用戶區。內存中只能有一道用戶程序,用戶程序獨占整個用戶區空間。

優點:實現簡單,沒有外部碎片;可以采用覆蓋技術擴充內存;不一定需要采取內存保護(eg:早期的MS-DOS)
缺點:只能用于單用戶、單任務的操作系統;有內部碎片;存儲器利用率極低

內部碎片:分配給進程的內存區域中,如果有些部分沒有用上,就是內部碎片。

固定分區分配

將用戶區劃分為若干個固定大小的分區,在每個分區中之狀如一道作業,這樣就形成了最早的,最簡單的一種可運行多道程序內存管理方式。

如果分區大小相等:缺乏靈活性,但是很適用用于同一臺計算機控制多個相同對象。

如果分區大小不等:增加了靈活性,可以滿足不同大小進程的需求。產生一些大的,產生一些小的。

分區說明表:來實現每個分區的分配與回收。每個表象對應一個分區,通常按分區大小分配。

在這里插入圖片描述
優點:實現簡單,無外部碎片

缺點:當用戶程序太大時,可能所有分區都不能滿足需求,用覆蓋技術來解決可能降低性能;可能產生內部碎片,內存利用率低

動態分區分配

又稱為可變分區分配。根據進程裝入內存時的大小動態建立分區。因此系統分區的大小和數目時可以改變的。

  1. 操作使用什么樣的數據結構記錄內存
  • 空閑分區表:每個空閑分區對應一個表項
  • 空閑分區鏈:每個分區的起始部分和末尾部分分別設置前向指針和后向指針。起始部分處還可以記錄分區大小等信息。
  1. 當很多空閑分區都能夠滿足需求時選擇哪一個

使用動態分區分配算法

  1. 分區的分配和回收

動態分區沒有內部碎片,但是有外部碎片。
內部碎片:分配給某進程的內部區域中如果有些部分沒有用上
外部碎片:內存中的某些空閑分區由于太小而難以利用

為了解決外部碎片,我們可以采用緊湊技術,通過將不同進程的內存空間挪挪位將不連續的內存空間湊在一起。為了實現這種技術我們應該是用動態重定位的裝入方式,每次緊湊之后都將進程的起始地址都放在基址寄存器(重定位寄存器)中。

動態分區分配算法

首次適應算法

每次從低地址開始查找,找到第一個能夠滿足大小的空閑分區
實現:空閑分區以地址遞增的次序排列。每次分配內存時順序查找空閑分區表(鏈),找到第一個滿足的空閑分區。

最佳適應算法

盡可能留下大片的空閑區,優先使用更小的空閑區
實現:空閑分區按照容量遞增的次序鏈接,每次分配內存時找到第一個滿足的空閑分區。每次分配以后還需要對空閑分區排序使其按照容量大小遞增。

缺點:每次采用最小的分區選擇,會產生很多外部碎片

最壞適應算法

每次分配優先使用最大的連續空閑區,這樣每次分配以后空閑區就不會太小。
實現:空閑分區按照容量遞減鏈接。每次分配使用第一個空閑分區(如果第一個都不滿足就GG了)然后對空閑分區進行排序

缺點:如果大進程到達就會導致沒有空間使用

鄰近適應算法

首次適應算法每次從開始查找導致開始部分出現很多外部碎片。為了解決這個問題,每次從上次查找結束的位置開始檢索。
實現:空閑分區以地址遞增的順序排列成循環鏈表。每次內存分配從上次查找結束的位置開始查找。同首次適應算法一樣每次分配以后不需要對鏈表重新排列。

首次適用算法雖然容易產生外部碎片,但是可能保留大分區。鄰近適應算法雖然減少產生外部碎片,但是可能沒有外部碎片。

在這里插入圖片描述
綜合來看首次適應算法還是比較優秀的。

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

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

相關文章

MSG_PEEK標志

https://blog.csdn.net/aspnet_lyc/article/details/28937229 MSG_PEEK標志可以用來讀取套接字接收隊列中可讀的數據,一些情況會用到它,比如為了避免不阻塞而先檢查套接字接收隊列中可讀的數據長度,再采取相應操作。當然,不阻塞也…

快速排序詳解+各種實現方式

快速排序的思想大體來說比較簡單,就是從數組中挑選一個數字當做樞紐,然后將比樞紐大的和比樞紐小的分別放在樞紐的兩邊,再遞歸地對兩邊進行操作,從而進行分治解決問題。平均情況下快速排序是復雜度為O(nlogn)O(nlogn)O(nlogn)&…

C++的單例模式與線程安全單例模式(懶漢/餓漢)

https://www.cnblogs.com/qiaoconglovelife/p/5851163.html1 教科書里的單例模式我們都很清楚一個簡單的單例模式該怎樣去實現:構造函數聲明為private或protect防止被外部函數實例化,內部保存一個private static的類指針保存唯一的實例,實例的…

計算矩陣的逆和行列式的值(高斯消元+LU分解)

計算矩陣的逆 選主元的高斯消元法 樸素的高斯消元法是將矩陣A和單位矩陣放在一起,通過行操作(或者列操作)將A變為單位矩陣,這個時候單位矩陣就是矩陣A的逆矩陣。從上到下將A變為上三角矩陣的復雜度為O(n3n^3n3),再從下…

Linux網絡編程——tcp并發服務器(epoll實現)

https://blog.csdn.net/lianghe_work/article/details/46551871通過epoll實現tcp并發回執服務器&#xff08;客戶端給服務器發啥&#xff0c;服務器就給客戶端回啥&#xff09; 代碼如下&#xff1a;#include <string.h>#include <stdio.h>#include <stdlib.h&g…

證明AVL樹的上界和下界

對于n個節點的AVL樹&#xff0c;其高度最低的時候肯定為葉子節點只在最后一層和倒數第二層的時候。即對于2k?1<n≦2k1?12^k-1< n\leqq 2^{k1}-12k?1<n≦2k1?1的時候下界都為kkk。因此下界為h┌log2(n1)┐?1h\ulcorner log_2(n1)\urcorner-1h┌log2?(n1)┐?1 對…

淺談dup和dup2的用法

https://blog.csdn.net/u012058778/article/details/78705536一、dup和dup2函數 這兩個函數都可以來復制一個現有的文件描述符&#xff0c;他們的聲明如下&#xff1a;#include <unistd.h>int dup(int fd);int dup2(int fd, int fd 2); 123 關于dup函數&#xff0c;當我…

C++ cin 實現循環讀入

習慣了使用while(~scanf("%d",x)){}來實現循環讀入&#xff0c;但是有時候使用泛型編程的時候就必須使用C中的cin&#xff0c;但是當我想要實現循環讀入的時候卻發現有些困難。 我們可以看一下下面這個簡單的例子&#xff1a; #include <iostream>using name…

BFPTR算法詳解+實現+復雜度證明

BFPTR算法是由Blum、Floyed、Pratt、Tarjan、Rivest這五位牛人一起提出來的&#xff0c;其特點在于可以以最壞復雜度為O(n)O(n)O(n)地求解top?ktop-ktop?k問題。所謂top?ktop-ktop?k問題就是從一個序列中求解其第k大的問題。 top?ktop-ktop?k問題有許多解決方法&#xff…

C++子類對象隱藏了父類的同名成員函數(隱藏篇)

https://blog.csdn.net/alpha_love/article/details/75222175#include <iostream>#include <stdlib.h>#include <string>using namespace std;/*** 定義人類: Person* 數據成員: m_strName* 成員函數: attack()*/class Person{public:Person(){cout<<&…

隨機化快速排序+快速選擇 復雜度證明+運行測試

對于快速排序和快速選擇我之前的文章已經有詳細的說明&#xff0c;需要了解的同學可以移步 傳送門&#xff1a;快速排序&#xff5c;快速選擇(BFPTR) 所謂隨機化其實就是選擇樞紐的時候使用隨機數選擇而已&#xff0c;實現起來很簡單。但是我們使用隨機數如何保證復雜度呢&am…

C++子類父類成員函數的覆蓋和隱藏實例詳解

https://www.jb51.net/article/117380.htm函數的覆蓋覆蓋發生的條件&#xff1a; &#xff08;1&#xff09; 基類必須是虛函數&#xff08;使用virtual 關鍵字來進行聲明&#xff09; &#xff08;2&#xff09;發生覆蓋的兩個函數分別位于派生類和基類 &#xff08;3&#xf…

【Linux基礎】Linux的5種IO模型詳解

引入 為了更好的理解5種IO模型的區別&#xff0c;在介紹IO模型之前&#xff0c;我先介紹幾個概念 1.進程的切換 &#xff08;1&#xff09;定義 為了控制進程的執行&#xff0c;內核必須有能力掛起正在CPU上運行的進程&#xff0c;并恢復以前掛起的某個進程的執行。即從用戶…

計算機網絡【五】廣播通信+以太網

局域網的拓撲 廣域網使用點到點通信 局域網使用廣播通信 可以隨意向網絡中添加設備。 總線網星形網&#xff0c;使用集線器。現在多使用星形網絡。環狀網樹形網 其中匹配電阻用來吸收總線上傳播的信號。 共享通信媒體 靜態劃分信道 頻分復用、時分復用、波分復用、碼分復用…

聊聊Linux 五種IO模型

一篇《聊聊同步、異步、阻塞與非阻塞》已經通俗的講解了&#xff0c;要理解同步、異步、阻塞與非阻塞重要的兩個概念點了&#xff0c;沒有看過的&#xff0c;建議先看這篇博文理解這兩個概念點。在認知上&#xff0c;建立統一的模型。這樣&#xff0c;大家在繼續看本篇時&#…

操作系統【四】分頁存儲管理

連續分配方式的缺點&#xff1a; 固定分區分配&#xff1a;缺乏靈活性&#xff0c;產生大量的內部碎片&#xff0c;內存的利用率較低 動態分區分配&#xff1a;會產生許多外部碎片&#xff0c;雖然可以用緊湊技術處理&#xff0c;但是緊湊技術的時間代價較高 基本分頁存儲管理…

聊聊同步、異步、阻塞與非阻塞

近來遇到了一些常見的概念&#xff0c;尤其是網絡編程方面的概念&#xff0c;如&#xff1a;阻塞、非阻塞、異步I/O等等&#xff0c;對于這些概念自己也沒有太清晰的認識&#xff0c;只是很模糊的概念&#xff0c;說了解吧也了解&#xff0c;但是要讓自己準確的描述概念方面的具…

操作系統【五】分段內存管理+段頁式內存管理

基本分段存儲管理 與分頁最大的區別&#xff1a;離散分配時所分配地址空間的基本單位不同 進程的地址空間&#xff1a;按照程序自身的邏輯關系劃分為若干個段&#xff0c;每個段都有一個段名&#xff0c;每段從0開始編址 內存分配規則&#xff1a;以段位單位進行分配&#xff…

計算機網絡【六】網絡層協議

網絡層負責在不同網絡之間盡力轉發數據包&#xff08;基于數據包的IP地址轉發&#xff09;。不負責丟失重傳&#xff0c;也不負責順序&#xff08;每一個數據包都是單獨選擇路徑&#xff09;。 可靠傳輸是由傳輸層實現。 網絡設備和OSI參考模型 通過分層&#xff0c;屏蔽了…

epoll 水平觸發與邊緣觸發

https://blog.csdn.net/lihao21/article/details/67631516?refmyread epoll也是實現I/O多路復用的一種方法&#xff0c;為了深入了解epoll的原理&#xff0c;我們先來看下epoll水平觸發&#xff08;level trigger&#xff0c;LT&#xff0c;LT為epoll的默認工作模式&#xff…