1. 程式人生 > >作業系統之分頁分段介紹

作業系統之分頁分段介紹

原文:http://www.w2bc.com/Article/86892

一.虛擬記憶體的由來

1.問題提出:

     當直接讓程序使用直接的實體記憶體時,當對實體記憶體操作時會出現混亂。比如程序A裝在0-30的物理內層,在29處是一條ADD指令。而程序B裝在30-40處第一條指令為JMP 29.沒有使用虛擬記憶體的話,程序B將直接跳到程序A從而使兩者程式都破壞掉。

2.解決辦法:

    有兩種解決這個問題:一種通過基址暫存器和界線暫存器形成地址空間,通過交換技術解決記憶體超載。另外一種就是基於分頁的虛擬地址技術。

     1)交換技術:把一個程序完整調入記憶體執行一段時間,然後把他存回磁碟,空閒程序主要儲存在磁碟上。缺點:當程序空間大於記憶體時,不能使用。

     2)虛擬記憶體:把一個程序的一部分調入記憶體中執行,當記憶體沒有空閒空間時,將新的覆蓋舊的頁,同時將舊 是寫入磁碟。虛擬記憶體主要使用分頁儲存管理模式。

二.  分頁儲存管理

實際上儲存在實體記憶體上(磁碟上),執行時一頁一頁讀取;

1.基本思想

     使用者程式的地址空間被劃分成若干固定大小的區域,稱為“頁”,相應地,記憶體空間分成若干個物理塊,頁和塊的大小相等。可將使用者程式的任一頁放在記憶體的任一塊中,實現了離散分配。

1)      等分記憶體

    頁式儲存管理將記憶體空間劃分成等長的若干物理塊,成為物理頁面也成為物理塊,每個物理塊的大小一般取2的整數冪。記憶體的所有物理塊從0開始編號,稱作物理頁號。

2) 邏輯地址

     系統將程式的邏輯空間按照同樣大小也劃分成若干頁面,稱為邏輯頁面也稱為頁。程式的各個邏輯頁面從0開始依次編號,稱作邏輯頁號或相對頁號。每個頁面內從0開始編址,稱為頁內地址。程式中的邏輯地址由兩部分組成:頁號P和頁內位移量W。

在執行一個程式之前,記憶體管理器需要的準備工作:

1) 確定程式的頁數

2) 在主存中留出足夠的空閒頁面

3) 將程式的所有頁面載入主存裡。(靜態的分頁,頁面無需連續)

2. 分頁儲存管理的地址機構

    頁號x位,每個作業最多2的x次方頁,頁內位移量的位數表示頁的大小,若頁內位移量y位,則2的y次方,即頁的大小,頁內地址從000000000000開始到2的y次方

若給定一個邏輯地址為A,頁面大小為L,則

頁號P=INT[A/L],頁內地址W=A  MOD  L

3.記憶體分配

    相鄰的頁面在記憶體中不一定相鄰,即分配給程式的記憶體塊之間不一定連續。對程式地址空間的分頁是系統自動進行的,即對使用者是透明的。由於頁面尺寸為2的整數次冪,故相對地址中的高位部分即為頁號,低位部分為頁內地址。

4. 頁表

      分頁系統中,允許將程序的每一頁離散地儲存在記憶體的任一物理塊中,為了能在記憶體中找到每個頁面對應的物理塊,系統為每個程序建立一張頁表,用於記錄程序邏輯頁面與記憶體物理頁面之間的對應關係。頁表的作用是實現從頁號到物理塊號的地址對映,地址空間有多少頁,該頁表裡就登記多少行,且按邏輯頁的順序排列,形如:


5. 地址變換(MMu)

      頁式虛擬儲存系統的邏輯地址是由頁號和頁內地址兩部分組成,地址變換過程如圖7-3所示。假定頁面的大小為4K,圖7-3中所示的十進位制邏輯地址8203經過地址變換後,形成的實體地址a應為十進位制。              

頁號: 8203/4096 = 2;頁內偏移:8203%4096= 11;實體地址:物理塊號*頁面大小+ 頁內偏移= 28683。

6. 具有快表的地址變換機構

     分頁系統中,CPU每次要存取一個數據,都要兩次訪問記憶體(訪問頁表、訪問實際實體地址)。為提高地址變換速度,增設一個具有並行查詢能力的特殊高速緩衝儲存器,稱為“聯想儲存器”或“快表”,存放當前訪問的頁表項。

7.頁面的共享與保護

    當多個不同程序中需要有相同頁面資訊時,可以在主存中只保留一個副本,只要讓這些程序各自的有關項中指向記憶體同一塊號即可。同時在頁表中設定相應的“存取許可權”,對不同程序的訪問許可權進行各種必要的限制。

