操作系統3-內存管理(分區存儲和頁式存儲)

操作系統3-內存管理(分區存儲和頁式存儲)

2. 分區存儲管理方式

分區管理的基本思想是:將內存空間氛圍一個或若干個連續的區域,稱為分區。每個分區可以存放一個獨立的用戶程序。分區的特點是一個程序可以連續地加載內存。

分區可以分為:單一分區、固定分區、可變分區和重定位分區。

2.1 單道程序的連續分配

單道程序的連續分配方式將內存分為系統區和用戶區,只能用於單用戶、單任務的操作系統。

  1. 系統區

    系統區僅供操作系統使用,一般駐留在內存的低地址區,其中包括中斷向量。中斷向量是操作系統的核心功能模塊加載內存的起始地址

  2. 用戶區

    操作系統所佔區域以外的全部內存空間,用戶區和系統區之間設立了嚴格的內存保護機制,防止用戶區的地址越界。

2.2 固定分區分配方式

系統在啟動時就劃分好多個分區,明確了分區的數量、大小和起始地址。這樣允許多道作業並發執行。但這樣也會使得部分分區的程序無法完全利用所有分區空間,也會導致部分程序因為佔用內存過大而無法裝入程序。因此會造成內存的浪費。

2.3 動態分區分配

動態分區根據進程的實際需要動態地分割內存。當進程運行完畢並釋放了其所佔用的空間時,如果這塊空間有相鄰的空閒的內存空間,則它們被合併為更大的空閒的內存空間。

動態分區需要解決的問題有:分區分配的數據結構、分區的分配算法、分區的分配與回收操作。

  1. 數據結構

    常用的數據結構有空閒分區表和空閒分區鏈。

    1. 空閒分區表結構為:

        1. 空閒分區說明表
      序號 分區大小(KB) 分區地址(K) 狀態
      1 64 44 可用
      2 24 132 可用
      3 30 210 可用
    2. 空閒分區鏈

      每個分區的起始部分設置一個用於控制分區分配的信息,以及用於鏈接各分區的前向指針,形成一個鏈錶。

  2. 分區分配算法

    新作業進入內存時,按照分配算法將空閒分區分配給作業。主要有以下四種分配算法。

    1. 首次符合法(First Fit)。每次分配空閒區時,總是從鏈首開始查詢,直到找到一個符合要求的空閒塊。
    2. 循環首次符合法(Next Fit)。在查詢內存空間時,不再從鏈首開始查,而是從上次分配內存的下一個空閒內存空間開始查詢。如果查到最後一個空間都不能滿足要求,指針應該又返回鏈首開始查詢,因為可能已經有其他作業釋放了足夠的內存空間。
    3. 最佳符合法(Best Fit)。要求所有空閒空間按照大小排序,請求內存的指針從最小的內存塊開始查,直到找到第一個符合請求空間大小的內存塊。
  3. 分區分配和回收
    1. 分配內存。設所請求分區的大小為u.size,分區表中內存的大小為m.size,若$m.size - u.size \leq size$,size是事先規定好的不再分割內存大小,如果空閒分區在被內存請求切割的大小小於這個size,則分區不再切割,將整個分區都分配給請求。否則從分區分割出一個和請求內存大小一致的內存,其餘內存仍留在空閒分區表或空閒分區鏈中。
    2. 回收內存。

      回收內存的主要工作是首先檢查是否有相鄰分區,有則合併使之成為一個連續的空閒區,避免形成許多離散的小分區。然後還要修改分區的有關控制信息。

2.4 可重定位分區

  1. 緊湊

    在連續分配方式中,必須把一個程序裝入連續的內存空間中,如果系統中存在若干個離散的小分區,每個分區都不能使程序裝入其中。但是這些分區的大小之和大於程序的請求內存。這時可以通過重定位的方式將分隔這些分區的作業移動到一起,使得原來離散的小分區可以拼接成一個大分區。這種方式稱為“緊湊”。

  2. 動態重定位

    要想在動態重定位中將程序中的相對地址轉換為物理地址的工作推遲到程序指令進行時進行,需要得到硬件地址變換機構的支持。即在系統中加入一個重定位寄存器,用來裝入程序在內存中的起始地址。程序執行時,訪問的地址是由重定位寄存器的物理起始地址加上程序中的邏輯地址得到的。因此當需要移動程序佔用的內存地址時,只需要修改重定位寄存器中的地址就可以做到了,而不需要修改程序。

  3. 可重定位分區的分配與動態重定位分區的分配方式基本相同,只不過加入了“緊湊”的功能,使得離散的小分區內存空間得到了利用。

3. 頁式存儲管理

3.1 分頁存儲的思想

不同於前面的連續分配的思想,分頁存儲允許程序被分配在不連續的內存空間中。為了實現這種想法,在分頁存儲管理中,主存被分為一個個大小相等的物理塊,而程序的地址空間被分為一些邏輯頁面。邏輯頁與物理塊的內存大小相等,程序和數據以頁為單位分配內存塊,將一個邏輯頁分配到一個物理塊中。為了便於實現地址變換,往往將物理塊的大小定為$2^n$個扇區,如1KB、2KB。

