操作系統-進程內存分配


目錄

說明:該文檔是借鑒B站博主的,地址為https://www.bilibili.com/video/BV1yv411C7Kr

下面的圖片都是切圖的,因為圖上有標識,不能切圖成功。所有標識打碼了,如有侵權,聯系刪除

進程內存分配3種方式

1.連續固定內存分配
2.非連續內存分配(動態分配)
3.虛擬內存

一:連續固定內存分配

連續分配:為一個進程分配一片連續的內存空間,類似順序表
優點:快
缺點:比較難划分,連續的很長的內存空間不好找

連續固定內存分配:在進程來之前就已經內存分區分配了
缺點:浪費空間

1.單一連續分配方式

單一連續分配方式:只能用於單用戶,單任務的操作系統中。只存在一個進程運行

2.固定分區分配

固定分區分配:分區大小相等
缺點:若進程太小,則空間浪費。若進程太大,超過一個分區容量,則無法裝入
優點:如果每個進程需要的內存都剛好是一個分區的大小,則實現簡單,每個進程都滿足要求。

適用系統:比如車間機床,每個機床都一樣

3.分區大小不等分配

分區按大小排隊

連續內存分配管理方式

1.首次適應算法

2.最佳適應算法

3.最壞適應算法

動態分配過程

分配大小:只能分配2的整數次冪大小空間.2,4,8,32,64,128,256,512,1024...
下圖:
進程1需要64kb:內存動態分配64kb給進程1
進程2需要128kb:內存動態分配128kb給進程2
進程3需要100kb:內存動態分配128kb給進程3
進程4需要100kb:內存分配不了,剩余的內存小於100kb

內存碎片-外部碎片/內部碎片(連續的)

內部碎片(已經被分配出去):進程3只需要100kb,分配了128kb給進程3。剩余28kb就是內部碎片,無法分配給其他進程
外部碎片(還沒有被分配出去):由於太小了,無法分配給新進程

空閑分區鏈/空閑分區表

空閑分區鏈:多個不連續的內存空間,用鏈表串起來

下圖:
進程2結束了,藍色的空間是空閑的內存

伙伴系統算法

伙伴系統是對以上兩種內存方式對一種折中方案
原理:
 1.整個分區大小為2的n次方
 2.新的進程需要空間S,可講分區進行i次划分,得到空間2的(n-1)次方
 3.當滿足2的(n-i-1)<S<=2的(n-i)的時候,則把大小2的(n-i)的分區分配給進程

合並條件:大小相同,地址相鄰(由同一塊分割而來)

原理圖:

最開始為1M整塊的內存

來了一個A進程,需要66K:1M划分一半,512大於66K:

512K划一半,256大於66k,繼續划分:

265k划一半,128k大於66k,128k的一半64k小於66k,所以128k分配給A

又來了個B進程,需要251K:所以把256k分配給B

又來了個C進程,需要41k:128K大於41K,128K的一半64大於41K,64K的一半32小於41k,所以把64K分配給C

又來了個D進程,需要130K:所以把256K分配給D

這時,C進程執行完了,回收內存64k,合並128K

這時,進程B執行完了,回收內存256K,不能合並,因為左邊是128K,大小不一致不能合並,不是同一塊分區分裂的不能合並

這時,進程D執行完了,回收內存256K,和右邊的合並。因為來自同一塊內存區

這時,進程A執行完了,回收內存128K,依次合並:

自學b站博主的,切圖學習。不打馬薩克圖放不上去。如有侵權,聯系刪除

二:非連續內存分配

非連續分配:零散的內存空間,類似於鏈表
優點:容易划分空間

1.頁式管理

虛地址和實地址

頁,頁框

內存分配規則:以頁為單位進行分配,邏輯上相鄰的頁和物理上不一定相鄰。
邏輯地址:虛地址,比如頁里面頁號
物理地址:實地址,內存中單元的實際地址,可直接尋址。比如頁框號
左邊是虛地址,右邊是實際地址
左邊虛地址相鄰,右邊實地址不相鄰

頁:頁內的地址空間是連續的,連續相同大小的內存框

分配

左邊虛地址相鄰,右邊實地址不相鄰

頁,頁框,頁表的關系

框號的頁內地址與頁號的頁內地址相同
頁:每一個頁長相同
頁表:頁號和頁框號的映射關系,邏輯地址和物理地址的映射關系,因為每一個頁長相同,所以沒有頁長
頁表是保存在內存中的,是進程的一部分,每個進程都有一個頁表

