我和麪試官之間關於操做系統的一場對弈!寫了好久,但願對你有幫助!

你們好,我是 Guide 哥!不少讀者抱怨計算操做系統的知識點比較繁雜,本身也沒有多少耐心去看,可是面試的時候又常常會遇到。因此,我帶着我整理好的操做系統的常見問題來啦!這篇文章總結了一些我以爲比較重要的操做系統相關的問題好比進程管理內存管理虛擬內存等等。html

文章形式經過大部分比較喜歡的面試官和求職者之間的對話形式展開。另外,Guide 哥也只是在大學的時候學習過操做系統,不過基本都忘了,爲了寫這篇文章這段時間看了不少相關的書籍和博客。若是文中有任何須要補充和完善的地方,你均可以在評論區指出。若是以爲內容不錯的話,不要忘記點個在看哦!java

我我的以爲學好操做系統仍是很是有用的,具體能夠看我昨天在星球分享的一段話:git

<img src="https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/image-20200329145912767.png" height="666"/>github

這篇文章只是對一些操做系統比較重要概念的一個概覽,深刻學習的話,建議你們仍是老老實實地去看書。另外, 這篇文章的不少內容參考了《現代操做系統》第三版這本書,很是感謝。面試

一 操做系統基礎

面試官頂着蓬鬆的假髮向我走來,只見他一手拿着厚重的 Thinkpad ,一手提着他那淡黃的長裙。算法

<img src="http://wx4.sinaimg.cn/large/ceeb653ely1gd8wj5evc4j20i00n0dh0.jpg" height="300"></img>編程

1.1 什麼是操做系統?

👨‍💻面試官 : 先來個簡單問題吧!什麼是操做系統?windows

🙋 :我經過如下四點向您介紹一下什麼是操做系統吧!數組

  1. 操做系統(Operating System,簡稱 OS)是管理計算機硬件與軟件資源的程序,是計算機系統的內核與基石;
  2. 操做系統本質上是運行在計算機上的軟件程序 ;
  3. 操做系統爲用戶提供一個與系統交互的操做界面 ;
  4. 操做系統份內核與外殼(咱們能夠把外殼理解成圍繞着內核的應用程序,而內核就是能操做硬件的程序)。
關於內核多插一嘴:內核負責管理系統的進程、內存、設備驅動程序、文件和網絡系統等等,決定着系統的性能和穩定性。是鏈接應用程序和硬件的橋樑。
內核就是操做系統背後黑盒的核心。

操做系統份內核與外殼

1.2 系統調用

👨‍💻面試官什麼是系統調用呢? 能不能詳細介紹一下。緩存

🙋 :介紹系統調用以前,咱們先來了解一下用戶態和系統態。

<img src="http://ww4.sinaimg.cn/large/006r3PQBjw1fbimb5c3srj30b40b40t9.jpg" height="200" width="2"/>

根據進程訪問資源的特色,咱們能夠把進程在系統上的運行分爲兩個級別:

  1. 用戶態(user mode) : 用戶態運行的進程或能夠直接讀取用戶程序的數據。
  2. 系統態(kernel mode):能夠簡單的理解系統態運行的進程或程序幾乎能夠訪問計算機的任何資源,不受限制。

說了用戶態和系統態以後,那麼什麼是系統調用呢?

咱們運行的程序基本都是運行在用戶態,若是咱們調用操做系統提供的系統態級別的子功能咋辦呢?那就須要系統調用了!

也就是說在咱們運行的用戶程序中,凡是與系統態級別的資源有關的操做(如文件管理、進程控制、內存管理等),都必須經過系統調用方式向操做系統提出服務請求,並由操做系統代爲完成。

這些系統調用按功能大體可分爲以下幾類:

  • 設備管理。完成設備的請求或釋放,以及設備啓動等功能。
  • 文件管理。完成文件的讀、寫、建立及刪除等功能。
  • 進程控制。完成進程的建立、撤銷、阻塞及喚醒等功能。
  • 進程通訊。完成進程之間的消息傳遞或信號傳遞等功能。
  • 內存管理。完成內存的分配、回收以及獲取做業佔用內存區大小及地址等功能。

二 進程和線程

2.1 進程和線程的區別

👨‍💻面試官: 好的!我明白了!那你再說一下: 進程和線程的區別

