操作系統 內存相關知識(筆記)

內存
內存是用於存放數據的硬件,程序執行前需要先放到內存中才能被CPU處理

進程的運行原理----指令

相對地址又稱爲邏輯地址,絕對地址又稱物理地址

從寫程序道程序執行

編譯:由編譯程序將用戶源代碼編譯成若干個目標模塊(編譯就是把高級語言翻譯成機器語言)
鏈接:由鏈接程序將編譯後形成的一組目標模塊,以及所需庫函數連接在一起,形成一個完整的裝入模塊
裝入(裝載):由裝入程序將裝入模塊裝入內存運行.

絕對裝入:在編譯時,如果知道程序將放到內存的哪個位置,編譯程序將產生絕對地址的目標代碼
裝入程序按照裝入模塊中的地址,將程序和數據裝入內存.(只適用於單道程序環境)

靜態重定位:又稱可重定位裝入。編譯,連接後的裝入模塊的地址都是從0開始的,指令中使用的地址祕書局存放的地址都是相對於其實地址而言的邏輯地址。課根據內存的當前情況,將裝入模塊裝入到內存的適當位置。裝入時對地址進行重定位,將邏輯地址變換爲物理地址(地址變換是在裝入時一次完成的)
靜態重定位的特點是在一個作業裝入內存時,必須分配其要求的全部內存空間,如果足夠的內存,就不能裝入改作業
動態重定位:又稱爲動態運行時裝入,編譯,鏈接後的裝入模塊的地址都是從0開始的。裝入程序吧裝入模塊裝入內存時,並不會立即把邏輯地址轉換爲物理地址,而是把地址轉換推遲到程序真正要執行時才進行。因此裝入內存後所有的地址依然是邏輯地址。這種方式需要一個重定位寄存器的支持
纔去動態重定位時,允許程序在內存中發生移動

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

1.操作系統負責內存空間的分配和回收
2.操作系統需要提供某種技術從邏輯上對內存空間進行擴充
3.操作系統需要提供地址轉換功能,負責程序的邏輯地址與物理地址的轉換
4.操作系統需要提供內存保護功能。保證各進程在各自存儲空間內運行,互不干擾
內存保護可採取兩種方法:
1.在CPU中設置一對上下限寄存器,存放進程的上下限地址。進程的指令要訪問某個地址時,cpu檢查是否越界
2.採用重定位寄存器(又稱爲基址寄存器)和界地址寄存器(又稱限長寄存器)進行越界檢查。重定位寄存器存放的是進程的起始物理地址。界地址寄存器存放的是進程的最大邏輯地址

覆蓋

覆蓋技術用來解決程序大小超過物理內存總和的問題
覆蓋技術的思想:將程序分爲多個段(多個模塊)常用的段常駐內存,不常用的段在需要時調入內存

內存中分爲一個固定區和若干個覆蓋區
需要常駐內存的段放在固定區中,調入後就不再調出(除非運行結束)
不常用的段放在覆蓋區,需要用的調入內存,用不到調出內存

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

交換技術
交換(對換)技術的設計思想:內存空間緊張時,系統將內存中某些進程暫時換出外存,把外存中某些已具備運行條件的進程換入內存(金曾在內存和磁盤間動態調度)

暫時換出外存等待的進程狀態爲掛起狀態(掛起態)
掛起態又可以進一步細分爲就緒掛起,阻塞掛起兩種狀態

1.具有對換功能的操作系統中,通常把磁盤空間分爲文件區和對換區兩部分。文件區主要用於存放文件,主要追求存儲空間利用率,因此對文件區空間的管理採用離散分配方式;對換區空間只佔磁盤空間的小部分,被換出的進程數據就存放在對換區。由於對換的速度直接影響到系統的整體速度,因此對換區空間的管理主要追求換入換出速度,因此通常對換區採用連續分配方式,總之對換區的I/O速度比文件區快.
2.交換通常在許多進程運行且內存喫緊時進行,而系統負荷降低就暫停。例如:在發現許多進程運行時經常發生缺頁,就說明內存緊張,此時可以換出一些進程,如果缺頁率明顯下降,就可以暫停換出.
3.可優先換出阻塞進程;可換出優先級低的進程;爲了防止優先級低的進程在被調入內存後很快又被換出,有的系統還會考慮進程在內存的駐留時間.(注意:PCB會常駐內存,不會被換出外存)

連續分配管理方式
連續分配:指爲用戶進程分配的必須是一個連續的內存空間

