1. 程式人生 > >作業系統學習-18. 可重定位分割槽分配與對換

作業系統學習-18. 可重定位分割槽分配與對換

寫在前面

這一篇部落格與前一篇部落格內容連續,這一篇部落格主要討論可重定位分割槽分配與程序對換的相關知識,也是以理解概念為主要任務。多看幾遍,就能搞懂。

動態重定位的引入

在連續分配方式中,必須把一個系統或使用者程式裝入一連續的記憶體空間。如果在系統中只有若干個小的分割槽,即使它們容量的總和大於要裝入的程式,但由於這些分割槽不相鄰接,也無法把該程式裝入記憶體。

圖1. 緊湊的示意
這裡寫圖片描述

若想把作業裝入,可採用的一種方法是:將記憶體中的所有作業進行移動,使它們全都相鄰接,這樣,即可把原來分散的多個小分割槽拼接成一個大分割槽,這時就可把作業裝入該區。這種通過移動記憶體中作業的位置,以把原來多個分散的小分割槽拼接成一個大分割槽的方法,稱為“拼接”或“緊湊”,見上圖1。由於經過緊湊後的某些使用者程式在記憶體中的位置發生了變化,此時若不對程式和資料的地址加以修改(變換),則程式必將無法執行。為此,在每次“緊湊”後,都必須對移動了的程式或資料進行重定位。

動態重定位的實現

在動態執行時裝入的方式中,作業裝入記憶體後的所有地址都仍然是相對地址,將相對地址轉換為實體地址的工作,被推遲到程式指令要真正執行時進行。為使地址的轉換不會影響到指令的執行速度,必須有硬體地址變換機構的支援,即須在系統中增設一個重定位暫存器,用它來存放程式(資料)在記憶體中的起始地址。程式在執行時,真正訪問的記憶體地址是相對地址與重定位暫存器中的地址相加而形成的。圖2 示出了動態重定位的實現原理。

圖2. 動態重定位示意圖
這裡寫圖片描述

地址變換過程是在程式執行期間,隨著對每條指令或資料的訪問自動進行的,故稱為動態重定位。當系統對記憶體進行了“緊湊”而使若干程式從記憶體的某處移至另一處時,不需對程式做任何修改,只要用該程式在記憶體的新起始地址,去置換原來的起始地址即可。

動態重定位分割槽分配演算法

動態重定位分割槽分配演算法與動態分割槽分配演算法基本上相同,差別僅在於:在這種分配演算法中,增加了緊湊的功能,通常,在找不到足夠大的空閒分割槽來滿足使用者需求時進行緊湊。圖3 示出了動態重定位分割槽分配演算法。

圖3. 動態分割槽分配演算法流程圖
這裡寫圖片描述

對換(Swapping)

在多道程式環境下,一方面,在記憶體中的某些程序由於某事件尚未發生而被阻塞執行,但它卻佔用了大量的記憶體空間,甚至有時可能出現在記憶體中所有程序都被阻塞而迫使 CPU停止下來等待的情況;另一方面,卻又有著許多作業在外存上等待,因無記憶體而不能進入記憶體執行的情況。顯然這對系統資源是一種嚴重的浪費,且使系統吞吐量下降。

為了解決這一問題,在系統中又增設了對換(也稱交換)設施。所謂“對換”,是指把記憶體中暫時不能執行的程序或者暫時不用的程式和資料調出到外存上,以便騰出足夠的記憶體空間,再把已具備執行條件的程序或程序所需要的程式和資料調入記憶體。對換是提高記憶體利用率的有效措施。

如果對換是以整個程序為單位的,便稱之為“整體對換”或“程序對換”。這種對換被廣泛地應用於分時系統中,其目的是用來解決記憶體緊張問題,並可進一步提高記憶體的利用率。

如果對換是以“頁”或“段”為單位進行的,則分別稱之為“頁面對換”或“分段對換”,又統稱為“部分對換”。這種對換方法是實現後面要講到的請求分頁和請求分段式儲存管理的基礎,其目的是為了支援虛擬儲存系統。

為了實現程序對換,系統必須能實現三方面的功能:對換空間的管理、程序的換出,以及程序的換入。

對換空間的管理

在具有對換功能的 OS 中,通常把外存分為檔案區和對換區。前者用於存放檔案,後者用於存放從記憶體換出的程序。由於通常的檔案都是較長久地駐留在外存上,故對檔案區管理的主要目標,是提高檔案儲存空間的利用率,為此,對檔案區採取離散分配方式。然而,程序在對換區中駐留的時間是短暫的,對換操作又較頻繁,故對對換空間管理的主要目標,是提高程序換入和換出的速度。為此,採取的是連續分配方式,較少考慮外存中的碎片問題。