🙋 我: 好的! 下圖是 Java 內存區域,咱們從 JVM 的角度來講一下線程和進程之間的關係吧!

若是你對 Java 內存區域 (運行時數據區) 這部分知識不太瞭解的話能夠閱讀一下這篇文章: 《多是把 Java 內存區域講的最清楚的一篇文章》>)

jvm運行時數據區域

從上圖能夠看出:一個進程中能夠有多個線程,多個線程共享進程的方法區 (JDK1.8 以後的元空間)資源,可是每一個線程有本身的程序計數器虛擬機棧本地方法棧

總結: 線程是進程劃分紅的更小的運行單位,一個進程在其執行的過程當中能夠產生多個線程。線程和進程最大的不一樣在於基本上各進程是獨立的,而各線程則不必定,由於同一進程中的線程極有可能會相互影響。線程執行開銷小,但不利於資源的管理和保護;而進程正相反。

2.2 進程有哪幾種狀態?

👨‍💻面試官 : 那你再說說進程有哪幾種狀態?

🙋 :咱們通常把進程大體分爲 5 種狀態,這一點和線程很像!

  • 建立狀態(new) :進程正在被建立,還沒有到就緒狀態。
  • 就緒狀態(ready) :進程已處於準備運行狀態,即進程得到了除了處理器以外的一切所需資源,一旦獲得處理器資源(處理器分配的時間片)便可運行。
  • 運行狀態(running) :進程正在處理器上上運行(單核 CPU 下任意時刻只有一個進程處於運行狀態)。
  • 阻塞狀態(waiting) :又稱爲等待狀態,進程正在等待某一事件而暫停運行如等待某資源爲可用或等待 IO 操做完成。即便處理器空閒,該進程也不能運行。
  • 結束狀態(terminated) :進程正在從系統中消失。多是進程正常結束或其餘緣由中斷退出運行。

process-state

2.3 進程間的通訊方式

👨‍💻面試官進程間的通訊常見的的有哪幾種方式呢?

🙋 :大概有 7 種常見的進程間的通訊方式。

下面這部分總結參考了: 《進程間通訊 IPC (InterProcess Communication)》 這篇文章,推薦閱讀,總結的很是不錯。
  1. 管道/匿名管道(Pipes) :用於具備親緣關係的父子進程間或者兄弟進程之間的通訊。
  2. 有名管道(Names Pipes) : 匿名管道因爲沒有名字,只能用於親緣關係的進程間通訊。爲了克服這個缺點,提出了有名管道。有名管道嚴格遵循先進先出(first in first out)。有名管道以磁盤文件的方式存在,能夠實現本機任意兩個進程通訊。
  3. 信號(Signal) :信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生;
  4. 消息隊列(Message Queuing) :消息隊列是消息的鏈表,具備特定的格式,存放在內存中並由消息隊列標識符標識。管道和消息隊列的通訊數據都是先進先出的原則。與管道(無名管道:只存在於內存中的文件;命名管道:存在於實際的磁盤介質或者文件系統)不一樣的是消息隊列存放在內核中,只有在內核重啓(即,操做系統重啓)或者顯示地刪除一個消息隊列時,該消息隊列纔會被真正的刪除。消息隊列能夠實現消息的隨機查詢,消息不必定要以先進先出的次序讀取,也能夠按消息的類型讀取.比 FIFO 更有優點。消息隊列克服了信號承載信息量少,管道只能承載無格式字 節流以及緩衝區大小受限等缺。
  5. 信號量(Semaphores) :信號量是一個計數器,用於多進程對共享數據的訪問,信號量的意圖在於進程間同步。這種通訊方式主要用於解決與同步相關的問題並避免競爭條件。
  6. 共享內存(Shared memory) :使得多個進程能夠訪問同一塊內存空間,不一樣進程能夠及時看到對方進程中對共享內存中數據的更新。這種方式須要依靠某種同步操做,如互斥鎖和信號量等。能夠說這是最有用的進程間通訊方式。
  7. 套接字(Sockets) : 此方法主要用於在客戶端和服務器之間經過網絡進行通訊。套接字是支持 TCP/IP 的網絡通訊的基本操做單元,能夠看作是不一樣主機之間的進程進行雙向通訊的端點,簡單的說就是通訊的兩方的一種約定,用套接字中的相關函數來完成通訊過程。

