2016年頭條校招筆試(LRU算法)

題目

操做系統中可使用 LRU(Least Recently Used)內存淘汰舊數據的策略,若是內存須要加載新數據但空間不足,則會按照最近訪問時間進行排序,並將最老的數據淘汰。假設如今內存空間大小爲 5,本來內存中沒有數據,對內存中數據的訪問順序以下:
1, 2, 5, 3, 4, 6,1, 4, 3, 6, 7, 8, 3, 9
問訪問過程當中發生缺頁的次數是多少次?java

A. 缺頁次數:4
B. 缺頁次數:10
C. 缺頁次數:5
D. 缺頁次數:9git

知識點

要解決上面的題目,首先咱們先要了解什麼是缺頁github

缺頁中斷算法

在請求分頁系統中,能夠經過查詢頁表中的狀態位來肯定所要訪問的頁面是否存在於內存中。每當所要訪問的頁面不在內存時,會產生一次缺頁中斷,此時操做系統會根據頁表中的外存地址在外存中找到所缺的一頁,將其調入內存。緩存

缺頁自己是一種中斷,與通常的中斷同樣,須要通過4個處理步驟:
1. 保護CPU現場
2. 分析中斷緣由
3. 轉入缺頁中斷處理程序進行處理
4. 恢復CPU現場,繼續執行ui

可是缺頁中斷時因爲所要訪問的頁面不存在與內存時,有硬件所產生的一種特殊的中斷,所以,與通常的中斷存在區別:spa

  1. 在指令執行期間產生和處理缺頁中斷信號
  2. 一條指令在執行期間,可能產生屢次缺頁中斷
  3. 缺頁中斷返回時,執行產生中斷的那一條指令,而通常的中斷返回時,執行下一條指令

還有一點就是咱們必需瞭解 LRU 算法,這個算法使用頻率仍是至關的高的,所以咱們也不陌生。操作系統

LRU.net

LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是「若是數據最近被訪問過,那麼未來被訪問的概率也更高」。排序

LRU 最多見的實現是使用一個鏈表保存緩存數據,詳細算法實現以下:

LRU算法.png

  1. 新數據插入到鏈表頭部;
  2. 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;
  3. 當鏈表滿的時候,將鏈表尾部的數據丟棄。

解題

這道題目答案選擇 B ,缺頁數爲 10,我把解題思路弄了一個流程圖出來,能夠看下。

2016年頭條校招筆試題:LRU算法.png

最後用 Java 來模擬一下:

Github:LRU.java

LRU隊列.png

LRU解題.png

相關文章
相關標籤/搜索