操作系統內存管理


覆蓋技術,虛擬內存和交換分區技術都是為了解決物理內存空間不足的解決方案:

 

覆蓋技術(應用程序手動把需要的指令和數據保存在內存中)

目標:在較小的可用內存中運行較大的程序

方法:依據程序邏輯結構,將程序划分為若干功能相對獨立的模塊;將不會同時執行的模塊共享同一塊內存區域

  (1)必要部分(常用功能)的代碼和數據常駐內存

  (2)可選部分(不常用功能)放在其他程序模塊中,只在需要用到時裝入內存

  (3)不存在調用關系的模塊可相互覆蓋,共用同一塊內存區域

 

虛擬內存

虛擬內存的基本思想是,每個進程有用獨立的邏輯地址空間(這部分在用戶看來是連續的地址空間),內存被分為大小相等的多個塊,稱為頁(Page).每個頁都是一段連續的地址。對於進程來看,邏輯上貌似有很多內存空間,其中一部分對應物理內存上的一塊(稱為頁框,通常頁和頁框大小相等),還有一些沒加載在內存中的對應在硬盤上。

      虛擬內存實際上可以比物理內存大。當訪問虛擬內存時,會通過MMU(內存管理單元)去匹配對應的物理地址,而如果虛擬內存的頁並不存在於物理內存中,會產生缺頁中斷(物理內存頁不存在,1.相關頁被加載到內存,但沒有向MMU注冊2.相關的頁沒有被加入到內存),從磁盤中取得缺的頁放入內存,如果內存已滿,還會根據某種算法將磁盤中的頁換出。

      而虛擬內存和物理內存的匹配是通過頁表實現,頁表存在MMU中,頁表中每個項通常為32位,既4byte,除了存儲虛擬地址和頁框地址之外,還會存儲一些標志位,比如是否缺頁,是否修改過,寫保護等。可以把MMU想象成一個接收虛擬地址項返回物理地址的方法。

 

這里解釋中斷和異常(陷入)區別:

在操作系統中引入核心態和用戶態這兩種工作狀態后,就需要考慮這兩種狀態之間如何切換。操作系統內核工作在核心態,而用戶程序工作在用戶態。但系統不允許用戶程序實現核心態的功能,而它們又必須使用這些功能。因此,需要在核心態建立一些“門”,實現從用戶態進入核心態。在實際操作系統中,CPU運行上層程序時唯一能進入這些“門”的途徑就是通過中斷或異常。當中斷或異常發生時,運行用戶態的CPU會立即進入核心態,這是通過硬件實現的(例如,用一個特殊寄存器的一位來表示CPU所處的工作狀態,0表示核心態,1表示用戶態。若要進入核心態,只需將該位置0即可)。中斷是操作系統中非常重要的一個概念,對一個運行在計算機上的實用操作系統而言,缺少了中斷機制,將是不可想象的。

中斷(Interruption),也稱外中斷,指來自CPU執行指令以外的事件的發生,如設備發出的I/O結束中斷,表示設備輸入/輸出處理已經完成,希望處理機能夠向設備發下一個輸入 / 輸出請求,同時讓完成輸入/輸出后的程序繼續運行。時鍾中斷,表示一個固定的時間片已到,讓處理機處理計時、啟動定時運行的任務等。這一類中斷通常是與當前程序運行無關的事件,即它們與當前處理機運行的程序無關。

異常(Exception),也稱內中斷、例外或陷入(Trap),指源自CPU執行指令內部的事件,如程序的非法操作碼、 地址越界、算術溢出、虛存系統的缺頁以及專門的陷入指令等引起的事件。對異常的處理一般要依賴於當前程序的運行現場,而且異常不能被屏蔽,一旦出現應立即處理。

 

 

直接去操作物理地址的一些問題:

問題1:進程地址空間不隔離。由於程序都是直接訪問物理內存,所以惡意程序可以隨意修改別的進程的內存數據,以達到破壞的目的。有些非惡意的,但是有bug的程序也可能不小心修改了其它程序的內存數據,就會導致其它程序的運行出現異常。這種情況對用戶來說是無法容忍的,因為用戶希望使用計算機的時候,其中一個任務失敗了,至少不能影響其它的任務。

問題2:內存使用效率低。在A和B都運行的情況下,如果用戶又運行了程序C,而程序C需要20M大小的內存才能運行,而此時系統只剩下8M的空間可供使用,所以此時系統必須在已運行的程序中選擇一個將該程序的數據暫時拷貝到硬盤上,釋放出部分空間來供程序C使用,然后再將程序C的數據全部裝入內存中運行。可以想象得到,在這個過程中,有大量的數據在裝入裝出,導致效率十分低下。

問題3:程序運行的地址不確定。當內存中的剩余空間可以滿足程序C的要求后,操作系統會在剩余空間中隨機分配一段連續的20M大小的空間給程序C使用,因為是隨機分配的,所以程序運行的地址是不確定的。

分頁和分段有什么區別?

1.段是信息的邏輯單位,它是根據用戶的需要划分的,因此段對用戶是可見的(這樣就解決了上面的問題1,問題3) ;頁是信息的物理單位,是為了管理主存的方便而划分的,分頁是為實現離散分配方式,提高內存利用率,對用戶是透明的。

2.段的大小不固定,由它所完成的功能決定,由用戶編寫的程序決定的;頁大大小固定,由操作系統決定

3.段向用戶提供二維地址空間(在標識一個地址時,既需要給出段名,又需要給出段內地址);頁向用戶提供的是一維地址空間