8.頁面置換:

     當程序在實體記憶體中執行時,呼叫到不在實體記憶體中的虛擬頁面時,MMU注意到該頁面沒有被對映到實體記憶體,於是cpu陷入到作業系統,這個陷阱稱為缺頁中斷,作業系統找到一個很少使用的頁框且把他的內容寫入磁碟備份。隨後把需要訪問的虛擬頁面讀到剛才回收的頁框中,修改對映關係,然後重新啟動引起陷阱的指令。

主要的頁面置換演算法有:

三.分段儲存管理

1.基本思想

      頁面是主存物理空間中劃分出來的等長的固定區域。分頁方式的優點是頁長固定,因而便於構造頁表、易於管理,且不存在外碎片。但分頁方式的缺點是頁長與程式的邏輯大小不相關。例如,某個時刻一個子程式可能有一部分在主存中,另一部分則在輔存中。這不利於程式設計時的獨立性,並給換入換出處理、儲存保護和儲存共享等操作造成麻煩。

      另一種劃分可定址的儲存空間的方法稱為分段。段是按照程式的自然分界劃分的長度可以動態改變的區域。通常,程式設計師把子程式、運算元和常數等不同型別的資料劃分到不同的段中(寫c程式時會用到),並且每個程式可以有多個相同型別的段。

     段表本身也是一個段,可以存在輔存中,但一般是駐留在主存中。

將使用者程式地址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯資訊。儲存分配時,以段為單位,段與段在記憶體中可以不相鄰接,也實現了離散分配。

2. 分段地址結構

      作業的地址空間被劃分為若干個段,每個段定義了一組邏輯資訊。例程式段、資料段等。每個段都從0開始編址,並採用一段連續的地址空間。段的長度由相應的邏輯資訊組的長度決定,因而各段長度不等。整個作業的地址空間是二維的。

       在段式虛擬儲存系統中,虛擬地址由段號和段內地址組成,虛擬地址到實存地址的變換通過段表來實現。每???程式設定一個段表,段表的每一個表項對應一個段,每個表項至少包括三個欄位:有效位(指明該段是否已經調入主存)、段起址(該段在實存中的首地址)和段長(記錄該段的實際長度)。

3. 地址變換

      針對每一個虛擬地址,儲存管理部件首先以段號S為索引訪問段表的第S個表項。若該表項的有效位為1,則將虛擬地址的段內地址D與該表項的段長欄位比較;若段內地址較大則說明地址越界,將產生地址越界中斷;否則,將該表項的段起址與段內地址相加,求得主存實地址並訪存。如果該表項的有效位為0,則產生缺頁中斷,從輔存中調入該頁,並修改段表。段式虛擬儲存器虛實地址變換過程如圖所示。


絕對地址=根據段號找到段表中的起始地址+段內地址 (如果段內地址超過限長則產生“地址越界”程式性中斷事件達到儲存保護)

4. 分段儲存方式的優缺點

     分頁對程式設計師而言是不可見的,而分段通常對程式設計師而言是可見的,因而分段為組織程式和資料提供了方便。與頁式虛擬儲存器相比,段式虛擬儲存器有許多優點:

(1)    段的邏輯獨立性使其易於編譯、管理、修改和保護,也便於多道程式共享。

(2)    段長可以根據需要動態改變,允許自由排程,以便有效利用主存空間。

(3)    方便程式設計,分段共享,分段保護,動態連結,動態增長

 因為段的長度不固定,段式虛擬儲存器也有一些缺點:

(1)    主存空間分配比較麻煩。

(2)    容易在段間留下許多碎片,造成儲存空間利用率降低。

(3)    由於段長不一定是2的整數次冪,因而不能簡單地像分頁方式那樣用虛擬地址和實存地址的最低若干二進位制位作為段內地址,並與段號進行直接拼接,必須用加法操作通過段起址與段內地址的求和運算得到實體地址。因此,段式儲存管理比頁式儲存管理方式需要更多的硬體支援。

四.段頁式儲存

1.  段頁式儲存管理的基本思想

   段頁式儲存組織是分段式和分頁式結合的儲存組織方法,這樣可充分利用分段管理和分頁管理的優點。

   (1) 用分段方法來分配和管理虛擬儲存器。程式的地址空間按邏輯單位分成基本獨立的段,而每一段有自己的段名,再把每段分成固定大小的若干頁。

     (2) 用分頁方法來分配和管理實存。即把整個主存分成與上述頁大小相等的儲存塊,可裝入作業的任何一頁。程式對記憶體的調入或調出是按頁進行的。但它又可按段實現共享和保護。

                            地址空間圖

      (3)    邏輯地址結構。一個邏輯地址用三個引數表示:段號S;頁號P;頁內地址d。

                         邏輯地址結構

 (4)段表、頁表、段表地址暫存器。為了進行地址轉換,系統為每個作業建立一個段表,並且要為該作業段表中的每一個段建立一個頁表。系統中有一個段表地址暫存器來指出作業的段表起始地址和段表長度。