3.2 頁式存儲管理的數據結構

  1. 頁面和物理塊

    頁面和物理塊的概念在上文已經有所介紹。在為進程分配內存時,以塊為單位將進程中的若干頁分配到不相接的塊中。每個邏輯頁和物理塊都有編號,邏輯頁號與物理塊號的對應關係,都已經記錄在了頁表中。頁表是每個進程都有一張的。

    頁面大小應適中,如果頁面過大,會造成頁內碎片過大。若是太小,則會造成頁表太大,佔用大量內存。

  2. 虛地址結構

    頁式存儲的虛地址結構包含頁號P頁內偏移量W。若給定一個邏輯空間的地址A,頁面的大小為L。則P和W的計算方式為:

    \(P = (int) [A/L]\)

    \(W = A \mod L\)

3.3 頁式存儲管理的重定位方式

為了將用戶地址空間的邏輯地址變換為物理地址,需要設置地址變換機構。由於邏輯頁與物理塊的大小相等,所以邏輯頁內地址與物理頁內地址是一一對應的。所以重定位的主要任務是將邏輯頁的頁號轉換為內存中的物理塊號。這個工作是藉助頁表來實現的。

頁表的功能由寄存器來實現,由於寄存器的空間有限,頁表的數量又很多,因此將整個頁表放入寄存器不太現實。現在通常是將頁表放置在內存中,只將設置一個頁表寄存器用來存放頁表的起始地址和長度。且這兩個數據並不是一直待在頁表寄存器中。進程並未執行時,這兩個數據存放在進程的PCB中,只有當調度到這個進程時,才將這兩個數據放入頁表寄存器中。

graph TD
A[邏輯地址A] --> |計算| B[頁內地址W]
A --> |計算| C[邏輯頁號P]
C --> |頁表寄存器| D[頁表地址 頁表長度n]
D --> E{P>=n?}
E --> |No|F[查頁表]
E --> |Yes|G[越界中斷]
F --> H[物理塊號]
H --> |乘以塊大小|I[物理塊基地址]
I --> J(+)
B --> J
J --> K[物理地址]

3.4 快表

在上述變換過程中可知,要想取出一個數據或指令,至少需要兩次訪問內存,為了提高效率,減少內存的訪問次數,可以將頁表放在一個高速緩存存儲器中。

現在一般將正在運行進程的當前最常用的頁表放入快速存儲器中,存放這部分頁表內容的存儲器稱為相聯存儲器,也稱為聯想存儲器。這種存儲器還具有查找能力,如CPU給出的虛結構為(P,W),分頁機構將虛結構送入相聯存儲器,存儲器立即和所有的頁號進行比較,找到符合的塊號B。然後根據(B,W)訪問內存。

實際上在相聯存儲器查詢頁表的同時,系統也在主存的頁表中進程查詢,如果哪一邊查找到了,則立即停止另一邊的查詢。如果是在主存的頁表中查詢到的,則應把查得的頁號和塊號一並放入相聯存儲器的空閒單元中。若無空閒單元,則把最先裝入寄存器的那個頁號淘汰掉。

3.5 兩級和多級頁表

  1. 兩級頁表

    隨著頁表越來越大,越來越難以找到足夠的內存來存放頁表。因此產生了多級頁表的想法。可以將頁表分成多個頁面,每個頁面與內存物理塊的大小相等,並未它們編號。離散地分佈在不同的物理塊中。同時為這些離散的頁面建立一張外層頁表。根據外層頁表找到頁面的方式與根據頁表找到物理塊的方式相似。同樣需要在地址機構中設置一個外層頁表寄存器用於存放外層頁表的起始地址。

  2. 多級頁表

    隨著計算機位數的增加,頁表的大小會越來越大,導致需要的儲存空間越來越大。因此需要建立更多級的頁表。

原文地址:https://www.cnblogs.com/lunar-ubuntu/p/12259568.html

时间: 2025-01-10 05:33:50

操作系統3-內存管理(分區存儲和頁式存儲)的相关文章

操作系統3-內存管理(頁面置換算法)

