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

2020-12-18 計算機java編程

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

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

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

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

一 作業系統基礎

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

1.1 什麼是作業系統?

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

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

作業系統(Operating System,簡稱 OS)是管理計算機硬體與軟體資源的程序,是計算機系統的內核與基石;作業系統本質上是運行在計算機上的軟體程序 ;作業系統為用戶提供一個與系統交互的操作界面 ;作業系統分內核與外殼(我們可以把外殼理解成圍繞著內核的應用程式,而內核就是能操作硬體的程序)。

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

1.2 系統調用

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

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

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

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

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

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

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

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

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

二 進程和線程

2.1 進程和線程的區別

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

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

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

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

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

2.2 進程有哪幾種狀態?

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

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

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

2.3 進程間的通信方式

面試官進程間的通信常見的的有哪幾種方式呢?

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

下面這部分總結參考了:《進程間通信 IPC (InterProcess Communication)》 這篇文章,推薦閱讀,總結的非常不錯。

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

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

:線程同步是兩個或多個共享關鍵資源的線程的並發執行。應該同步線程以避免關鍵的資源使用衝突。作業系統一般有下面三種線程同步的方式:

互斥量(Mutex):採用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限。因為互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問。比如 Java 中的 synchronized 關鍵詞和各種 Lock 都是這種機制。信號量(Semphares) :它允許同一時刻多個線程訪問同一資源,但是需要控制同一時刻訪問此資源的最大線程數量事件(Event) :Wait/Notify:通過通知操作的方式來保持多線程同步,還可以方便的實現多線程優先級的比較操

2.5 進程的調度算法

面試官你知道作業系統中進程的調度算法有哪些嗎?

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

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

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

三 作業系統內存管理基礎

3.1 內存管理介紹

面試官: 作業系統的內存管理主要是做什麼?

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

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

面試官: 作業系統的內存管理機制了解嗎?內存管理有哪幾種方式?

我:這個在學習作業系統的時候有了解過。

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

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

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

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

3.3 快表和多級頁表

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

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

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

快表

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

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

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

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

多級頁表

引入多級頁表的主要目的是為了避免把全部頁表一直放在內存中佔用過多空間,特別是那些根本就不需要的頁表就不需要保留在內存中。

總結

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

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

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

共同點分頁機制和分段機制都是為了提高內存利用率,較少內存碎片。頁和段都是離散存儲的,所以兩者都是離散分配內存的方式。但是,每個頁和段中的內存是連續的。區別頁的大小是固定的,由作業系統決定;而段的大小不固定,取決於我們當前運行的程序。分頁僅僅是為了滿足作業系統內存管理的需求,而段是邏輯信息的單位,在程序中可以體現為代碼段,數據段,能夠更好滿足用戶的需要。

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

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

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

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

面試官CPU 尋址了解嗎?為什麼需要虛擬地址空間?

:這部分我真不清楚!

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

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

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

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

用戶程序可以訪問任意內存,尋址內存的每個字節,這樣就很容易(有意或者無意)破壞作業系統,造成作業系統崩潰。想要同時運行多個程序特別困難,比如你想同時運行一個微信和一個 QQ 音樂都不行。為什麼呢?舉個簡單的例子:微信在運行的時候給內存地址 1xxx 賦值後,QQ 音樂也同樣給內存地址 1xxx 賦值,那麼 QQ 音樂對內存的賦值就會覆蓋微信之前所賦的值,這就造成了微信這個程序就會崩潰。總結來說:如果直接把物理地址暴露出來的話會帶來嚴重問題,比如可能對作業系統造成傷害以及給同時運行多個程序造成困難。

通過虛擬地址訪問內存有以下優勢:

程序可以使用一系列相鄰的虛擬地址來訪問物理內存中不相鄰的大內存緩衝區。程序可以使用一系列虛擬地址來訪問大於可用物理內存的內存緩衝區。當物理內存的供應量變小時,內存管理器會將物理內存頁(通常大小為 4 KB)保存到磁碟文件。數據或代碼頁會根據需要在物理內存與磁碟之間移動。不同進程使用的虛擬地址彼此隔離。一個進程中的代碼無法更改正在由另一進程或作業系統使用的物理內存。四 虛擬內存

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

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

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

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

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

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

4.2 局部性原理

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

:局部性原理是虛擬內存技術的基礎,正是因為程序運行具有局部性原理,才可以只裝入部分程序到內存就開始運行。

以下內容摘自《計算機作業系統教程》 第 4 章存儲器管理。

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

局部性原理表現在以下兩個方面:

時間局部性 :如果程序中的某條指令一旦執行,不久以後該指令可能再次執行;如果某數據被訪問過,不久以後該數據可能再次被訪問。產生時間局部性的典型原因,是由於在程序中存在著大量的循環操作。空間局部性 :一旦程序訪問了某個存儲單元,在不久之後,其附近的存儲單元也將被訪問,即程序在一段時間內所訪問的地址,可能集中在一定的範圍之內,這是因為指令通常是順序存放、順序執行的,數據也一般是以向量、數組、表等形式簇聚存儲的。時間局部性是通過將近來使用的指令和數據保存到高速緩存存儲器中,並使用高速緩存的層次結構實現。空間局部性通常是使用較大的高速緩存,並將預取機制集成到高速緩存控制邏輯中實現。虛擬內存技術實際上就是建立了 「內存一外存」的兩級存儲器的結構,利用局部性原理實現髙速緩存。

4.3 虛擬存儲器

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

這部分內容來自:王道考研作業系統知識點整理。

基於局部性原理,在程序裝入時,可以將程序的一部分裝入內存,而將其他部分留在外存,就可以啟動程序執行。由於外存往往比內存大很多,所以我們運行的軟體的內存大小實際上是可以比計算機系統實際的內存大小大的。在程序執行過程中,當所訪問的信息不在內存時,由作業系統將所需要的部分調入內存,然後繼續執行程序。另一方面,作業系統將內存中暫時不使用的內容換到外存上,從而騰出空間存放將要調入內存的信息。這樣,計算機好像為用戶提供了一個比實際內存大的多的存儲器——虛擬存儲器

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

4.4 虛擬內存的技術實現

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

虛擬內存的實現需要建立在離散分配的內存管理方式的基礎上。 虛擬內存的實現有以下三種方式:

請求分頁存儲管理 :建立在分頁管理之上,為了支持虛擬存儲器功能而增加了請求調頁功能和頁面置換功能。請求分頁是目前最常用的一種實現虛擬存儲器的方法。請求分頁存儲管理系統中,在作業開始運行之前,僅裝入當前要執行的部分段即可運行。假如在作業運行的過程中發現要訪問的頁面不在內存,則由處理器通知作業系統按照對應的頁面置換算法將相應的頁面調入到主存,同時作業系統也可以將暫時不用的頁面置換到外存中。請求分段存儲管理 :建立在分段存儲管理之上,增加了請求調段功能、分段置換功能。請求分段儲存管理方式就如同請求分頁儲存管理方式一樣,在作業開始運行之前,僅裝入當前要執行的部分段即可運行;在執行過程中,可使用請求調入中斷動態裝入要訪問但又不在內存的程序段;當內存空間已滿,而又需要裝入新的段時,根據置換功能適當調出某個段,以便騰出空間而裝入新的段。請求段頁式存儲管理這裡多說一下?很多人容易搞混請求分頁與分頁存儲管理,兩者有何不同呢?

請求分頁存儲管理建立在分頁管理之上。他們的根本區別是是否將程序全部所需的全部地址空間都裝入主存,這也是請求分頁存儲管理可以提供虛擬內存的原因,我們在上面已經分析過了。

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

不管是上面那種實現方式,我們一般都需要:

一定容量的內存和外存:在載入程序的時候,只需要將程序的一部分裝入內存,而將其他部分留在外存,然後程序就可以執行了;缺頁中斷:如果需執行的指令或訪問的數據尚未在內存(稱為缺頁或缺段),則由處理器通知作業系統將相應的頁面或段調入到內存,然後繼續執行程序;虛擬地址空間 :邏輯地址到物理地址的變換。4.5 頁面置換算法

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

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

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

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

當發生缺頁中斷時,如果當前內存中並沒有空閒的頁面,作業系統就必須在內存選擇一個頁面將其移出內存,以便為即將調入的頁面讓出空間。用來選擇淘汰哪一頁的規則叫做頁面置換算法,我們可以把頁面置換算法看成是淘汰頁面的規則。

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