4.段是信息的邏輯單位,便於存儲保護和信息的共享,頁的保護和共享受到限制。

5.頁式存儲管理的優點是沒有外碎片(因為頁的大小固定4k),但會產生內碎片(一個頁可能填充不滿);而段式管理的優點是沒有內碎片(因為段可以改變段大小來消除內碎片),但段會產生外碎片(比如4k的段換5k的段,會產生1k的外碎片)。

什么是緩沖區溢出?有什么危害?其原因是什么?

緩沖區溢出是指當計算機向緩沖區填充數據時超出了緩沖區本身的容量,溢出的數據覆蓋在合法數據上。

危害有以下兩點:

  • 程序崩潰,導致拒絕額服務
  • 跳轉並且執行一段惡意代碼

造成緩沖區溢出的主要原因是程序中沒有仔細檢查用戶輸入。

交換技術:Linux下的swap分區及作用(操作系統自動把暫時不能執行的程序保存到外存磁盤中)

swap 分區是Linux系統的交換分區,當內存不夠用的時候,我們使用 swap 分區存放內存中暫時不用的數據。也就是說,當內存不夠用時,我們使用 swap 分區來臨時頂替。

free 命令主要是用來査看內存和 swap 分區的使用情況的,其中:

  • total:是指總數;
  • used:是指已經使用的;
  • free:是指空閑的;
  • shared:是指共享的;
  • buffers:是指緩沖內存數;
  • cached:是指緩存內存數,單位是KB;

我們需要解釋一下 buffers(緩沖)和 cached(緩存)的區別。簡單來講,cached 是給讀取數據時加速的,buffers 是給寫入數據加速的。cached 是指把讀取出來的數據保存在內存中,當再次讀取時,不用讀取硬盤而直接從內存中讀取,加速了數據的讀取過程;buffers 是指在寫入數據時,先把分散的寫入操作保存到內存中,當達到一定程度后再集中寫入硬盤,減少了磁盤碎片和硬盤的反復尋道,加速了數據的寫入過程。

頁面置換算法:

1.最佳置換算法(OPT)

 

最佳(Optimal, OPT)置換算法所選擇的被淘汰頁面將是以后永不使用的,或者是在最長時間內不再被訪問的頁面,這樣可以保證獲得最低的缺頁率。但由於人們目前無法預知進程在內存下的若千頁面中哪個是未來最長時間內不再被訪問的,因而該算法無法實現。

 

2.先進先出(FIFO)頁面置換算法

 

優先淘汰最早進入內存的頁面,亦即在內存中駐留時間最久的頁面。該算法實現簡單,只需把調入內存的頁面根據先后次序鏈接成隊列,設置一個指針總指向最早的頁面。但該算法與進程實際運行時的規律不適應,因為在進程中,有的頁面經常被訪問。

3. 最近最久未使用(LRU)置換算法

選擇最近最長時間未訪問過的頁面予以淘汰,它認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。該算法為每個頁面設置一個訪問字段,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。

4. 時鍾(CLOCK)置換算法

LRU算法的性能接近於OPT,但是實現起來比較困難,且開銷大;FIFO算法實現簡單,但性能差。所以操作系統的設計者嘗試了很多算法,試圖用比較小的開銷接近LRU的性能,這類算法都是CLOCK算法的變體。

簡單的CLOCK算法是給每一幀關聯一個附加位,稱為使用位。當某一頁首次裝入主存時,該幀的使用位(u)設置為1;當該頁隨后再被訪問到時,它的使用位也被置為1。對於頁替換算法,用於替換的候選幀集合看做一個循環緩沖區,並且有一個指針與之相關聯。當某一頁被替換時,該指針被設置成指向緩沖區中的下一幀。當需要替換一頁時,操作系統掃描緩沖區,以查找使用位被置為0的一幀。每當遇到一個使用位為1的幀時,操作系統就將該位重新置為0;如果在這個過程開始時,緩沖區中所有幀的使用位均為0,則選擇遇到的第一個幀替換;如果所有幀的使用位均為1,則指針在緩沖區中完整地循環一周,把所有使用位都置為0,並且停留在最初的位置上,替換該幀中的頁。由於該算法循環地檢查各頁面的情況,故稱為CLOCK算法,又稱為最近未用(Not Recently Used, NRU)算法。

CLOCK算法的性能比較接近LRU,而通過增加使用的位數目,可以使得CLOCK算法更加高效。在使用位的基礎上再增加一個修改位,則得到改進型的CLOCK置換算法。這樣,每一幀都處於以下四種情況之一:

  • 最近未被訪問,也未被修改(u=0, m=0)。
  • 最近被訪問,但未被修改(u=1, m=0)。
  • 最近未被訪問,但被修改(u=0, m=1)。
  • 最近被訪問,被修改(u=1, m=1)。

 虛擬頁式存儲中的頁表項結構:

駐留位:表示該頁是否在內存

1表示該頁位於內存中,該頁表項是有效的,可以使用

0表示該頁當前在外存中,訪問該頁表項將導致缺頁異常

修改位:表示在內存中的該頁是否被修改過

回收該物理頁面時,據此判斷是否要把它的內容寫回外存

訪問位:表示該頁面是否被訪問過(讀或寫)

用於頁面置換算法

保護位:表示該頁的允許訪問方式

只讀、可讀寫、可執行等

 

計算機如何訪問一個文件的字節流?

說了Linux從inode節點找到磁盤地址,進行讀取

常見的操作系統進程調度算法?

https://blog.csdn.net/luyafei_89430/article/details/12971171


免責聲明!

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



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