為了能對對換區中的空閒盤塊進行管理,在系統中應配置相應的資料結構,以記錄外存的使用情況。其形式與記憶體在動態分割槽分配方式中所用資料結構相似,即同樣可以用空閒分割槽表或空閒分割槽鏈。在空閒分割槽表中的每個表目中應包含兩項,即對換區的首址及其大小,分別用盤塊號和盤塊數表示。

由於對換分割槽的分配是採用連續分配方式,因而對換空間的分配與回收,與動態分割槽方式時的記憶體分配與回收方法雷同。其分配演算法可以是首次適應演算法、迴圈首次適應演算法或最佳適應演算法。

程序的換出與換入

(1) 程序的換出。每當一程序由於建立子程序而需要更多的記憶體空間,但又無足夠的記憶體空間等情況發生時,系統應將某程序換出。其過程是:系統首先選擇處於阻塞狀態且優先順序最低的程序作為換出程序,然後啟動磁碟,將該程序的程式和資料傳送到磁碟的對換區上。若傳送過程未出現錯誤,便可回收該程序所佔用的記憶體空間,並對該程序的程序控制塊做相應的修改。

(2) 程序的換入。系統應定時地檢視所有程序的狀態,從中找出“就緒”狀態但已換出的程序,將其中換出時間最久(換出到磁碟上)的程序作為換入程序,將之換入,直至已無可換入的程序或無可換出的程序為止。

相關推薦

作業系統學習-18. 定位分割槽分配

寫在前面 這一篇部落格與前一篇部落格內容連續,這一篇部落格主要討論可重定位分割槽分配與程序對換的相關知識,也是以理解概念為主要任務。多看幾遍,就能搞懂。 動態重定位的引入 在連續分配方式中,必須把一個系統或使用者程式裝入一連續的記憶體空間。如果在系統中

ELF(七)定位目標,部分摘自深入理解作業系統,深入理解linx核心

可重定位目標          重定位是將EFL檔案中的未定義符號關聯到有效值的處理過程。在main.o中,這意味著對printf和puts的未定義的引用必須替換為該程序的虛擬地址空間中適當的機器程式碼所在的地址。在目標中用到的相關符號之處,都必須替換。         

Scrapy學習-18-去原理

.py sort bsp url none ont digest set request Scrapy去重原理 scrapy本身自帶一個去重中間件   scrapy源碼中可以找到一個dupefilters.py去重器 源碼去重算法 # 將返回值放到集合set中

Keil的定位

--------------------------------------------- -- 時間:2018-11-25 -- 建立人:Ruo_Xiao -- 郵箱:[email protected] -- 原網址:http://blog.sina.com.cn/s/blog_5e44

【軟體開發底層知識修煉】九 連結器-定位檔案執行檔案

上幾篇文章學習了Binutils輔助工具裡面的幾個實用的工具,那些工具對於以後的學習都是非常有幫助的,尤其是C語、C++語言的學習以及除錯是非常有幫助的。點選連結檢視上一篇文章:點選檢視 本篇文章開始一個新的知識的學習,連結器的學習。學習完連結器的系列文章,我們將全面瞭解連結器的工作

作業系統學習筆記(一) 分割槽表、系統引導檔案系統

作為初學者,可能很難分清分割槽表和檔案系統之間的關係,畢竟在很多時候,磁碟分割槽操作都籠統的稱為“分割槽”,而檔案系統則被簡稱做“格式化”,當然筆者也算,不過,對於作業系統有興趣的人,分割槽表和檔案系統註定是個繞不過去的坑。在作業系統的幾大重要知識點(程序管理,記憶體管理等)

定位的目標檔案phase1.o,在生成執行程式的過程中定位的方法

可重定位的目標檔案phase1.o,在生成執行程式的過程中重定位的方法 gcc -on-pie -fno-PIC main.o phase1.o -o linkbomb1 連線時,在各個.o合併生成了執行程式linkbomb1後,要對linkbomb1進行重定位。 1.檢視phase

定位的目標檔案phase1.o,在生成執行程式的過程中定位的方法( 隨機段地址版)