2.4 線程間的同步的方式

👨‍💻面試官那線程間的同步的方式有哪些呢?

🙋 :線程同步是兩個或多個共享關鍵資源的線程的併發執行。應該同步線程以免關鍵的資源使用衝突。操做系統通常有下面三種線程同步的方式:

  1. 互斥量(Mutex):採用互斥對象機制,只有擁有互斥對象的線程纔有訪問公共資源的權限。由於互斥對象只有一個,因此能夠保證公共資源不會被多個線程同時訪問。好比 Java 中的 synchronized 關鍵詞和各類 Lock 都是這種機制。
  2. 信號量(Semphares) :它容許同一時刻多個線程訪問同一資源,可是須要控制同一時刻訪問此資源的最大線程數量
  3. 事件(Event) :Wait/Notify:經過通知操做的方式來保持多線程同步,還能夠方便的實現多線程優先級的比較操

2.5 進程的調度算法

👨‍💻面試官你知道操做系統中進程的調度算法有哪些嗎?

🙋 :嗯嗯!這個咱們大學的時候學過,是一個很重要的知識點!

爲了肯定首先執行哪一個進程以及最後執行哪一個進程以實現最大 CPU 利用率,計算機科學家已經定義了一些算法,它們是:

  • 先到先服務(FCFS)調度算法 : 從就緒隊列中選擇一個最早進入該隊列的進程爲之分配資源,使它當即執行並一直執行到完成或發生某事件而被阻塞放棄佔用 CPU 時再從新調度。
  • 短做業優先(SJF)的調度算法 : 從就緒隊列中選出一個估計運行時間最短的進程爲之分配資源,使它當即執行並一直執行到完成或發生某事件而被阻塞放棄佔用 CPU 時再從新調度。
  • 時間片輪轉調度算法 : 時間片輪轉調度是一種最古老,最簡單,最公平且使用最廣的算法,又稱 RR(Round robin)調度。每一個進程被分配一個時間段,稱做它的時間片,即該進程容許運行的時間。
  • 多級反饋隊列調度算法 :前面介紹的幾種進程調度的算法都有必定的侷限性。如短進程優先的調度算法,僅照顧了短進程而忽略了長進程 。多級反饋隊列調度算法既能使高優先級的做業獲得響應又能使短做業(進程)迅速完成。,於是它是目前被公認的一種較好的進程調度算法,UNIX 操做系統採起的即是這種調度算法。
  • 優先級調度 : 爲每一個流程分配優先級,首先執行具備最高優先級的進程,依此類推。具備相同優先級的進程以 FCFS 方式執行。能夠根據內存要求,時間要求或任何其餘資源要求來肯定優先級。

三 操做系統內存管理基礎

3.1 內存管理介紹

👨‍💻 面試官: 操做系統的內存管理主要是作什麼?

🙋 我: 操做系統的內存管理主要負責內存的分配與回收(malloc 函數:申請內存,free 函數:釋放內存),另外地址轉換也就是將邏輯地址轉換成相應的物理地址等功能也是操做系統內存管理作的事情。

3.2 常見的幾種內存管理機制

👨‍💻 面試官: 操做系統的內存管理機制瞭解嗎?內存管理有哪幾種方式?

🙋 我: 這個在學習操做系統的時候有了解過。

簡單分爲連續分配管理方式非連續分配管理方式這兩種。連續分配管理方式是指爲一個用戶程序分配一個連續的內存空間,常見的如 塊式管理 。一樣地,非連續分配管理方式容許一個程序使用的內存分佈在離散或者說不相鄰的內存中,常見的如頁式管理段式管理

  1. 塊式管理 : 遠古時代的計算機操系統的內存管理方式。將內存分爲幾個固定大小的塊,每一個塊中只包含一個進程。若是程序運行須要內存的話,操做系統就分配給它一塊,若是程序運行只須要很小的空間的話,分配的這塊內存很大一部分幾乎被浪費了。這些在每一個塊中未被利用的空間,咱們稱之爲碎片。
  2. 頁式管理 :把主存分爲大小相等且固定的一頁一頁的形式,頁較小,相對相比於塊式管理的劃分力度更大,提升了內存利用率,減小了碎片。頁式管理經過頁表對應邏輯地址和物理地址。
  3. 段式管理 : 頁式管理雖然提升了內存利用率,可是頁式管理其中的頁實際並沒有任何實際意義。 段式管理把主存分爲一段段的,每一段的空間又要比一頁的空間小不少 。可是,最重要的是段是有實際意義的,每一個段定義了一組邏輯信息,例如,有主程序段 MAIN、子程序段 X、數據段 D 及棧段 S 等。 段式管理經過段表對應邏輯地址和物理地址。

