操作系統內存分配
when why what how
為什麽 OS 需要中斷、系統調用、異常?
why? 現實中有不少惡意應用,如果它能隨意調用系統的一些指令,那後果不堪設想。那麽就需要有個人確保其安全,操作系統可以信任其安全所以如果一些應用需要調用系統的一些指令通過操作系統來檢查確保其安全。
中斷:是指CPU對系統發生的某個事件做出的一種反應,CPU暫停正在執行的程序,保留現場後自動地轉去執行相應的處理程序,處理完該事件後再返回斷點繼續執行被“打斷”的程序。 如果某一個程序運行了足夠長用完了分配給它的時間片,CPU決定切換到另一個進程運行,就會產生一個時鐘中斷,切換到下一個進程運行。
系統調用:應用程序請求操作提供服務
異常:非法指令或者其他原因導致當前指令執行失敗比如除數為 0
響應方式
中斷:異步
異常:同步
系統調用:異步或同步
處理
中斷:持續,對用戶應用程序時透明的
異常:殺死或者重新執行意想不到的應用程序指令
系統調用:等待和持續
內存分配
內存層次
邏輯地址:應用程序在內存中運行的時候有利於操作系統的有效管理,不用考慮一些細節(物理內存在哪裏、外設在哪裏),訪問連續的地址空間。
物理地址:CPU地址總線傳來的地址,由硬件電路控制(現在這些硬件是可編程的了)其具體含義。物理地址中很大一部分是留給內存條中的內存的,但也常被映射到其他存儲器上(如顯存、BIOS等)。在沒有使用虛擬存儲器的機器上,虛擬地址被直接送到內存總線上,使具有相同地址的物理存儲器被讀寫;而在使用了虛擬存儲器的情況下,虛擬地址不是被直接送到內存地址總線上,而是送到存儲器管理單元 MMU,把虛擬地址映射為物理地址。
簡單說
程序的地址範圍:地址空間(其中的地址是邏輯地址)
內存的地址範圍:內存空間(其中的地址是物理地址)
連續地址空間分配
動態分區分配:分配策略
最先匹配(First-fit)
優勢:簡單、易於產生更大空閑塊、在高地址空間有大塊的空閑分區
劣勢:外部碎片、分配大塊時較慢
最佳匹配(Best-fit)
優勢:當大部分分配時小尺寸時非常有效
劣勢:外部碎片、釋放分區較慢、易產生很多沒用的微小碎片(不怎麽好)
最差匹配(Worst-fit)
優勢:假如分配時中等尺寸效果最好、避免出現太多的小碎片
劣勢:重分配慢、外部碎片、易於破碎大的空閑塊以致大分區無法被分配
系統中的碎片
內存中無法被利用的存儲空間稱為碎片。
內部碎片:指分配給作業的存儲空間中未被利用的部分,如固定分區中存在的碎片。
單一連續區存儲管理、固定分區存儲管理、分頁式存儲管理和請求頁式存儲管理都會出現內部碎片。
外部碎片:指系統中無法利用的小的空閑分區。如分區與分區之間存在的碎片。這些不連續的區間就是外部碎片。
內部碎片無法被整理,但作業完成後會得到釋放。它們其實已經被分配出去了,只是沒有被利用。
外部碎片才是造成內存系統性能下降的主要原因。外部碎片可以被整理後清除。
碎片整理
壓縮式碎片整理
在內存中運行的程序能調整他的位置。什麽時候移動?運行時不行,等待可以,但是開銷大不大。
交換式碎片整理
運行程序需要更多的內存,搶占等待的程序回收他們的內存。把等待的程序放到磁盤上(虛擬內存)。
非連續分配
連續內存分配的缺點
- 分配給一個程序的物理內存是連續的
- 內存利用率較低
- 有外碎片、內碎片的問題
- 內存分配的動態修改困難
非連續分配的設計目標:提高內存利用效率和管理靈活性
- 允許一個程序的使用非連續的物理地址空間
- 允許共享代碼與數據
- 支持動態加載和動態鏈接
缺點:如何建立虛擬地址和物理地址之間的轉換
- 軟件方案(靈活,開銷大)
- 硬件方案(夠用,開銷小)
非連續分配的硬件輔助機制
段式存儲管理 (segmentation)
頁式存儲管理 (paging)
段式存儲管理
頁式存儲管理
分頁和分段的最大區別是分頁尺寸時固定的分段式可以變化的。
頁幀(幀、物理頁面, Frame, Page Frame)
- 把物理地址空間劃分為大小相同的基本分配單位
- 2的n次方,如512, 4096, 8192
頁面(頁、邏輯頁面, Page)
- 把邏輯地址空間也劃分為相同大小的基本分配單位
- 幀和頁的大小必須是相同的
頁表結構
每個進程都有一個頁表
- 每個頁面對應一個頁表項
- 隨進程運行狀態而動態變化
- 頁表基址寄存器(PTBR: Page
Table Base Register)
上面通過頁表來訪問,訪問一個內存單元需要 2 次內存訪問,第一次訪問:獲取頁表項,第二次訪問獲取數據。
存在問題?
64位機器如果每頁1024字節,那麽一個頁表的大小會是多少?
2的54次,那麽這個頁表將會非常大!!!
優化方案?
- 緩存
- 間接訪問
多級頁表存在問題?
如果有 5 級頁表,那麽要獲取數據是不是需要訪問 6 次內存。
能不能反置頁面:將原來通過頁號來找幀號換成通過幀號找頁號,這樣空間大小就可以減少,但是如果通過幀號來找頁號呢? Hash
兩者優缺點
段式管理的優點是:沒有內碎片(因為段大小可變,改變段大小來消除內碎片)。但段換入換出時,會產生外碎片(比如4k的段換5k的段,會產生1k的外碎片)
頁式存儲管理的優點是:沒有外碎片(因為頁的大小固定),但會產生內碎片(一個頁可能填充不滿)
兩者的不同點:
(1) 分頁僅僅是由於系統管理的需要而不是用戶的需要。段則是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是為了能更好地滿足用戶的需要。
(2) 頁的大小固定且由系統決定,由系統把邏輯地址劃分為頁號和頁內地址兩部分,是由機器硬件實現的,因而在系統中只能有一種大小的頁面;而段的長度卻不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序進行編譯時,根據信息的性質來劃分。
(3) 分頁的作業地址空間是一維的,即單一的線性地址空間,程序員只需利用一個記憶符,即可表示一個地址;而分段的作業地址空間則是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。
段頁式存儲管理
段式存儲在內存保護方面有優勢,頁式存儲在內存利用和優化轉移到後備存儲方面有優勢。
參考
操作系統_清華大學(向勇、陳渝)
https://blog.csdn.net/bupt_tinyfisher/article/details/8939689
操作系統內存分配