1. 程式人生 > >作業系統頁面置換演算法與redis的記憶體淘汰機制

作業系統頁面置換演算法與redis的記憶體淘汰機制

寫在前面:最近碰到作業系統中關於頁面置換的一些問題,與此同時學習redis的過程中發現它的記憶體淘汰機制有些相似,在此一併記錄下來。

首先是作業系統中的頁面替換演算法

最佳置換演算法(OPT)

這是一種理想情況下的頁面置換演算法,但實際上是不可能實現的。該演算法所選擇淘汰的頁面為後面永遠不會使用到的頁面或者是最長時間內不會使用的頁面。但由於我們無法預知接下來執行的過程中哪些頁面不會被訪問到,所以這個演算法無法實現,但是最佳頁面置換演算法可以用於對可實現演算法的效能進行衡量比較。

先進先出置換演算法(FIFO)

最簡單的頁面置換演算法是先入先出(FIFO)法。這種演算法的實質是,總是選擇在主存中停留時間最長(即最老)的一頁置換,即先進入記憶體的頁,先退出記憶體。理由是:最早調入記憶體的頁,其不再被使用的可能性比剛調入記憶體的可能性大。建立一個FIFO佇列,收容所有在記憶體中的頁。被置換頁面總是在佇列頭上進行。當一個頁面被放入記憶體時,就把它插在隊尾上。
FIFO的一個缺點是,它有一種異常現象,即在增加儲存塊的情況下,反而使缺頁中斷率增加了。當然,導致這種異常現象的頁面走向實際上是很少見的。這種現象又叫Belady異常。

最近最久未使用演算法(LRU)

選擇最近最長時間未訪問過的頁面予以淘汰,該演算法認為過去一段時間內未訪問過的頁面,在最近的將來可能也不會被訪問。該演算法為每個頁面設定一個訪問欄位,來記錄頁面自上次被訪問以來所經歷的時間,淘汰頁面時選擇現有頁面中值最大的予以淘汰。
因實現LRU演算法必須有大量硬體支援,還需要一定的軟體開銷。所以實際實現的都是一種簡單有效的LRU近似演算法。
一種LRU近似演算法是最近未使用演算法(Not Recently Used,NUR)。它在儲存分塊表的每一表項中增加一個引用位,作業系統定期地將它們置為0。當某一頁被訪問時,由硬體將該位置1。過一段時間後,通過檢查這些位可以確定哪些頁使用過,哪些頁自上次置0後還未使用過。就可把該位是0的頁淘汰出去,因為在之前最近一段時間裡它未被訪問過。

最少使用演算法(LFU)

該演算法首先淘汰一段時間內使用次數最少的頁面,注意和LRU的區別,LRU是淘汰最長時間沒使用的在採用最少使用置換演算法時,應為在記憶體中的每個頁面設定一個移位暫存器,用來記錄該頁面被訪問的頻率。該置換演算法選擇在之前時期使用最少的頁面作為淘汰頁。

Clock演算法

LRU演算法的近似實現

redis記憶體淘汰機制

redis作為其獨特之處就在於它將資料放在記憶體中,大大提升了速度。但同時也帶來這樣一個問題,往往記憶體的大小有限,當記憶體剩餘空間不足以繼續新增資料時redis 內就會施行資料淘汰策略,清除一部分內容然後保證新的資料可以儲存到記憶體中。
記憶體淘汰機制是為了更好的使用記憶體,用一定得miss來換取記憶體的利用率,保證redis快取中儲存的都是熱點資料。

