操作系統之存儲管理

1.絕對地址與相對地址的存儲方式

2.空閒內存管理方式:位圖存儲管理    鏈表存儲管理   (內存池的實現)

鏈表存儲管理分配算法:首次適配算法(遍歷鏈表找到第一個比要分配內存大的內存塊)    最佳適配算法(遍歷鏈表找到與要分配內存最匹配的內存塊,容易產生內存碎片)  快速適配算法(爲常用大小的空閒區維護單獨的鏈表,其實是二級鏈表,linux STL的內存分配就是如此) 最差適配算法(總是分配最大的內存塊,保證分配之後切割下的新內存塊足夠大)

3.虛擬內存:每個程序擁有自己的地址空間,這個空間被分割成多個塊,每一塊稱爲一個頁面,通常一個頁的大小爲4KB

虛擬地址通過MMU(內存管理單元)將相對地址轉換爲絕對地址,完成到物理內存的映射。

虛擬地址到物理地址的映射:虛擬地址被分成虛擬頁號和偏移量,通過頁表項查詢以虛擬頁號爲索引的物理地址頁框號(內存中分配的頁),將頁框號拼接成偏移量的高位端,形成送往內存的物理地址

頁表項的結構:保護位(RWX)高速緩存位 修改位 訪問位 在/不在位

通過TLB(轉換檢測緩衝區 硬件TLB與軟件TLB)這個中間存儲單元來加速分頁機制,得出的解決方案建立於這樣的現象:大多數程序總是對少量的頁面進行多次訪問。

將一個虛擬地址放入MMU進行轉換時,首先通過將虛擬頁號與TLB中的表項同時進行匹配,如果發現了一個有效匹配並且訪問操作不違反保護位,則直接從TLB取出頁框號而不需要訪問頁表(硬失效與軟失效)

4.大內存的頁表

多級頁表,一般在32位系統中實行,二級頁表形式已足夠使用

倒排頁表,64位系統實行 通過頁框號來索引虛擬頁面,用虛擬地址生成散列鍵值,所有具有相同散列值的虛擬頁面形成一個鏈表,加上TLB的運用 進行快速訪問

5.頁面置換算法(沒有空閒頁框的情況下)

最優頁面置換算法:基本不可能實現,需要知道某個頁面在多少條指令之後纔會被訪問,置換最大的那一個頁面

最近未使用頁面置換算法(NRU):當頁面被訪問時設置R位爲1,當頁面被修改時設置M位爲1,當啓動一個進程時,它所有的頁面的RM被操作系統設置爲0,R定期的被清零,以區別是否最近沒有被訪問的頁面,當缺頁中斷髮生時,操作系統檢查所有的頁面的R、M值,並將其分爲四類:第0類 沒有被訪問,沒有被修改(基本不可能)第1類 沒有被訪問,已被修改 第2類 已被訪問,沒有修改 第3類 已被訪問,已被修改。隨機的從類編號最小的非空類中挑選一個頁面淘汰之。

先進先出頁面置換算法(FIFO 粗暴式):操作系統維護所有的頁面的鏈表,最新進入的頁面放在表尾,最久進入的放在表頭,發生缺頁中斷淘汰表頭的頁面並將新頁面放入表尾

第二次機會頁面置換算法:與FIFO類似,但是會檢測是否被訪問,如果有訪問,則將R清零放入表尾,否則淘汰之,將新頁面放入表尾

時鐘頁面置換算法:與FIFO類似,形成了一個閉環鏈表,一個指針指向最老的頁面,如果有被訪問,則R清零,指針移向下一個老頁面,否則直接淘汰之,並在該位置插入新頁面,指針移向下一位

最近最少使用頁面置換算法(LRU):硬件實現(64位計數器,每條指令執行時加1,每次訪問內存後,將當前的值保存到被訪問的頁面頁表項中,缺頁中斷就檢測該值,找出最小的替換之)(使用處置爲0的N*N的矩陣,當訪問頁框k時(k<N),硬件首先把k行的位設置爲1,k列的位設置爲0,二進制數最小的行就是最近最少使用的 瀏覽器的頁面緩存算法可以使用之)

軟件模擬LRU:NFU算法,每個時鐘中斷系統掃描內存中的所有頁面,將頁面的R值加到頁面所關聯的軟件計數器上,缺頁中斷時置換計數器數值最小的頁面,問題在於如果某段時間某個頁面頻繁使用,會導致該關聯的計數器相對比較大,導致很長時間都不會將其置換出去。老化算法,在關聯的軟件計數器上,將其右移一位,然後高位放入R值,置換最小值的頁面。問題在於不能確定哪個是最近最少使用的

工作集置換算法:以進程工作的頁面在某個時間段的集合爲基礎,當缺頁中斷時,淘汰不在工作集的頁面,通過將上次使用時間寫進頁表項內進行判斷。

工作集時鐘頁面置換算法:已閉環鏈表的形式,將指針指向當前工作集生存時間最大的一個

6.分段與分表

一個進程中指令段跟數據段是分開的,每個段以頁做單位進行訪問,實現進程間共享指令區域和共享庫

7.缺頁中斷處理總結

(1)硬件陷入內核,在堆棧保存程序計數器

(2)啓動彙編代碼保存寄存器和其他信息

(3)缺頁中斷時嘗試發現虛擬頁面

(4)獲得虛擬地址後檢測有效性和保護位是否衝突,並選擇適當操作處理頁面置換

(5)選擇的頁框髒了,則寫入磁盤,發生上下文切換,讓其他進程運行直至磁盤讀寫結束

(6)頁框乾淨後則操作系統查找頁面在磁盤的地址通過磁盤操作將其裝入,產生缺頁中斷的進程仍然掛起

(7)當磁盤中斷髮生時,表明該頁已經裝入,頁表更新,頁框正常

(8)恢復發生缺頁中斷的指令狀態

(9)調度引發缺頁中斷的進程,返回調用她的彙編語言例程

(10)恢復寄存器及其他信息,返回用戶空間繼續執行,就好像缺頁中斷沒有發生一樣

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