相關焦點

  • 阿里面試官問我Java線程和作業系統線程什麼關係
    面試官:聽前一個面試官說你Java並發這塊掌握的不錯,我們深入的交流一下; 我: 看了看面試官頭部稀疏的結締組織,已然覺得這場面試不簡單,不過好在事前把安琪拉的博客看了個遍,有所準備,我回答說:咳咳,掌握的還算可以。 面試官:Java線程用過的吧?
  • 劍橋教授日記:我給學生的面試建議
    夜深人靜的時候,我坐在廚房的桌旁寫作,指出當天晚上關於羅馬宴會的電視報導並不完全屬實,或是分享我在圖書館的發現,這種種真的很有趣。如實地描述大學一線教師的日常生活可以使人放鬆心情(我保證寫的不是人人豔羨的帶薪年休,也不是光鮮亮麗的雞尾酒會,而是推薦信的真相,或人力資源合規部門)。我喜歡這種即時性:你想、你寫、你點擊發布,然後它就在那裡了。關於自律呢?
  • 如何寫一篇掌控面試節奏的簡歷?
    首先不知道該寫什麼,那就把自己所有的項目、實習、校園經歷全都寫上去,這又不是交卷後不能更改的考試,將腦中想的全寫在紙上,這樣逼迫自己回想和復盤不僅僅可以有足夠的內容,還可以發現之前處理問題的閃光點和不足,幫助你應對面試官的相關問題。那該怎麼寫呢,這裡推薦STAR法則,即為Situation Task Action Result的縮寫。
  • 英國留學申請文書怎麼寫?這些建議希望對你有幫助!
    留學文書太難寫啦!想必在留學圈裡幾乎每天都能聽到這樣的呼聲。可能在寫文書的時候會覺得用英語寫文章已經夠難了,沒有思路,不知道從哪裡下手,不知道該寫些什麼內容...這些問題讓文書寫作難上加難。不知道寫什麼和怎麼寫,才是最頭疼的。有競爭力的文書,都是具有個人特色的,不能套模板,更無法復刻別人的內容。
  • 教孩子寫遊戲:什麼是作業系統?它和程式語言有什麼關係?
    你可以這樣理解:假設計算機一共有100個基礎功能,這些基礎功能都是控制計算機某個硬體的功能,比方說控制CPU或者是內存的功能。雖然這些功能看起來很簡單,可是,要用數學的方法來實現這些功能是非常不容易的,況且這個數學只是二進位的加法而已。拿DOS系統來說,它包含了這100個基礎功能的所有機器語言代碼。
  • 害怕寫作文,請聽作為學姐的她怎麼說的,希望對你有幫助
    害怕寫作文,請聽作為學姐的她怎麼說的,希望對你有幫助。幾年不進課堂的我,一進課堂就教初三的語文,而且還是只剩下最後三個多月的一個學期。我不知道學生是不配合我還是不會寫作文,開學初我布置的作文拖了幾天也才只有三分之一的人交。
  • 疫情下的職場生存記:從寫簡歷到面試談薪的那些技巧和防坑指南
    1.1 個人照片關於簡歷裡放不放照片的爭論,從來就沒停過。雖然程式設計師不是靠臉吃飯,但我還傾向於放照片。通常我在看簡歷的時候,如果看到一個小夥子的照片很精神,我可能就會想:他寫的代碼八成會很整潔吧。做完你有什麼成長?項目交付之後怎麼樣?如果你做過的項目很多,要控制項目數量,否則噼裡啪啦寫好幾頁項目,面試官會看不到重點。太早的、太小的項目就別寫了,挑規模大的寫,挑你參與多寫,挑和崗位更匹配的寫。
  • 面試溝通技巧:面試官的哪些舉動在暗示著你已經通過面試?
    主要有以下表現:1.不打斷你且有興趣的聽你說,如果面試官非常有興趣的聽你講,並不打斷你的話,很有可能就是通過了。2.有的面試官會忍不住的給你豎一個大拇指,這也就說明面試官肯定你的回答,才會給你豎起大拇指,這也是暗示你通過了。
  • 我的世界:如何搞定mojang的面試?標準答案很簡單,只有3個字
    我的世界公司是如何招聘的,我並不知道,但是我們可以想像一下。我的世界這款遊戲有非常多有趣的內容,但是這些有趣的內容經常會出現bug。如果你無法判斷這些bug是否存在於遊戲中,最好默認它存在。當面試官問到你出現bug了怎麼辦的時候,不知道你會怎麼樣回答。
  • 敲開面試的大門:寫簡歷的大原則和投簡歷的小技巧
    簡歷,是求職者向未來僱主展示專業技能和職業素養的自我推銷工具,是贏得面試機會的敲門磚。如果沒有面試邀約,大多只有兩種可能:要麼是簡歷寫的太屎了,要麼是簡歷投的太屎了。所以,當沒有面試機會的時候,你應該從簡歷上找原因。簡歷投出去石沉大海,一種可能是HR沒相中你,認為你勝任不了。
  • 破解阿里運營面試問題:請用2分鐘介紹一下你自己
    面試因為缺乏及時、可行的反饋機制(很多面試失敗了,都不知道具體是什麼原因),所以面試過程中的溝通,很多你是無法進行全面的準備的——但自我介紹是可以提前準備的一個必選題。所以今天和你談一談,做為面試互職網運營的人,怎樣做一個進行自我介紹的提前準備。首先,我們先來分析一下關於自我介紹的主要作用是:讓面試了解你的經歷和能力是適合應聘這個崗位的。
  • 代碼寫對了還掛了?程序媛小姐姐從 LRU Cache 帶你看面試的本質
    拿到一個問題,首先應該是去 clarify 這個問題,因為工作就是如此,不像在刷題網站做題什麼都給你定義好了,面試官通常都不會一次性給你所有條件,而是需要你思考之後去問他。那通過這個環節,面試官就知道了你遇到問題是怎麼去思考的,你考慮的是否全面,怎麼去和別人溝通的,今後和你一起工作的狀態是怎樣的。
  • 遊戲製作人面試題匯總及個人思考
    同樣,候選人也可以通過了解面試官可能會問的問題,反推自己目前的現狀,針對性進行競爭力提升。這就是這個系列文章的意義,我希望我能通過這個總結,提升我的考察能力和競爭力。當然,我也希望能夠幫助到我所有的讀者。
  • 2021年國家公務員考試半結構化面試是什麼
    半結構化面試是什麼?針對此問題今天寧夏華圖就說一說國家2021年國家公務員考試半結構化面試是什麼,希望對廣大考生在面試環節中有所幫助。總的說來,這種面試的方法有很多優勢,具有雙向溝通性,面試官可以獲得比材料法中更為豐富、完整和深入的信息,並且面試可以做到內容的結構性和靈活性的結合。所以,半結構化面試越來越得到廣泛使用。   三重含義   所謂結構化,包括三個方面的含義:   一是面試過程或者說面試程序的結構化。
  • 「你有什麼優點和缺點?」 面試中怎麼回答才好?
    在工作面試中,我們常會被問到一個問題:「你最大的優點和缺點是什麼?」HR(招聘經理)之所以如此問,是想知道應聘者是否有足夠的自我認知,了解自己擅長什麼,還有哪些技能需要改進。那麼,作為應聘者,該怎麼回答這個問題才好呢?
  • 面試怎麼面,才會讓你事半功倍?站在面試官的角度,給你幾條建議
    今天,木辛君為你請教擁有十幾年招聘經驗的HR招聘達人,為你總結要讓面試官「相中你」幾個面試方向:搞清楚面試官每一個行為背後的用意,面試才能一擊即中在說具體方法之前,我先來介紹一下我的這位前輩,作為HR界的老油條,他擁有十五年面試經驗。前段時間因為公司有招聘任務,我也有幸與他組成面試團去進行校招,從中學到不少的經驗。
  • 陰陽師協同對弈聆海金魚姬好不好?協同對弈大金魚強度分析
    陰陽師協同對弈聆海金魚姬好不好?很多玩家對於新版本協同對弈中聆海金魚姬的強度還不太了解,想知道改版後的協鬥中大金魚到底好不好,小編今天為大家帶來了陰陽師協同對弈聆海金魚姬強度分析,感興趣的玩家快來和小編一起了解一下吧!
  • 面試官:「個」字加1筆,是什麼字?小夥說出3個字,面試官愣了!
    面試官出這樣的題目其實是想考驗一下面試者的應變能力和邏輯思維能力,但是這些問題對於工作是沒有一點幫助的,弄不好還會讓人學會投機取巧。小魚是在 211上的大學,專業是市場營銷,今年剛剛畢業。小魚希望能找一個自己喜歡的公司,公司文化什麼的都比較適合自己的。
  • 【段子】面試的時候,面試官看我簡歷上寫著做過配音
    簡直太讓人猝不及防我和我的同齡人有一個最大的共同之處:我們今年都40歲了。烈日下的街頭清潔工,他們無私奉獻精神是無價的。但假如要漲工資5%,那可就真的太多了。今年數學系GG送MM的情人節禮物:r=b+sinx你把夢想改成增肥,不就一路順風、心想事成了嗎?
  • 令人心動的offer2圍觀大佬面試我能學會什麼?
    就像史欣悅律師說的那樣:「你寫在簡歷上的東西,必須是在你心裡爛熟的東西。」簡歷內容自己一定要熟記於心,面試官提問的時候,你如果表現出遲疑或者需要回想半天才能回答,那你的面試分數肯定是要大打折扣的。當面試官問:「如果你拿到君合的offer,就不去公務員了嗎?」第一位面試者賀鑫磊十分「乖巧」地聽從了父母的建議,已經順利地考取了公務員,面對面試官的問題沒有立刻回答,而是猶豫了很久,甚至對面試官說自己很矛盾糾結。