👨‍💻面試官 : 回答的還不錯!不過漏掉了一個很重要的 段頁式管理機制 。段頁式管理機制結合了段式管理和頁式管理的優勢。簡單來講段頁式管理機制就是把主存先分紅若干段,每一個段又分紅若干頁,也就是說 段頁式管理機制 中段與段之間以及段的內部的都是離散的。

🙋 :謝謝面試官!剛剛把這個給忘記了~

<img src="http://ww4.sinaimg.cn/large/6af89bc8gw1f8txoxc2asj20k00k0mxv.jpg" alt="這就很尷尬了_尷尬表情" height="200" width="200"/>

3.3 快表和多級頁表

👨‍💻面試官 : 頁表管理機制中有兩個很重要的概念:快表和多級頁表,這兩個東西分別解決了頁表管理中很重要的兩個問題。你給我簡單介紹一下吧!

🙋 :在分頁內存管理中,很重要的兩點是:

  1. 虛擬地址到物理地址的轉換要快。
  2. 解決虛擬地址空間大,頁表也會很大的問題。

快表

爲了解決虛擬地址到物理地址的轉換速度,操做系統在 頁表方案 基礎之上引入了 快表 來加速虛擬地址到物理地址的轉換。咱們能夠把塊表理解爲一種特殊的高速緩衝存儲器(Cache),其中的內容是頁表的一部分或者所有內容。做爲頁表的 Cache,它的做用與頁表類似,可是提升了訪問速率。因爲採用頁表作地址轉換,讀寫內存數據時 CPU 要訪問兩次主存。有了快表,有時只要訪問一次高速緩衝存儲器,一次主存,這樣可加速查找並提升指令執行速度。

使用快表以後的地址轉換流程是這樣的:

  1. 根據虛擬地址中的頁號查快表;
  2. 若是該頁在快表中,直接從快表中讀取相應的物理地址;
  3. 若是該頁不在快表中,就訪問內存中的頁表,再從頁表中獲得物理地址,同時將頁表中的該映射表項添加到快表中;
  4. 當快表填滿後,又要登記新頁時,就按照必定的淘汰策略淘汰掉快表中的一個頁。

看完了以後你會發現快表和咱們平時常常在咱們開發的系統使用的緩存(好比 Redis)很像,的確是這樣的,操做系統中的不少思想、不少經典的算法,你均可以在咱們平常開發使用的各類工具或者框架中找到它們的影子。

多級頁表

引入多級頁表的主要目的是爲了不把所有頁表一直放在內存中佔用過多空間,特別是那些根本就不須要的頁表就不須要保留在內存中。多級頁表屬於時間換空間的典型場景,具體能夠查看下面這篇文章

總結

爲了提升內存的空間性能,提出了多級頁表的概念;可是提到空間性能是以浪費時間性能爲基礎的,所以爲了補充損失的時間性能,提出了快表(即 TLB)的概念。 不管是快表仍是多級頁表實際上都利用到了程序的局部性原理,局部性原理在後面的虛擬內存這部分會介紹到。

3.4 分頁機制和分段機制的共同點和區別

👨‍💻面試官分頁機制和分段機制有哪些共同點和區別呢?

🙋

<img src="http://wx3.sinaimg.cn/large/de80a5ably1gcuslckpygg208c08cwfu.gif" height="200" width="200"></img>

  1. 共同點

    • 分頁機制和分段機制都是爲了提升內存利用率,較少內存碎片。
    • 頁和段都是離散存儲的,因此二者都是離散分配內存的方式。可是,每一個頁和段中的內存是連續的。
  2. 區別

    • 頁的大小是固定的,由操做系統決定;而段的大小不固定,取決於咱們當前運行的程序。
    • 分頁僅僅是爲了知足操做系統內存管理的需求,而段是邏輯信息的單位,在程序中能夠體現爲代碼段,數據段,可以更好知足用戶的須要。