要實行淘汰機制首先對redis進行相關配置。
我們可以通過配置redis.conf中的maxmemory這個值來開啟記憶體淘汰功能(該引數預設值為0即不設定記憶體上限),設定後當記憶體超出設定值後就會執行淘汰機制。
通過指定maxmemory-policy noeviction選項人為配置淘汰策略,淘汰策略主要有以下幾種。

  1. voltile-lru:從已設定過期時間的資料集中挑選最近最少使用的資料淘汰
  2. volatile-ttl:從已設定過期時間的資料集中挑選將要過期的資料淘汰
  3. volatile-random:從已設定過期時間的資料集中任意選擇資料淘汰
  4. allkeys-lru:從主資料集中挑選最近最少使用的資料淘汰
  5. allkeys-random:從主資料集中任意選擇資料淘汰
  6. no-enviction:達到閾值後所有再申請記憶體的指令都不被允許

注:假設我們有一批鍵儲存在Redis中,則有那麼一個雜湊表用於儲存這批鍵及其值,如果這批鍵中有一部分設定了過期時間,那麼這批鍵還會被儲存到另外一個雜湊表中,這個雜湊表中的值對應的是鍵被設定的過期時間。設定了過期時間的資料集為主主資料集的子集。

各策略適用場景

  • 如果我們的應用對快取的訪問符合冪律分佈(也就是存在相對熱點資料),或者我們不太清楚我們應用的快取訪問分佈狀況,我們可以選擇allkeys-lru策略。

  • 如果我們的應用對於快取key的訪問概率相等,則可以使用allkeys-random這個策略。

  • volatile-lru策略和volatile-random策略適合我們將一個Redis例項既應用於快取和又應用於持久化儲存的時候,然而我們也可以通過使用兩個Redis例項來達到相同的效果,值得一提的是將key設定過期時間實際上會消耗更多的記憶體,因此我們建議使用allkeys-lru策略從而更有效率的使用記憶體。

相關推薦

作業系統頁面置換演算法redis記憶體淘汰機制

寫在前面:最近碰到作業系統中關於頁面置換的一些問題,與此同時學習redis的過程中發現它的記憶體淘汰機制有些相似,在此一併記錄下來。 首先是作業系統中的頁面替換演算法 最佳置換演算法(OPT) 這是一種理想情況下的頁面置換演算法,但實際上是不可能實現的。該

作業系統頁面置換演算法 ---之---FIFO置換演算法、OPTIMAL置換算

                                 作業系統頁面置換演算法     &nbs

作業系統頁面置換演算法RR

data4.txt輸入檔案內容: 5 3 A B C D E 0 6 10 16 24 15 10 12 4 8 // #include <iostream> #include <queue> #include <iomanip&

C語言作業系統——頁面置換演算法(FIFO/LRU)

由於本學期學習作業系統所以需要用程式碼實現一些演算法,本人大二由於對C語言掌握的不太好,所以一直逼著自己用C語言寫程式碼,還好寫出來了,在這裡與大家分享。首先建立一個工程檔案,本人喜歡建立一個頭檔案,一個功能檔案和一個主函式檔案。標頭檔案,page_replace.h#inc

作業系統-頁面置換演算法

實驗六:頁面置換演算法 一、 實驗目的( 頁面置換 ) 在地址對映過程中,若在頁面中發現所要訪問的頁面不在記憶體中,則產生缺頁中斷。當發生缺頁中斷時,如果作業系統記憶體中沒有空閒頁面,則作業系統必須在記憶體選擇一個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇

[作業系統] 頁面置換演算法(二)

頁面置換演算法(二) 1. 工作集基本概念 1. 什麼是工作集 在單純的分頁系統裡,剛啟動程序時,在記憶體中並沒有頁面。在CPU試圖讀取第一條指令時就會產生一次缺頁中斷,使作業系統裝入含有第一條指令的頁面。其他由訪問全域性資料和堆疊引起的

作業系統頁面置換演算法c++

作業系統頁面置換演算法 頁面置換演算法: 功能:選擇被置換的物理頁面 目標:儘可能減少頁面的調入調出次數 把未來不再訪問或者短期內不訪問的頁面調出 頁面鎖定:(以下部分) 描述必須常駐記憶體的邏輯頁面,作業系統的關鍵部

作業系統頁面置換演算法之最近最少使用演算法(LRU)