單一連續分配
在單一連續分配方式中,內存被分爲系統區和用戶區。系統區通常位於內存的低地址部分,用於存放操作系統的相關數據;用戶區用於存放用戶進程相關數據。內存中只能有一道用戶程序,用戶程序獨佔整個用戶區空間
優點:實現簡單,無外部碎片;可以採用覆蓋技術擴充內存,不一定需要採取內存保護
缺點:只能用於單用戶,單任務的操作系統中,有內部碎片;存儲器利用率低

固定分區分配
20世紀60年代出現了支持多道程序的系統,爲了能在內存中裝入多道程序,且程序之間不會互相干擾
於是將整個用戶空間劃分爲若干個固定大小的分區,在每個分區中只裝入一道作業,這樣就形成了最早的最簡答的一種可運行的多道程序的內存管理方式

分區大小相等:缺乏靈活性,但是很適合用於用一臺計算機控制對個相同對象的場合
分區大小不等:增加了靈活性,可以滿足不同大小的進程需求

操作系統需要建立一個數據結構–分區說明表,來實現各個分區的分配與回收。每個表項對應一個分區,通常按分區大小排列,每個表項包括對應的大小,起始地址和狀態

動態分區分配又稱爲可變分區分配。這種分配方式不會預先劃分內存分區,而是在進程進入內存時,
根據進程的大小動態的建立分區,並使 分區的大小正好適合進程的需要。因此係統分區的大小和數目是可變的.
1.系統用什麼樣的數據結構記錄內存的使用情況(空閒分區表,空閒分區鏈)
2.當多個空閒分區都能滿足需求時,應選擇那個分區進行分配?

把一個新作業裝入內存時,須按照一定的動態分區分配算法,從空閒分區表或鏈中選出一個分區分配給改作業。由於分配算法對系統性能有很大的影響,因此人們對它進行了廣泛的研究
3.如何進行分區的分配和回收

動態分區分配沒有內部碎片,只有外部碎片
內部碎片:分配給某進程的內存區域中,有些部分沒有用上
外部碎片:是指內存中的某些空間分區由於太小而難以利用

如果內存中空閒空間的總合本來可以滿足某進程的要求,但由於進程需要的是一整塊連續的內存空間,因此這些碎片不能滿足進程的要求
可以通過緊湊技術來解決外部碎片

動態分區分配算法

首次適應算法:每次從低地址開始查找,找到第一個能滿足大小的空閒分區。
如何實現:空閒分區以地址遞增的次序排列。每次分配內存時順序查找空閒分區鏈(表),找到大小能滿足要求的第一個空閒分區

最佳適應算法:由於動態分區分配是一種連續分配方式,爲各進程分配空間必須是連續的一整片區域,因此爲了保證當大進程到來時能有連續的大片空間,可以儘可能多的留下大片空閒區,優先使用更小的空閒區
如何實現:空閒分區按容量遞增次序鏈接,每次分配內存順序查找空閒分區鏈(表),找到大小滿足的第一個空閒分區
缺點:每次都選最小的分區進行分配,會留下越來越多的,很小的難以利用的內存塊,會產生很多的外部碎片

最壞適應算法:爲了解決最佳適應算法的問題,留下太多難以利用的小碎片,可以再每次分配時優先使用最大的連續空閒區,這樣分配後剩餘的空閒區就不會太小,更方便使用
如何實現:空閒分區按容量遞減次序鏈接,每次分配內存時順序查找空閒分區鏈(表),找到大小能滿足要求的第一個空閒分區
缺點:每次都選最大的分區進行分配,雖然可以讓分配後留下的空閒區更大,更可用,但是這種方式會導致較大的連續空閒區被迅速用完,如果之後有大進程,就沒有內存分區可用了

鄰近適應算法:首次適應算法每次都從鏈頭開始查找的,這可能會導致低地址部分出現很多小的空閒分區,而每次分配查找時,都要經過這些分區,因此也增加了查找的開銷,如果每次都從上次查找結束的位置開始檢索,就能解決問題
如何實現:空閒分區以地址遞增的順序序列(可排成一個循環鏈表)每次分配內存時從上次結束的位置開始查找空閒分區鏈(表)找到大小能滿足要求的第一個空閒分區
首次適應算法每次都要從頭查找,每次都需要檢索低地址的小分區,但是這種規則也決定了當低地址部分有更小分區可以滿足需求時,會更有可能用到低地址部分的小分區,也會更有可能把高地址部分的大分區保留下來

鄰近適應算法的規則可能會導致無論低地址,高地址部分的空閒分區都有相同的概率被使用,也就導致了高地址部分的大分區更可能被使用,劃分爲小分區,最後導致無大分區可用

綜合來看首次適應算法效果更好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章