3.5 邏輯(虛擬)地址和物理地址

👨‍💻面試官 :你剛剛還提到了邏輯地址和物理地址這兩個概念,我不太清楚,你能爲我解釋一下不?

🙋 我: em...好的嘛!咱們編程通常只有可能和邏輯地址打交道,好比在 C 語言中,指針裏面存儲的數值就能夠理解成爲內存裏的一個地址,這個地址也就是咱們說的邏輯地址,邏輯地址由操做系統決定。物理地址指的是真實物理內存中地址,更具體一點來講就是內存地址寄存器中的地址。物理地址是內存單元真正的地址。

3.6 CPU 尋址瞭解嗎?爲何須要虛擬地址空間?

👨‍💻面試官CPU 尋址瞭解嗎?爲何須要虛擬地址空間?

🙋 :這部分我真不清楚!

<img src="http://wx2.sinaimg.cn/bmiddle/a9cf8ef6ly1fhqpdipcyfj20ce0b4wex.jpg " height="300px" />

因而面試完以後我默默去查閱了相關文檔!留下了沒有技術的淚水。。。

這部份內容參考了 Microsoft 官網的介紹,地址: https://msdn.microsoft.com/zh...

現代處理器使用的是一種稱爲 虛擬尋址(Virtual Addressing) 的尋址方式。使用虛擬尋址,CPU 須要將虛擬地址翻譯成物理地址,這樣才能訪問到真實的物理內存。 實際上完成虛擬地址轉換爲物理地址轉換的硬件是 CPU 中含有一個被稱爲 內存管理單元(Memory Management Unit, MMU) 的硬件。以下圖所示:

MMU_principle_updated

爲何要有虛擬地址空間呢?

先從沒有虛擬地址空間的時候提及吧!沒有虛擬地址空間的時候,程序都是直接訪問和操做的都是物理內存 。可是這樣有什麼問題呢?

  1. 用戶程序能夠訪問任意內存,尋址內存的每一個字節,這樣就很容易(有意或者無心)破壞操做系統,形成操做系統崩潰。
  2. 想要同時運行多個程序特別困難,好比你想同時運行一個微信和一個 QQ 音樂都不行。爲何呢?舉個簡單的例子:微信在運行的時候給內存地址 1xxx 賦值後,QQ 音樂也一樣給內存地址 1xxx 賦值,那麼 QQ 音樂對內存的賦值就會覆蓋微信以前所賦的值,這就形成了微信這個程序就會崩潰。

總結來講:若是直接把物理地址暴露出來的話會帶來嚴重問題,好比可能對操做系統形成傷害以及給同時運行多個程序形成困難。

經過虛擬地址訪問內存有如下優點:

  • 程序可使用一系列相鄰的虛擬地址來訪問物理內存中不相鄰的大內存緩衝區。
  • 程序可使用一系列虛擬地址來訪問大於可用物理內存的內存緩衝區。當物理內存的供應量變小時,內存管理器會將物理內存頁(一般大小爲 4 KB)保存到磁盤文件。數據或代碼頁會根據須要在物理內存與磁盤之間移動。
  • 不一樣進程使用的虛擬地址彼此隔離。一個進程中的代碼沒法更改正在由另外一進程或操做系統使用的物理內存。

四 虛擬內存

4.1 什麼是虛擬內存(Virtual Memory)?

👨‍💻面試官 :再問你一個常識性的問題!什麼是虛擬內存(Virtual Memory)?

🙋 :這個在咱們平時使用電腦特別是 Windows 系統的時候太常見了。不少時候咱們使用點開了不少佔內存的軟件,這些軟件佔用的內存可能已經遠遠超出了咱們電腦自己具備的物理內存。爲何能夠這樣呢? 正是由於 虛擬內存 的存在,經過 虛擬內存 可讓程序能夠擁有超過系統物理內存大小的可用內存空間。另外,虛擬內存爲每一個進程提供了一個一致的、私有的地址空間,它讓每一個進程產生了一種本身在獨享主存的錯覺(每一個進程擁有一片連續完整的內存空間)。這樣會更加有效地管理內存並減小出錯。

