我和麪試官之間關於操作系統的一場對弈!寫了很久,希望對你有幫助!

來自公衆號:JavaGuide

大家好,我是 Guide哥!很多讀者抱怨計算操作系統的知識點比較繁雜,自己也沒有多少耐心去看,但是面試的時候又經常會遇到。所以,我帶着我整理好的操作系統的常見問題來啦!這篇文章總結了一些我覺得比較重要的操作系統相關的問題比如進程管理內存管理虛擬內存等等。

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

我個人覺得學好操作系統還是非常有用的,具體可以看我昨天在星球分享的一段話:

這篇文章只是對一些操作系統比較重要概念的一個概覽,深入學習的話,建議大家還是老老實實地去看書。另外,  這篇文章的很多內容參考了《現代操作系統》第三版這本書,非常感謝。

一 操作系統基礎

1.1 什麼是操作系統?

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

  :我通過以下四點向您介紹一下什麼是操作系統吧

  1. 操作系統(Operating System,簡稱OS)是管理計算機硬件與軟件資源的程序,是計算機系統的內核與基石;

  2. 操作系統本質上是運行在計算機上的軟件程序 ;

  3. 操作系統爲用戶提供一個與系統交互的操作界面 ;

  4. 操作系統分內核與外殼(我們可以把外殼理解成圍繞着內核的應用程序,而內核可以理解爲能直接操作硬件的程序)。

關於內核多插一嘴:內核負責管理系統的進程、內存、設備驅動程序、文件和網絡系統等等,決定着系統的性能和穩定性。是連接應用程序和硬件的橋樑。內核就是操作系統背後黑盒的核心。

1.2 系統調用

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

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

根據進程訪問資源的特點,我們可以把進程在系統上的運行分爲兩個級別:

  1. 用戶態(user mode) : 用戶態運行的進程或可以直接讀取用戶程序的數據。

  2. 系統態(kernel mode):可以簡單的理解系統態運行的進程或程序幾乎可以訪問計算機的任何資源,不受限制。

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

我們運行的程序基本都是運行在用戶態,如果我們調用操作系統提供的系統態級別的子功能咋辦呢?那就需要系統調用了!

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

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

  • 設備管理。完成設備的請求或釋放,以及設備啓動等功能。

  • 文件管理。完成文件的讀、寫、創建及刪除等功能。

  • 進程控制。完成進程的創建、撤銷、阻塞及喚醒等功能。

  • 進程通信。完成進程之間的消息傳遞或信號傳遞等功能。

  • 內存管理。完成內存的分配、回收以及獲取作業佔用內存區大小及地址等功能。

二 進程和線程

2.1進程和線程的區別

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

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

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

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

2.2 進程有哪幾種狀態?

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

我們一般把進程大致分爲 5 種狀態,這一點和線程很像!

  • 創建狀態(new) :進程正在被創建,尚未到就緒狀態。

  • 就緒狀態(ready) :進程已處於準備運行狀態,即進程獲得了除了處理器之外的一切所需資源,一旦得到處理器資源(處理器分配的時間片)即可運行。

  • 運行狀態(running) :進程正在處理器上上運行(單核CPU下任意時刻只有一個進程處於運行狀態)。

  • 阻塞狀態(waiting) :又稱爲等待狀態,進程正在等待某一事件而暫停運行如等待某資源爲可用或等待 IO 操作完成。即使處理器空閒,該進程也不能運行。

  • 結束狀態(terminated) :進程正在從系統中消失。可能是進程正常結束或其他原因中斷退出運行。

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 等。段式管理通過段表對應邏輯地址和物理地址。

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

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

3.3 快表和多級頁表

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

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

  1. 虛擬地址到物理地址的轉換要快。

  2. 解決虛擬地址空間大,頁表也會很大的問題。

快表

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

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

  1. 根據虛擬地址中的頁號查快表;

  2. 如果該頁在快表中,直接從快表中讀取相應的物理地址;

  3. 如果該頁不在快表中,就訪問內存中的頁表,再從頁表中得到物理地址,同時將頁表中的該映射表項添加到快表中;

  4. 當快表填滿後,又要登記新頁時,就按照一定的淘汰策略淘汰掉快表中的一個頁。

看完了之後你會發現快表和我們平時經常在我們開發的系統使用的緩存(比如 Redis)很像,的確是這樣的,操作系統中的很多思想、很多經典的算法,你都可以在我們日常開發使用的各種工具或者框架中找到它們的影子。

多級頁表

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

  • 多級頁表如何節約內存:https://www.polarxiong.com/archives/多級頁表如何節約內存.html

總結

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

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

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

  1. 共同點 :

    • 分頁機制和分段機制都是爲了提高內存利用率,較少內存碎片。

    • 頁和段都是離散存儲的,所以兩者都是離散分配內存的方式。但是,每個頁和段中的內存是連續的。

  2. 區別 :

    • 頁的大小是固定的,由操作系統決定;而段的大小不固定,取決於我們當前運行的程序。

    • 分頁僅僅是爲了滿足操作系統內存管理的需求,而段是邏輯信息的單位,在程序中可以體現爲代碼段,數據段,能夠更好滿足用戶的需要。

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

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

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

3.6 CPU尋址瞭解嗎?爲什麼需要虛擬地址空間?

👨‍💻面試官 :CPU尋址瞭解嗎?爲什麼需要虛擬地址空間?

🙋  :這部分我真不清楚!

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

這部分內容參考了Microsoft官網的介紹,地址:https://msdn.microsoft.com/zh-cn/library/windows/hardware/hh439648(v=vs.85).aspx

 

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

爲什麼要有虛擬地址空間呢?

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

  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

  • 《計算機操作系統—湯小丹》第四版

  • 《深入理解計算機系統》

  • https://zh.wikipedia.org/wiki/輸入輸出內存管理單元

  • https://baike.baidu.com/item/快表/19781679

  • https://www.jianshu.com/p/1d47ed0b46d5

  • https://www.studytonight.com/operating-system

  • https://www.geeksforgeeks.org/interprocess-communication-methods/

  • https://juejin.im/post/59f8691b51882534af254317

  • 王道考研操作系統知識點整理:https://wizardforcel.gitbooks.io/wangdaokaoyan-os/content/13.html

 

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