import java.util.LinkedList; import java.util.List; public class LRU {public static void main(String[] args) {int framesize = 5;//幀數量int[] s = { 1, 2, 3, 4

作業系統頁面置換演算法之先進先出(FIFO)演算法

import java.util.LinkedList; import java.util.List; public class FIFO {public static void main(String[] args) {int framesize = 5;   //幀數量int[] s = { 1, 2,

作業系統頁面置換演算法LRU_FIFO

#include "iostream.h"#include "stdlib.h"#define MN  3  //記憶體塊數量(可變化)#define KK  10//time-j*KK的比例係數 0:LRU 10:FIFO 1:平均//#define TT  MN-1//N

作業系統——頁面置換演算法詳解

    頁面置換演算法的功能:當出現缺頁異常,需調入新頁面而記憶體已滿時,置換演算法選擇被置換的物理頁面。     頁面置換演算法的設計目標:儘可能減少頁面的調入調出次數,把未來不再訪問或短期內不訪問

Redis 記憶體淘汰機制

簡介 Redis記憶體淘汰指的是使用者儲存的一些鍵被可以被Redis主動地從例項中刪除,從而產生讀miss的情況,那麼Redis為什麼要有這種功能?這就是我們需要探究的設計初衷。Redis最常見的兩種應用場景為快取和持久儲存,首先要明確的一個問題是記憶體淘汰策略更適

Redis記憶體淘汰機制

概述 Redis是基於記憶體儲存,常用於資料的快取,所以Redis提供了對鍵的過期時間的設定,實現了幾種淘汰機制便於適應各種場景。 設定過期時間 我們可以在設定鍵時設定expire time,也可以在執行時給存在的鍵設定剩餘的生存時間,不設定則預設為-1,設定為-1時表示永久儲存。 Redis清除過

Redis 記憶體淘汰機制詳解

一般來說,快取的容量是小於資料總量的,所以,當快取資料越來越多,Redis 不可避免的會被寫滿,這時候就涉及到 Redis 的記憶體淘汰機制了。我們需要選定某種策略將“不重要”的資料從 Redis 中清除,為新的資料騰出空間。 # 配置 Redis 記憶體大小 我們應該為 Redis 設定多大的記憶體容量

作業系統實驗七之記憶體頁面置換演算法實驗

vmrp.h #include <iostream> #include <iomanip> #include <malloc.h> class Replace{ public: Replace(); ~Replace(); void

作業系統(5)虛擬儲存--頁面置換演算法:區域性置換演算法、全域性置換演算法

文章目錄 1:頁面置換演算法的相關概念 2:區域性置換演算法 1.最優、先進先出、最近最久未使用演算法 2.時鐘置換演算法和最不常用演算法 3.Belady現象和區域性置換演算法的比較 3:

作業系統頁面置換演算法(最佳置換OPT,先進先出FIFO,最近最久未使用LRU)

最近學習作業系統時,實驗要求實現常見的三種頁面置換演算法,博主按照書上要求試著編寫,實現了案例,並記錄在部落格隨記中,以便後續自己複習並也給需要的同學分享參考一下!水平有限,若有錯,請悄悄告訴博主!博主好立即改正。 最佳置換演算法(optimal replacement,OPT)是從記憶體中選擇今後不再訪問

作業系統- 實驗四 模擬FIFO頁面置換演算法(Java實現)

                                          &

作業系統中的頁面置換演算法和磁碟排程演算法

頁面置換演算法:http://blog.csdn.net/y920312/article/details/47780253 頁面置換演算法小總結: 1.Optimal(最佳置換演算法)    最長時間內不被訪問,也就是說找最後面的。 2.FIFO(先進先出演算法)    按

5】虛擬記憶體頁面置換演算法

// 作業系統_實驗五(虛擬記憶體頁面置換演算法).cpp : 定義控制檯應用程式的入口點。 // #include <iostream> #include <fstream> #include <iomanip> using namespace std; const