2.地址變換過程

   一個邏輯地址為:基地址x、段號s、頁號p和頁內地址d,求實體地址:(((x)+s)+p)*2^(11)+d

                                   

                                               

在段頁式系統中,為了便於實現地址變換,須配置一個段表暫存器,其中存放段表始址和段表長TL。

    1) 進行地址變換時,首先利用段號S,將它與段表長TL進行比較。若S<TL,表示未越界

   2) 於是利用段表始址和段號來求出該段所對應的段表項在段表中的位置,從中得到該段的頁表始址

   3) 利用邏輯地址中的段內頁號P來獲得對應頁的頁表項位置,從中讀出該頁所在的物理塊號b

   4) 再利用塊號b和頁內地址來構成實體地址

       上圖示出了段頁式系統中的地址變換機構。在段頁式系統中,為了獲得一條指令或資料,須三次訪問記憶體。第一次訪問是訪問記憶體中的段表,從中取得頁表始址;第二次訪問是訪問記憶體中的頁表,從中取出該頁所在的物理塊號,並將該塊號與頁內地址一起形成指令或資料的實體地址;第三次訪問才是真正從第二次訪問所得的地址中,取出指令或資料。

顯然,這使訪問記憶體的次數增加了近兩倍。為了提高執行速度,在地址變換機構中增設一個高速緩衝暫存器。每次訪問它時,都須同時利用段號和頁號去檢索快取記憶體,若找到匹配的表項,便可從中得到相應頁的物理塊號,用來與頁內地址一起形成實體地址;若未找到匹配表項,則仍須再三次訪問記憶體。

3.段頁式儲存管理的優缺點

 優點

   (1) 它提供了大量的虛擬儲存空間。

   (2) 能有效地利用主存,為組織多道程式執行提供了方便。

缺點:

   (1) 增加了硬體成本、系統的複雜性和管理上的開消。

   (2) 存在著系統發生抖動的危險。

   (3) 存在著內碎片。

   (4) 還有各種表格要佔用主存空間。

 段頁式儲存管理技術對當前的大、中型計算機系統來說,算是最通用、最靈活的一種方案。


Segmentation,分段記憶體管理方案

採用分頁記憶體管理有一個不可避免的問題:使用者視角的記憶體和實際記憶體的分離。設想一段main函式程式碼,裡面包含Sqrt函式的呼叫。按照編寫者的理解,這段程式碼執行時,作業系統應該分配記憶體給:符號表(編譯時使用),棧(存放區域性變數與函式引數值),Sqrt程式碼段,主函式程式碼段等。這樣,編寫者就可以方便地指出:"函式sqrt記憶體模組的第五條指令",來定位一個元素。而實際上,由於採用Paging的管理方式,所有的一切都只是散落在實體記憶體中的各個幀上,並不是以編寫者的理解來劃分模組。

Segmentation的記憶體管理方式可以支援這種思路。邏輯地址空間由一組段組成。每個段都有名字和長度。地址指定了段名稱和段內偏移。因此使用者通過兩個量來指定地址:段名稱和偏移。段是編號的,通過段號而非段名稱來引用。因此邏輯地址由有序對構成:

 <segment-number,offset>(<段號s, 段內偏移d>)

段偏移d因該在0和段界限之間,如果合法,那麼就與基地址相加而得到所需位元組在實體記憶體中的地址。因此段表是一組基地址和界限暫存器對。

例如下圖,有5個段,編號0~4,例如段2為400B開始於位置4300,對段2第53位元組的引用對映成位置4300+53=4353。而段0位元組1222的引用則會觸發地址錯誤,因為該段的僅為1000B長(界限為1000)。

參考:http://www.cnblogs.com/felixfang/p/3420462.html

相關推薦

作業系統分段介紹

原文:http://www.w2bc.com/Article/86892 一.虛擬記憶體的由來 1.問題提出:      當直接讓程序使用直接的實體記憶體時,當對實體記憶體操作時會出現混亂。比如程序A裝在0-30的物理內層,在29處是一條ADD指令。而程序B裝在

操作系統筆記(十)內存管理分段和段

分段式內存管理 筆記 關系 代碼 保護 系統 長度 段頁式內存管理 bit 基本內存管理: 進程占用空間必須連續,導致外部碎片以及附加的compaction 整個進程的swap in 和 swap out十分耗時。 解決:分頁 ->內存空間不必連續,無外部碎片,