可重定位的目標檔案phase1.o,在生成執行程式的過程中重定位的方法 隨機段地址版 gcc main.o phase1.o -o linkbomb1 連線時,在各個.o合併生成了執行程式linkbomb1後,要對linkbomb1進行重定位。 1.檢視phase1.o的重定位條

輕鬆學習java入鎖(ReentrantLock)的實現原理

前言 相信學過java的人都知道 synchronized 這個關鍵詞,也知道它用於控制多執行緒對併發資源的安全訪問,興許,你還用過Lock相關的功能,但你可能從來沒有想過java中的鎖底層的機制是怎麼實現的。如果真是這樣,而且你有興趣瞭解,今天我將帶領你輕鬆

Linux 定位檔案 ELF結構

    Linux下ELF檔案型別分為以下幾種:    1、可重定位檔案,例如SimpleSection.o;    2、可執行檔案,例如/bin/bash;    3、共享目標檔案,例如/lib/libc.so。    再接下來的文章中,我們會使用objdump,reade

編譯連結中的-定位目標檔案

這幾天看linux程式設計,發現很多專有名詞, 可重定位目標檔案理解: 資料一: 彙編器所產生的目標檔案至少包括三個區,即文字區(text),資料區(data)和bss區。文字區一般包括程式的程式碼和常量,資料區通常存放全域性變數等內容,bss區用於存放未初始化的變數或作為

程式編譯-彙編-連結的理解02-定位目標檔案具體包含的資訊!

.bss 未初始化的變數其實就相當於佔位符。 僅在節頭表裡說明這一節需要多少的空間,在磁盤裡並不分配任何空間。 C語言規定,未初始化的全域性變數和區域性靜態變數的初始值為0 所以不需要為其分配任何空間。 .data 已經初始化的變數中存放具體的初

入函數不可入函數

如果 interrupt 信號量 發生 標準io 一個 i/o 可重入 規則 參考:http://blog.csdn.net/wenhui_/article/details/6889013 重入:重新進入 區別:多個任務能否同時調用一個函數,例如操作系統在進程調度過程中,或

入函數線程安全

可重入函數 不可重入函數 線程安全 介紹: 一組並發線程運行在同一進程上下文中,每一個線程都有自己獨立的線程上下文,包括線程ID、棧、棧指針、程序計數器、條件碼和通用目的寄存器。每個線程和其他線程一起共享進程上下文的其他部分,包括整個用戶虛擬地址空間(由代碼段、讀/寫數據、堆以及所有共享

MySQL復讀采坑記錄-事務B進行更新時,事務A提交的更新會不會影響到事務B

但是 start clas 行數 通過 基礎上 transacti 隔離 delete 之前線上出現數據重復插入的問題,通過對問題進行排查發現該問題和MySQL的默認隔離級別-Repeatable Read(可重讀)有關系,可重復讀確保同一事務的多個實例在並發讀取數據時,會

作業系統原理第五章(資源分配排程)

一、資源管理             1.資源的動態分配:程序所需的資源是在程序執行中根據執行情況動態的分配、使用和釋放的。                        靜態分配:批處理作業系統中,對作業一級採用資源靜態分配方法。作業所需要的資源是在排程到這個作業的時候,根

Netty學習之旅----原始碼分析記憶體分配釋放原理

static PooledHeapByteBuf newInstance(int maxCapacity) { PooledHeapByteBuf buf = RECYCLER.get(); buf.setRefCnt(1); buf.maxCapacity(m

PE檔案格式學習(八):基址定位

1.簡介 基址重定位表位於資料目錄表中的第六個,它位於安全表的後面。 這個表的作用是用來索引那些需要重定位的資料的。當系統發現DLL的真實載入基址跟PE檔案中的ImageBase中的值不一樣時,就會啟用基址重定位表修復一些資料的地址。我們知道一個程式中可能包含多個DLL,因此有可

PE檔案學習筆記(四):定位表(Relocation Table)解析

1、重定位表的作用 重定位表(Relocation Table)用於在程式載入到記憶體中時,進行記憶體地址的修正。為什麼要進行記憶體地址的修正?我們舉個例子來說:test.exe可執行程式需要三個動態連結庫dll(a.dll,b.dll,c.dll),假設te

作業系統學習-19.離散分配方式

寫在前面 連續分配方式會形成許多“碎片”,雖然可通過“緊湊”方法將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。如果允許將一個程序直接分散地裝入到許多不相鄰接的分割槽中,則無須再進行“緊湊”。基於這一思想而產生了離散分配方式。如果離散分配的基本單位是頁,