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

基本分段存儲管理

與分頁最大的區別:離散分配時所分配地址空間的基本單位不同
進程的地址空間:按照程序自身的邏輯關系劃分為若干個段,每個段都有一個段名,每段從0開始編址
內存分配規則:以段位單位進行分配,每個段再內存中占連續空間,但各段之間可以不相鄰。由于時按照邏輯功能劃分,用戶編程更方便,程序可讀性更高。

編譯程序會將段名轉換為段號

分段系統的邏輯地址由段號和段內地址(段內偏移量)組成

段號的位數決定了每個進程最多可以分多少個段,段內地址位數決定了每個段的最大長度是多少

段表:記錄各個邏輯段在內存中存放的地址
每個段表由三部分組成:段號+段長+基址
段號可以隱藏,假設段號16位,段內地址16位,32位操作系統,按字節尋址,則每個段表項的長度為16+32=6B。如果段表存放的起始地址為M,則第k號段的地址為M+6*k

段表寄存器:存放在PCB中,當進程將要運行的時候會恢復。保存段表始址F和段表長度M

  1. 根據邏輯地址得到段號S、段內地址W
  2. 比較段號和段表長度,如果超過產生越界中斷
  3. 查詢段號對應的段表項:F+S*段表項長度得到段基址b
  4. 檢查段內地址W和段長C,如果超過產生越界中斷(與分頁管理不同)
  5. 根據段基址b+段內地址W

分段、分頁管理的對比:

  • 頁是信息的物理單位,分頁的主要目的是為了離散分配,提高內存利用率。分頁僅僅是系統管理上的需要,完全是系統行為對用戶是不可見的
  • 段是信息的邏輯單位,分段的主要目的是為了更好地滿足用戶需求,一個段同行包含著一組數以億個邏輯模塊的信息,分段對用戶是可見的,用戶編程時需要顯式地給出段名
  • 頁的大小固定且由系統決定,段的長度不固定,決定于用戶編寫的程序
  • 分頁的用戶進程地址空間是一維的,程序員只需要給出一個記憶符就可以表示一個地址
  • 分段的用戶進程地址空間是二維的,程序員在標識一個地址時,既要給出段名,又要給出段內地址。
  • 分段比分頁更容易實現信息的共享和保護。不能被修改的代碼稱為純代碼或可重入代碼(不屬于臨界資源 ),這樣的代碼是可以共享的。可修改的代碼是不能共享的(比如一個代碼段中有很多變量,各個進程并發地同時訪問可能造成數據的不一致)。頁面因為不是按照邏輯模塊劃分的,這就很難實現共享。
  • 分頁(普通)需要兩次訪存,分段也需要兩次訪存。分段存儲同樣也可以引入快表機構

段頁式管理

在這里插入圖片描述分段管理產生外部碎片的原理和動態內存管理產生外部碎片的原理相同,因此同樣也可以通過緊湊技術,但是緊湊技術需要較大的時間代價。

將進程按邏輯模塊分段,再將各段分頁
段頁式系統的邏輯地址:段號、頁號、頁內地址(頁內偏移量)組成
在這里插入圖片描述
段號的位數決定了每個進程最多可以分幾個段
頁號位數決定了每個段最大有多少頁
頁內偏移量決定了頁面大小、內存塊大小

分段對用戶是可見的,程序員編程時需要顯式地給出段號、段內地址。而將各段分頁對用戶是不可見的。系統會根據段內地址自動劃分頁號和頁內偏移量。因此段頁式管理的地址結構是二維的

每一個段對應一個段表項,每個段表項由段號頁表長度頁表存放塊號(即就是頁表起始地址)組成。每個段表項長度相等,段號是隱藏的。相當于每一個段表項都是一個PTR(頁表寄存器)

這里的段表不同于分段管理中的段表(段號(隱藏)+段長度+段基址)

每一個頁面對應一個頁表項,每個頁表項由頁號、頁面存放的內存塊號組成(頁號隱藏)

在這里插入圖片描述

邏輯地址轉換為物理地址

PCB中包含段表寄存器:段表始址F + 段表長度M

  1. 根據邏輯地址得到段號S,頁號P,頁內偏移量W
  2. 判斷段號是否合法,若S>=M則產生越界中斷
  3. 查詢段表,找到對應的段表項,段表項存放地址為F+S*段表項長度
  4. 判斷頁表長度和頁號,如果頁號>=頁表長度則產生越界中斷
  5. 查詢頁表項=頁表起始地址+頁號*頁表項長度
  6. 根據頁表項得到的內存塊號*內存大小+頁內偏移量W得到物理地址

三次訪存:訪問段表->訪問頁表->訪問物理地址

可以引入段表機制,用段號和頁號作為查詢的關鍵字,則只需要一次訪存

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

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

相關文章

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

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

epoll 水平觸發與邊緣觸發

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

計算機網絡【3】網絡層

主要任務時把分組從源端發送到目的端,為分組交換網上的不同主機提供服務。網絡層傳輸單位是數據報 功能: 路由選擇與分組轉發(最佳路徑 )異構網絡互聯擁塞控制 數據交換方式 電路交換:通信時延小、有序傳輸、沒有沖…

C++空類的大小

https://blog.csdn.net/lihao21/article/details/47973609 本文中所說是C的空類是指這個類不帶任何數據,即類中沒有非靜態(non-static)數據成員變量,沒有虛函數(virtual function),也沒有虛基類(virtual base class)。 直觀地看&#xff0c…

Linux探秘之用戶態與內核態