虛擬內存是計算機系統內存管理的一種技術,咱們能夠手動設置本身電腦的虛擬內存。不要單純認爲虛擬內存只是「使用硬盤空間來擴展內存「的技術。虛擬內存的重要意義是它定義了一個連續的虛擬地址空間,而且 把內存擴展到硬盤空間。推薦閱讀:《虛擬內存的那點事兒》

維基百科中有幾句話是這樣介紹虛擬內存的。

虛擬內存 使得應用程序認爲它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它一般是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在須要時進行數據交換。與沒有使用虛擬內存技術的系統相比,使用這種技術的系統使得大型程序的編寫變得更容易,對真正的物理內存(例如 RAM)的使用也更有效率。目前,大多數操做系統都使用了虛擬內存,如 Windows 家族的「虛擬內存」;Linux 的「交換空間」等。From: https://zh.wikipedia.org/wiki...

4.2 局部性原理

👨‍💻面試官 :要想更好地理解虛擬內存技術,必需要知道計算機中著名的局部性原理。另外,局部性原理既適用於程序結構,也適用於數據結構,是很是重要的一個概念。

🙋 :局部性原理是虛擬內存技術的基礎,正是由於程序運行具備局部性原理,才能夠只裝入部分程序到內存就開始運行。

如下內容摘自《計算機操做系統教程》 第 4 章存儲器管理。

早在 1968 年的時候,就有人指出咱們的程序在執行的時候每每呈現局部性規律,也就是說在某個較短的時間段內,程序執行侷限於某一小部分,程序訪問的存儲空間也侷限於某個區域。

局部性原理表如今如下兩個方面:

  1. 時間局部性 :若是程序中的某條指令一旦執行,不久之後該指令可能再次執行;若是某數據被訪問過,不久之後該數據可能再次被訪問。產生時間局部性的典型緣由,是因爲在程序中存在着大量的循環操做。
  2. 空間局部性 :一旦程序訪問了某個存儲單元,在不久以後,其附近的存儲單元也將被訪問,即程序在一段時間內所訪問的地址,可能集中在必定的範圍以內,這是由於指令一般是順序存放、順序執行的,數據也通常是以向量、數組、表等形式簇聚存儲的。

時間局部性是經過將近來使用的指令和數據保存到高速緩存存儲器中,並使用高速緩存的層次結構實現。空間局部性一般是使用較大的高速緩存,並將預取機制集成到高速緩存控制邏輯中實現。虛擬內存技術實際上就是創建了 「內存一外存」的兩級存儲器的結構,利用局部性原理實現髙速緩存。

4.3 虛擬存儲器

👨‍💻面試官 :都說了虛擬內存了。你再講講虛擬存儲器把!

🙋

這部份內容來自: 王道考研操做系統知識點整理

基於局部性原理,在程序裝入時,能夠將程序的一部分裝入內存,而將其餘部分留在外存,就能夠啓動程序執行。因爲外存每每比內存大不少,因此咱們運行的軟件的內存大小其實是能夠比計算機系統實際的內存大小大的。在程序執行過程當中,當所訪問的信息不在內存時,由操做系統將所須要的部分調入內存,而後繼續執行程序。另外一方面,操做系統將內存中暫時不使用的內容換到外存上,從而騰出空間存放將要調入內存的信息。這樣,計算機好像爲用戶提供了一個比實際內存大的多的存儲器——虛擬存儲器

實際上,我以爲虛擬內存一樣是一種時間換空間的策略,你用 CPU 的計算時間,頁的調入調出花費的時間,換來了一個虛擬的更大的空間來支持程序的運行。不得不感嘆,程序世界幾乎不是時間換空間就是空間換時間。

4.4 虛擬內存的技術實現

👨‍💻面試官虛擬內存技術的實現呢?