操作系統3-內存管理(頁面置換算法) 7. 頁面置換算法 在上一節講過, 換入換出頁面要根據特定的算法來執行, 這種算法就是頁面置換算法. 不合適的算法可能會使系統發生抖動,所謂抖動即指剛剛換出的頁面又要換回來,換回來不久又要換出去,這樣就導致系統的大部分工作時間都花在了頁面調度上,導致效率不高. 下面是幾種常見的頁面置換算法: 7.1 先入先出頁面置換算法 顧名思義,根據隊列的數據結構的思想,總是將內存存在最久的頁面先換出. 7.2 最近最久未使用頁面置換算法(Least Recently U

操作系統3-處理機調度與死鎖(死鎖)

操作系統-處理機調度與死鎖3(死鎖) 7.死鎖問題 死鎖是指多個進程等待其它進程佔有的資源,因而無限期等待下去的局面. 系統發生死鎖時,一定具備以下四個條件: 互斥條件.對於一個排他性資源,某一時刻最多允許一個進程佔有. 佔有且申請條件.進程至少已佔有一個資源,又要申請新的資源.此時該進程阻塞,且在等待過程中不釋放已經佔有的資源. 不可搶佔條件.進程獲得的資源在未使用之前,其他進程不得搶佔該資源. 環路條件.若干個進程相互要佔有彼此的資源,形成一個環路. 8.死鎖的避免 要避免死鎖,分為靜態策略

用FineReport報表系統構建重慶江津區疾病預防控制信息系統

前言 一場自下而上的改革嘗試 這篇文章剛開始動筆的時候,恰逢剛接到衛生部專家即將來津對我區基本公共衛生服務以及一系中轉項目的工作現況.資金使用情況進行檢查的通知.誠然我區的工作現況不便在此進行評說,但是,做為迎檢的大頭戲――「國家基本公共衛生服務項目」 ――也是我國公共衛生制度建設的重要組成部分,卻一直以來都是困繞各級衛生行政部門和基層醫療機構老大難問題:各種讓人眼花潦亂的考核指標.紛繁複雜的業務流程,再加上沒有可以參考的工作模式以及各自為戰的軟體.平台,工作的開展難度和進展可見一斑. 雖然今年

如何讓Android系統顯示CJK擴展區漢字

由於一些特殊需要,需要在個人設備上顯示CJK擴展區漢字,經多方詢問並驗證,找到了一下辦法,暫總結如下. 一.電腦上顯示 在電腦(Windows,Linux,Mac等系統)上可以通過安裝「花園明朝字體」,讓電腦/PC顯示擴展區的漢字.八卦符號.麻將符號等.截止2015年8月,Unicode已經發展到了Unicode8.0,8.0版本收錄了80,388個漢字. 『1』.花園明朝字體:目前收錄97,745字. 『2』.CJK擴展區漢字:CJK統一表意文字/CJK Unified Ideographs/

操作系統-進程管理4(線程)

操作系统-进程管理(线程) 线程 线程的基本概念 线程是比进程更小的.能够独立运行的基本单位,线程比进程能更好地提高程序的并行执行速度,充分利用多处理机的优越性.引用线程主要是为了提高系统的处理效率,减少处理机的空转时间和进行调度时因保护CPU现场浪费的时间. 线程是进程中执行运算的最小单位,即执行处理机调度的基本单位.在引入线程的操作系统中,可以在一个进程内部进行线程的切换. 进程是资源分配的基本单位,同一进程的所有线程共享该进程的所有资源.线程是分配处理机的基本单位,真正在处理机上运行的是线

操作系統-進程管理2(進程的互斥與同步)

操作系统-进程管理2(进程的同步与互斥) 进程的同步与互斥 两个或两个以上的进程不能同时使用的资源称为临界资源.临界资源的存在带来了进程之间的互斥访问的问题. 进程互斥:逻辑上完全独立.毫无关系的两个进程因为竞争同一块资源而相互制约,称为进程互斥. 进程同步:有协作关系的进程不断调整它们之间的相对速度或执行过程,以保证临界资源的合理利用和进程的顺利执行.一般借由中间媒体实现:如信号量操作.加锁操作等.同步机制应遵循的规则: 空闲让进 忙则等待 有限等待:进程等待进入临界区的时间必须是有限的,避免

幾個步驟輕鬆在windows操作系統上搭建GO語言開發環境

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

使用 NIO.2 操作檔案系統

Java 一直到 JDK 1.3 為止,都是使用 java.io 下的類別進行 I/O 的處理,對這有興趣的鄉民,可以參考「Java I/O」,那是我 13 年前整理的 ... XD.JDK 1.4 之後提供了 NIO,到了 JDK 1.7 又加上些新的功能,稱為 NIO.2,這些類別都被放在 java.nio 下,一般來說,使用 java.nio 類別操作檔案系統,會比使用 java.io 效率來的高且方便. 在進入主題前,各位不妨先看一下我之前整理的「Working with the Pat

個人資料管理的網頁系統

需求: 第一階段. 動態生成網頁,此網頁中顯示當前目錄下的文件結構,並可以瀏覽文本文檔以及內建圖片. 第一階段. 建立新的文本文檔,並用富文本的方式,可標記某一段文字顏色以及添加圖片,可以加載其他更多的文件類型,如excel, word, rtf, pdf 操作流程: 用java程式執行dos語句,生成文件目錄資料.整理目錄資料成樹形結構(此檔案留做備份,比對新的目錄有無變化). 用java寫出網頁 ============================== 利用批處理生成網頁 @echo o