页面置换算法

Posted bearcarl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了页面置换算法相关的知识,希望对你有一定的参考价值。

要求:

技术分享图片

技术分享图片

 

技术分享图片

写了三种算法:FIFO, LRU, OPT.

指导书上有一个错误,即要求的磁道是0 - 319, 但是如果按照指导书上的指令生成方法, 可能会生成320这条指令,自己写个检测语句就成了。。

FIFO可能有点小问题,就是检测某页面是否在内存中是时可能出错(极低概率),还没有找出来。

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<cstring>
#include<ctime>
using namespace std;

int inst[330];        //指令 


void start() {
    cout << "Start memory management" << endl;
    cout << "Producing address flow, wait for while, please." << endl;
}

void produce_addstream() {             
    srand((unsigned)time(NULL));
    int n = 0;
    int m, m1, m2;
    while(n < 320) {
        m = rand() % 320;
        if(m == 319) m--;     //防止出现320的指令 
        inst[n++] = m + 1;  
        m1 = rand() % (m + 2);
        inst[n++] = m1;
        inst[n++] = m1 + 1;
        m2 = (rand() % (320 - m1 - 2)) + m1 + 2;  
    }     
}

int check(int page[], int mem, int checkInst) {    //检查内存中是否有当前指令所在页面 
    for(int i = 0; i < mem; i++)
        if(checkInst / 10 == page[i])     return 1;
    return 0;
}

int chooseOutPage(int page[], int mem, int i) {
    int temp[32], outPage = mem;
    for(int j = 0; j < 32; j++)    temp[j] = page[j];
    for(int k = i + 1; k < 320; k++) {
        int ans = inst[k] / 10;
        for(int s = 0; s < mem; s++)
            if(temp[s] == ans) {
                temp[s] = -1;
                --outPage;
                break;
            }    
        if(outPage == 1) {        //选择要置换的页面 
            for(int s = 0; s < mem; s++)
                if(temp[s] != -1) return s;
        }
    }        
    for(int s = 0; s < mem; s++)        //最后仅剩几条指令时,选择要置换的页面 
        if(temp[s] != -1) return s;
}

int chooseOutPage2(int page[], int mem, int i) {
    int temp[32], outPage = mem;
    for(int j = 0; j < 32; j++) temp[j] = page[j];
    for(int k = i - 1; k >= 0; k--) {
        int ans = inst[k] / 10;
        for(int s = 0; s < mem; s++)
            if(temp[s] == ans) {
                temp[s] = -1;
                --outPage;
                break;
            }
        if(outPage == 1) {
            for(int s = 0; s < mem; s++)
                if(temp[s] != -1) return s;
        }
    }
    for(int s = 0; s < mem; s++)
        if(temp[s] != -1) return s;
}

void FIFO(int mem) {
    int page[32];
    int remain = mem;
    int notFound = 0;
    int point = 0; //指针用来标记最先进入的页面。                   
    memset(page, -1, sizeof(page));
    for(int i = 0; i < 320; i++) {
        if(check(page, mem, inst[i]) == 0) {    //内存中无所需页面 
            ++notFound;
            if(remain > 0) {
                page[mem - remain] = inst[i] / 10;
                --remain;
            }
            else {
                page[point] = inst[i] / 10;
                point = (point + 1) % mem;
            } 
        }
    }
    cout << " memPage: " << mem << "  notFound: " << notFound << " 命中率:" << float(320 - notFound) / 320 << endl; 
}

void OPT(int mem) {
    int page[32];
    int remain = mem;  //内存中的空闲页面 
    int notFound = 0;
    memset(page, -1, sizeof(page));
    for(int i = 0; i < 320; i++) {
        if(check(page, mem, inst[i]) == 0) {    //内存中无所需页面 
            ++notFound;
            if(remain > 0) {        //如果内存中还有空闲页面 
                page[mem - remain] = inst[i] / 10;
                --remain;
            } 
            else {
                int outPage = chooseOutPage(page, mem, i);
                page[outPage] = inst[i] / 10; 
            }
        }
    }
    cout << " memPage: " << mem << "  notFound: " << notFound << " 命中率:" << float(320 - notFound) / 320 << endl; 
}

void LRU(int mem) {
    int page[32];
    int remain = mem; //内存中空闲页面 
    int notFound = 0;
    memset(page, -1, sizeof(page));
    for(int i = 0; i < 320; i++) {
        if(check(page, mem, inst[i]) == 0) {
            ++notFound;
            if(remain > 0) {
                page[mem - remain] = inst[i] / 10;
                --remain;
            }
            else {
                int outPage = chooseOutPage2(page, mem, i);
                page[outPage] = inst[i] / 10;
            }
        }
    }
    cout << " memPage: " << mem << "  notFound: " << notFound << " 命中率:" << float(320 - notFound) / 320 << endl; 
}


int main() {
    int test[35];
    //freopen("in.txt", "r", stdin);
    start();
    produce_addstream();
    cout << "choose the algorithm(1-4)\\n";
    int n;
    cin >> n;
    switch(n) {
        case 1: for(int i = 4; i <= 32; i++) OPT(i); break;
        case 2: for(int i = 4; i <= 32; i++) LRU(i); break;
        case 3: for(int i = 4; i <= 32; i++) FIFO(i);break;
        default: break;
    }
    
    memset(test, 0, sizeof(test));
    cout << "\\n检测超出范围的页面...\\n";
    for(int i = 0; i < 320; i++) {
        int x = inst[i] / 10;
        test[x] = 1;
        if(inst[i] < 0 || inst[i] >= 320) cout << inst[i] << "  ==超出范围==\\n ";
    }
    cout << "\\n检测未取到的页面...\\n";
    for(int i = 0; i < 32; i++)        
        if(test[i] == 0) cout << i << "  ";
        
    return 0;
} 

 

以上是关于页面置换算法的主要内容,如果未能解决你的问题,请参考以下文章

先进先出算法(FIFO)——页面置换

操作系统概念 页面置换算法:分别使用FIFOOPTLRU三种置换算法来模拟页面置换的过程。

操作系统概念 页面置换算法:分别使用FIFOOPTLRU三种置换算法来模拟页面置换的过程。

页面置换算法LRU

最近最少使用算法(LRU)——页面置换

页面置换算法(最佳置换算法FIFO置换算法LRU置换算法LFU置换算法)