Linux內存尋址機制

緩存 itl ans linux 存儲器 apt target tar linux中 http://blog.xiaohansong.com/2015/10/05/Linux內存尋址之分頁機制/ 在上一篇文章Linux內存尋址之分段機制中,我們了解邏輯地址通過分段機制轉換為

day18-2-django和session

特征 request 客戶 .site none func pytho 控制 render Django-4 知識預覽 分頁器(paginator) COOKIE 與 SESSION 回到頂部 分頁器(paginator) 分頁器的使用 >>

Java EE器設計

net ons 下午 概念 div details mit 產生 log 由於數據庫實訓的課程設計,在做項目過程中,需要使項目更加規範的結構和各層間責任分離。無疑地,分頁器是其中之一。 1. 本文僅陳述分頁器如何實現,關於分頁器的其他概念,請自行搜索其他網絡資源。 2. 關

MyBatis精通功能的實現

avi 一個 冗余 details 結果 nature ann email ret MyBatis精通之路之分頁功能的實現(數組分頁、sql分頁、攔截器,RowBounds分頁) 原創 2017年04月27日 21:34:48 標簽: mybatis / java /

ssm整合bootstrap

java ssm pageHelper 分頁 bootstrap 分頁是我們經常會碰到的需求之一,今天我們就使用企業中很常用的mybatis分頁插件pageHelper來給大家做一個ssm整合bootstrap分頁的案例先看效果圖:一:建立數據庫student:學生表student年級表g

python-django rest framework框架

link 自己實現 -i man model 三種 imp *** efault 1. 以前django做的分頁組件當數據量特別大的時候,性能不是很高,有以下三種方式處理: a. 記錄當前訪問頁的最後一條數據id,往後取多少條 b. 最多顯示1

Django

Django 分頁一、Django的分頁器(paginator)1、批量導入數據book_list = [] for i in range(100): book_obj = Book(title="Book_%s" % i, price=i * i) book_list.

MySQL(十)DQL查詢

-c lar jpg not 列表 img IE class HERE 一、應用場景 當要查詢的條目數太多,一頁顯示不全 二、語法 select 查詢列表 from 表 limit 【offset,】size; 2.1、註意: ffset代表的是起始的條目索引,默認從0卡死

Springboot整合Mybatis 插件使用

-- 插件 pri git AS set PE AC 一次 1: 引入jar包 <!-- 引入MyBatis分頁插件--> <dependency> <groupId>com.github.pagehelper</group

MongoDB動態條件查詢

實體類 其他 integer att 字符串匹配 uil .class bsp ddc 一、使用QueryByExampleExecutor 1. 繼承MongoRepository public interface StudentRepository extends M

handlebars

是否 ole for body false gate != console form html代碼<!DOCTYPE html><html> Handlebars

django視圖

false 對象 內容 數據 next 分類信息 war 類信息 anon 在網站開發時,肯定會遇到分頁的事情需要處理,在django中也是如此,在Django中處理分頁一般會使用到兩個類django.core.paginator.Paginator和django.core

mysql 查詢

alt mysq style 我只 rom font 分頁 插入 com 分頁查詢(limit 起始行,查詢幾行) 如果 我只想插入 第一第二行的數據 該怎麽做那 select from student limit 0,2; 分頁查詢當前頁數的數據 select *

sql區域分段統計

行政 行政區 轉載 一個表 需求 inf color clas lec sql之分區域分段統計 需求:在一個表中,有兩列分別標記行政區劃代碼和家庭成員人數,需要得到不同鄉鎮的家庭成員人數在1-2人,3-4人,5-6人,6人以上的家庭數的表格 思路: 用case whe

Django升級版

多少 lse django 顯示 max deepcopy property str ini 如果查詢出的數據,被分頁了,這個時候翻頁的時候應該講頁數的參數和查詢的參數一塊在URL上顯示 """ 分頁器 """ from django.utils.safestrin

Spring Data JPA 查詢

JPA的分頁查詢確實使用起來確實很簡單,但理解起來有點困難,此處只是實現JPA分頁的程式碼塊。 定義實體類: @Entity @Table(name = "t_pub_info") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_REA

技術原理與實現的意義及方法(一)

轉載自https://www.jb51.net/article/86326.htm。 什麼是分頁技術  分頁,是一種將所有資料分段展示給使用者的技術.使用者每次看到的不是全部資料,而是其中的一部分,如果在其中沒有找到自習自己想要的內容,使用者可以通過制定頁碼或是翻頁的方式轉換可見內容,

spring boot外掛PageHepler

一.使用原生的PageHepler 1.新增依賴 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</arti