目錄
說明:該文檔是借鑒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