前言
上個星期跟幾位朋友一起開了個公衆號 “ 於你供讀 ”,每日推送Android,iOS,UI,前端,產品和生活情感的文章。好了,入正題,這個星期的面試題是 今日頭條的面試題。
題目
操作系統中可以使用 LRU(Least Recently Used)內存淘汰舊數據的策略,如果內存需要加載新數據但空間不足,則會按照最近訪問時間進行排序,並將最老的數據淘汰。假設現在內存空間大小爲 5,原本內存中沒有數據,對內存中數據的訪問順序如下:
1, 2, 5, 3, 4, 6,1, 4, 3, 6, 7, 8, 3, 9
問訪問過程中發生缺頁的次數是多少次?A. 缺頁次數:4
B. 缺頁次數:10
C. 缺頁次數:5
D. 缺頁次數:9
知識點
要解決上面的題目,首先我們先要了解什麼是缺頁
缺頁中斷
在請求分頁系統中,可以通過查詢頁表中的狀態位來確定所要訪問的頁面是否存在於內存中。每當所要訪問的頁面不在內存時,會產生一次缺頁中斷,此時操作系統會根據頁表中的外存地址在外存中找到所缺的一頁,將其調入內存。
缺頁本身是一種中斷,與一般的中斷一樣,需要經過4個處理步驟:
1. 保護CPU現場
2. 分析中斷原因
3. 轉入缺頁中斷處理程序進行處理
4. 恢復CPU現場,繼續執行
但是缺頁中斷時由於所要訪問的頁面不存在與內存時,有硬件所產生的一種特殊的中斷,因此,與一般的中斷存在區別:
- 在指令執行期間產生和處理缺頁中斷信號
- 一條指令在執行期間,可能產生多次缺頁中斷
- 缺頁中斷返回時,執行產生中斷的那一條指令,而一般的中斷返回時,執行下一條指令
還有一點就是我們必需瞭解 LRU 算法,這個算法使用頻率還是相當的高的,因此我們也不陌生。
LRU
LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是“如果數據最近被訪問過,那麼將來被訪問的機率也更高”。
LRU 最常見的實現是使用一個鏈表保存緩存數據,詳細算法實現如下:
- 新數據插入到鏈表頭部;
- 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;
- 當鏈表滿的時候,將鏈表尾部的數據丟棄。
解題
這道題目答案選擇 B ,缺頁數爲 10,我把解題思路弄了一個流程圖出來,可以看下。
最後用 JAVA 來模擬一下:
Github:LRU.java