🙋 虛擬內存的實現須要創建在離散分配的內存管理方式的基礎上。 虛擬內存的實現有如下三種方式:

  1. 請求分頁存儲管理 :創建在分頁管理之上,爲了支持虛擬存儲器功能而增長了請求調頁功能和頁面置換功能。請求分頁是目前最經常使用的一種實現虛擬存儲器的方法。請求分頁存儲管理系統中,在做業開始運行以前,僅裝入當前要執行的部分段便可運行。假如在做業運行的過程當中發現要訪問的頁面不在內存,則由處理器通知操做系統按照對應的頁面置換算法將相應的頁面調入到主存,同時操做系統也能夠將暫時不用的頁面置換到外存中。
  2. 請求分段存儲管理 :創建在分段存儲管理之上,增長了請求調段功能、分段置換功能。請求分段儲存管理方式就如同請求分頁儲存管理方式同樣,在做業開始運行以前,僅裝入當前要執行的部分段便可運行;在執行過程當中,可以使用請求調入中斷動態裝入要訪問但又不在內存的程序段;當內存空間已滿,而又須要裝入新的段時,根據置換功能適當調出某個段,以便騰出空間而裝入新的段。
  3. 請求段頁式存儲管理

這裏多說一下?不少人容易搞混請求分頁與分頁存儲管理,二者有何不一樣呢?

請求分頁存儲管理創建在分頁管理之上。他們的根本區別是是否將程序所有所需的所有地址空間都裝入主存,這也是請求分頁存儲管理能夠提供虛擬內存的緣由,咱們在上面已經分析過了。

它們之間的根本區別在因而否將一做業的所有地址空間同時裝入主存。請求分頁存儲管理不要求將做業所有地址空間同時裝入主存。基於這一點,請求分頁存儲管理能夠提供虛存,而分頁存儲管理卻不能提供虛存。

無論是上面那種實現方式,咱們通常都須要:

  1. 必定容量的內存和外存:在載入程序的時候,只須要將程序的一部分裝入內存,而將其餘部分留在外存,而後程序就能夠執行了;
  2. 缺頁中斷:若是需執行的指令或訪問的數據還沒有在內存(稱爲缺頁或缺段),則由處理器通知操做系統將相應的頁面或段調入到內存,而後繼續執行程序;
  3. 虛擬地址空間 :邏輯地址到物理地址的變換。

4.5 頁面置換算法

👨‍💻面試官 :虛擬內存管理很重要的一個概念就是頁面置換算法。那你說一下 頁面置換算法的做用?常見的頁面置換算法有哪些?

🙋

這個題目常常做爲筆試題出現,網上已經給出了很不錯的回答,我這裏只是總結整理了一下。

地址映射過程當中,若在頁面中發現所要訪問的頁面不在內存中,則發生缺頁中斷 。

缺頁中斷 就是要訪問的 不在主存,須要操做系統將其調入主存後再進行訪問。 在這個時候,被內存映射的文件實際上成了一個分頁交換文件。

當發生缺頁中斷時,若是當前內存中並無空閒的頁面,操做系統就必須在內存選擇一個頁面將其移出內存,以便爲即將調入的頁面讓出空間。用來選擇淘汰哪一頁的規則叫作頁面置換算法,咱們能夠把頁面置換算法當作是淘汰頁面的規則。

  • OPT 頁面置換算法(最佳頁面置換算法) :理想狀況,不可能實現,通常做爲衡量其餘置換算法的方法。
  • FIFO 頁面置換算法(先進先出頁面置換算法) : 老是淘汰最早進入內存的頁面,即選擇在內存中駐留時間最久的頁面進行淘汰。
  • LRU 頁面置換算法(最近未使用頁面置換算法) :LRU(Least Currently Used)算法賦予每一個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 T,當須淘汰一個頁面時,選擇現有頁面中其 T 值最大的,即最近最久未使用的頁面予以淘汰。
  • LFU 頁面置換算法(最少使用頁面排序算法) : LFU(Least Frequently Used)算法會讓系統維護一個按最近一次訪問時間排序的頁面鏈表,鏈表首節點是最近剛剛使用過的頁面,鏈表尾節點是最久未使用的頁面。訪問內存時,找到相應頁面,並把它移到鏈表之首。缺頁時,置換鏈表尾節點的頁面。也就是說內存內使用越頻繁的頁面,被保留的時間也相對越長。

Reference

做者介紹: Github 70k Star 項目 JavaGuide(公衆號同名) 做者。每週都會在公衆號更新一些本身原創乾貨。公衆hao後臺回覆「1」領取Java工程師必備學習資料+面試突擊pdf。

相關文章
相關標籤/搜索