進程在執行,則頁表起始地址保存在頁表基址寄存器(基地址就是起始地址)
進程沒有執行,則頁表起始地址保存在進程控制塊中

虛地址找到實地址必須通過頁表找

內部碎片

分配

2.段式管理

段式設計思想

進程地址空間按某種邏輯關系划分為若干個段,每個段都有自己的名字
比如主程序段main,子程序段ADD,子程序段sum

段式內存分配

以段為單位分配,每段一片連續的內存空間,段之間可以不連續

段表

段長:因為每個頁長相同,所以沒有頁長。反之,段長不同,所以要記錄段長。防止越界
基地址:物理地址的起始地址

外部碎片

注意:頁式產生的是內部碎片,段式產生的是外部碎片

3.段式與頁式對比

可重入代碼:多個進程允許同時訪問公共區域代碼。

頁式多進程訪問公共資源

特點:多了一張很大的頁表
頁表要比段表大的多

段式多進程訪問公共資源

特點:多了一張段表
段表要比頁表小的多

段式與頁式對比

1):
  頁是物理單位,分頁的目的是實現離散分配,減少外部碎片,提高內存利用率。分頁僅僅是由於系統管理的需要而不是用戶的需要。
  段是信息的邏輯單位,每段都有一組其意義相對完整的信息。分段的目的是為了更好的滿足用戶的需要

2):
  頁大小固定且由系統決定,由系統把邏輯地址划分為頁號和頁內地址兩部分,由硬件實現,在洗頭中只有一種大小的頁面
  段長不固定,取決於用戶編寫的程序,通常由編譯程序在對源程序編譯時,由信息的性質划分。

3):
  分頁的地址空間對程序員是一維的
  分段地址空間對程序員是二維的,程序員在標識一個地址時,即需給出段名,又需給出段內地址

4.段頁式存儲管理

4.1為什么設計段頁式

為了綜合段式和頁式的優點,克服兩者的缺點

4.2設計思想

先按照邏輯關系划分為段,然后再在段內分頁划分。
內存划分的時候與頁式一致,分配的時候以頁為單位。

4.3虛地址轉實地址過程

三:虛擬內存管理

一個進程需要的內存空間大於內存的總容量,不管連續分配還是非連續分配都不滿足,容量不夠。

虛擬內存管理:從硬盤划分內存
優點:即便進程大於內存總容量,也可以運行

功能:可以在較小的內存中運行要求較大的進程
實現方法:讓不會同時執行的程序模塊共享一片儲存區

3.1覆蓋技術原理-一個進程在較小的空間運行

覆蓋技術原理:讓不會同時執行的程序共享內存,不會同時執行就是沒有調用關系
比如下圖:
B-C:無調用關系,可以共享內存
D-E:無調用關系,可以共享內存

總大小:115K
實際大小:85K

優點:小空間運行大內存
缺點:增減編程難度,增加執行時間

3.2交換技術原理-多個進程在較小的空間運行

功能:可以增加正在執行,或者需要執行的進程的內存
實現方法:將暫時不執行的進程換出內存,將即將執行的進程換入內存。那么即將執行的進程,或者正在執行的進程內存就變大了
提示:換入換出的單位時整個進程

交換的時機(換出其他未執行的進程):
 1.正在執行的進程發現內存不足
 2.即將進入內存執行的進程發現內存不足

換出:
  當某進程運行中需要更多的內存空間,但又無足夠的內存空間時,則系統將某進程換出。一般選擇處於阻塞狀態且優先級最低的進程換出。

換入:
  系統定時查看所有進程的狀態,從中找出“就緒態”狀態且已換出的進程,將其中換出時間最久的進程換入

3.3覆蓋技術與交換技術的比較

覆蓋:
  1.發送在同一個進程內的不同時執行的模塊,無調用關系的模塊
  2.解決一個進程的空間需求無法滿足的問題

交換:
  1.以進程為單位
  2.解決多個進程的空間需求無法滿足的問題

3.4局部性原理

時間局部性

一條指令的第一次執行和下一次執行,一個數據的第一次訪問和下一次訪問都集中在一個較短的時期內。

通俗講:一條指令循環的執行,間隔時間短

空間局部性

當前執行的指令和臨近執行的幾條指令,當前訪問的數據和臨近訪問的幾個數據都集中在一個較小的區域內。

通俗講:需要執行第一條指令和第二條指令在空間上很近