https://www.cnblogs.com/bakari/p/5520860.html 一、 Unix/Linux的體系架構 如上圖所示,從宏觀上來看,Linux操作系統的體系架構分為用戶態和內核態(或者用戶空間和內核)。內核從本質上看是一種軟件——控制計算機的硬件資源&…

哈夫曼算法證明+哈夫曼編碼譯碼程序實現

哈夫曼算法證明 哈夫曼算法是一種貪心算法,我們考慮證明其最優子結構和貪心選擇性質: 最優子結構:假設一個樹是哈夫曼樹,則以其任意節點為根節點的最大子樹也是哈夫曼樹。 證明:子樹的根節點的值是其所有葉子節點出現…

Python3小知識

對于迭代器對象,Python默認賦值是將引用賦值,即指向同一片內存空間。為了實現對內存空間的賦值,我們可以使用分片進行深復制。例如: 當定義元組的時候,我們一般使用小括號將元素包圍起來,也可以不使用括號…

匯編:實現日歷星期數查詢工具

編制一個簡單日歷查詢工具,輸入年、月、日,能夠判斷當日的星期數,并進行輸出,數據的輸入和結果的輸出要有必要的提示,且提示獨占一行。 查閱資料 ? 經過查閱資料,發現有兩個相關的算法可以解決這個問題&…

一個通用純C隊列的實現

https://blog.csdn.net/kxcfzyk/article/details/31728179 隊列并不是很復雜的數據結構,但是非常實用,這里實現一個隊列是因為在我的另一篇博客非常精簡的Linux線程池實現中要用到。 隊列API定義如下: //queue.h #ifndef QUEUE_H_INCLUDED…

Dijkstra算法介紹+正確性證明+性能分析

算法介紹 源點s,數組d[u]表示s到u的最短距離,空集S,點集Q初始化:將源點s從點集中去掉,加入S,d[s]0,?v∈Q,d[v]w[s][v]\forall v\in Q ,d[v]w[s][v]?v∈Q,d[v]w[s][v]將Q中d[v]最小的點去掉加入S,并對u∈…

Linux C 實現一個簡單的線程池

https://www.cnblogs.com/GyForever1004/p/9185240.html 線程池的定義 線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級…

斐波那契數列求解+尾遞歸

1.普通遞歸 這里觀察f[4]的遞歸樹代替f[10]的遞歸樹(后者比較大,畫不下)。 使用遞歸求解的時候復雜度為T(n)T(n?1)T(n?2)T(n)T(n-1)T(n-2)T(n)T(n?1)T(n?2),觀察遞歸樹,發現降速最快的是最右邊每次減2&#xff0c…

循環服務器,并發服務器模型以及I/O多路轉接模型

https://blog.csdn.net/xinianbuxiu/article/details/53455784 一、基于TCP/IP協議的基本循環服務器 tcp_server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #incl…

c++繼承父類的子類,如何調用父類的同名函數?

https://blog.csdn.net/qq_26399665/article/details/52080215 子類調用父類的同名函數&#xff1a; 子類和父類返回值參數相同&#xff0c;函數名相同&#xff0c;有virtual關鍵字&#xff0c;則由對象的類型決定調用哪個函數。 子類和父類只要函數名相同&#xff0c;沒有vi…

LCS最長公共子串

問題介紹 LCS問題(longest common subsequence problem)指的是求解兩個字符串最長公共子序列問題。這里的子序列是可以不連續的。LCS問題廣泛地出現在計算生物學中&#xff08;DNA序列、系統生成樹等等&#xff09;。這里介紹如何解決LCS問題&#xff0c;以及算法的正確性證明…

將字符串中的空格用%20替換

如果不需要原地操作&#xff0c;則一遍遍歷&#xff0c;將非空串復制&#xff0c;遇到空格加上%20&#xff0c;如果需要原地操作&#xff0c;首先進行遍歷出空格的個數x,然后擴容2x,從后往前遍歷實現。如果非空格字符串比空格字符串多的多的時候而且字符串非常長的時候使用原地…

12步輕松搞定python裝飾器

http://python.jobbole.com/81683/ 呵呵&#xff01;作為一名教python的老師&#xff0c;我發現學生們基本上一開始很難搞定python的裝飾器&#xff0c;也許因為裝飾器確實很難懂。搞定裝飾器需要你了解一些函數式編程的概念&#xff0c;當然還有理解在python中定義和調用函數…

操作系統【六】虛擬內存

傳統存儲管理方式的不足 一次性&#xff1a;作業必須一次性全部裝入內存后才能開始運行。這會造成&#xff1a;當作也很大時不能全部裝入內存&#xff1b;當大量作業要求運行時&#xff0c;由于內存無法容納所有作業&#xff0c;因此只有少量作業能夠運行&#xff0c;導致多道…

python裝飾器詳解

https://blog.csdn.net/xiangxianghehe/article/details/77170585 你會Python嘛&#xff1f; 我會&#xff01; 那你給我講下Python裝飾器吧&#xff01; Python裝飾器啊&#xff1f;我沒用過哎 以上是我一個哥們面試時候發生的真實對白。 ———————————————-分…

SQL Server【一】簡介和基本概念和命令

數據結構和數據庫的區別 數據庫是應用軟件級別研究數據的存儲和操作&#xff08;主要針對磁盤上的數據&#xff09; 數據結構是在系統軟件級別研究數據的存儲和操作&#xff08;主要是針對內存中的數據&#xff09; 對硬盤數操作是數據庫的強項&#xff0c;是數據庫研究的核心…