分支局部性

一條條轉指令的兩次執行,很可能跳到相同的位置

通俗講:比如if語句,多次執行,條件滿足則條轉到相同位置

3.5虛擬存儲技術

3.5.1原理

1):裝載程序的時候,僅將當前需要執行的頁面或者段裝入內存。
2):執行過程中所需要的程序或者數據不在內存,則將相應的頁或者段調入內存。
3):將暫時不用的頁或者段保存到外存中。

實現方式:
  虛擬頁式存儲方式和虛擬段式存儲方式

3.5.2虛擬頁式存儲管理頁表機制

3.5.3虛擬頁式存儲管理頁表地址轉換

3.5.4缺頁中斷

缺頁中斷:每當要訪問的頁不在內存時,便產生缺頁中斷,請求系統將缺頁調入內存
缺頁中斷特點:
  1):在指令執行期間產生和處理中斷信號,而非通常的在指令執行完之后檢測處理中斷
  2):一條指令在執行期間,可能產生多次缺頁中斷

3.6置換算法

3.6.1最佳置換算法

選擇換出的頁,將是以后永不使用的或者最長時間內不再被訪問的頁。因無法預知哪個頁下次調用時間,所以這是一種理想的算法
最佳置換算法:9次缺頁處理

3.6.2先進先出置換算法(FIFO)隊列類算法

總是將最先進入內存的頁換出,或者選擇在內存中駐留時間最久的頁換出

3.6.3最近最久未使用置換算法(LRU)堆棧類算法

選擇最近最久未使用的頁換出,是一種用“最近的過去”作為“最近的將來”的估計的方法
具體方法:
 用訪問字段A來記錄一個頁自上次被訪問以來經歷的時間,當置換一個頁時,選擇經歷時間t值最大的,即最近最久未使用的頁換出。

3.6.4Clock置換算法

訪問頁面時,在頁表項中記錄下訪問情況,缺頁時,從上次查找結束的位置順序查找未被訪問的頁面換出。
具體方法:頁表中增加訪問位,用來描述過去一段時間的訪問情況,各個頁面組織成循環鏈表,用一個指針指向最先調入的頁。指針掃描循環鏈表,找到第一個未被訪問的頁換出。

3.7頁框分配策略

3.7.1固定分配局部置換

為每個進程分配固定數目的頁框(物理塊),假設n個,如果發生缺頁,則只能從這n個中選出一個換出
缺點:這種方法難以確定n的大小。n太小,則缺頁頻繁,系統吞吐量太低;n太大,則內存中能夠駐留的進程數量少,系統並行率低。

3.7.2可變分配全局置換

系統保持一個空閑頁框隊列,為進程分配內存時首先給進程分配一定量的頁框,當發生缺頁時,吸引從空閑頁框隊列取出一個頁框給進程,並將缺頁裝入。
特點:當空閑框隊中的頁框用完時,系統才能從內存中選擇一頁調出,該頁可能是系統中任意進程的頁,因此叫全局置換

3.7.3可變分配局部置換

首先為每個進程分配一定數目的頁框,發送缺頁時,只允許從該進程在內存的頁中換出一頁。
特點:若雀躍頻繁,系統會適當的增加進程的頁框數。若缺頁率很低,則系統會適當減少進程的頁框數目。

3.8抖動和工作集

3.8.1抖動

如果多道程度過高,導致過於頻繁的頁換入與換出,使得調度頁的耗時比進程時機運行的時間還多,系統效率急劇下降的現象稱為抖動。
產生的原因:內存中並行的進程過多,每個進程分到的頁框數過少,缺頁過於頻繁,頁換入換出耗時過大,導致cpu利用率過低,調度程序誤以為cpu利用率低的原因是並行度不夠高,就會增加多道程序的度,使得新進程進一步裝入內存,反而導致cpu利用率下降。

解決方法:
 1.增大內存空間,讓程序分配到更多的頁框,減少頻繁換入換出
 2.減少多道程序的度數(減少並行),讓程序分配到更多的頁框,減少頻繁換入換出

3.8.2工作集

在當前一段時間內使用的頁的集合。
駐留集:給進程分配的所有頁框的集合

3.9案例題

1.

C

2.

C

3.

B

4.

B

5.

C

6.

B

7.

C

8.

A

9.

B

10.

B

11.

C

12.

A

13.

最近最久未使用置換算法(LRU)堆棧類算法

A

14.

C

15.

A

16.

D

17.

A


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM