页面置换算法

在此展示3种算法:FIFOOPTLRU 算法。(点击进入百度百科介绍)
1、任意给出一组页面访问顺序(如页面走向是1、2、5、7、5、7、1、4、3、5、6、4、3、2、1、5、2)。
2、分配给该作业一定的物理块(如3块、4块等)。
3、利用OPT,FIFO,LRU页面置换算法模拟页面置换过程并计算其缺页率。
4、每访问一个页面均需给出内存中的内容(内存中的页面号),若有淘汰还需给出淘汰的页面号。

算法大致流程:

实验代码:

#include <string>
#define maxPage 100
using namespace std;
int phyBlockNum;
int show(int * block,int ispageL) {
    string str[2]= {" 否"," 是"};
    for(int i=0; i<phyBlockNum; i++) {
        if(block[i]==-1) cout<<"  \t";
        else    cout<<block[i]<<"\t";
    }
    cout<<str[ispageL]<<endl;
}
bool inblock(int *block,int page) {
    for(int i=0; i<phyBlockNum; i++) {
        if(page==block[i]) return 1;
    }
    return 0;
}
void FIFO(int* block,int* page) {
    for(int i=0; i<phyBlockNum; i++) block[i]=-1;
    int i,j=0,temp;
    cout<<"页号\t";
    cout<<"是否缺页\n";
    for(i=0; page[i]!=-1; i++) {
        temp=page[i];
        cout<<temp<<"\t";
        if(!inblock(block,temp)) {
            block[(j++)% phyBlockNum]=temp;
            temp=1;
        } else temp=0;
        show(block,temp);
    }
    cout<<"FIFO算法的缺页率为"<<(double)j/(double)i<<endl;
}
void OPT(int* block,int* page) {
    for(int i=0; i<phyBlockNum; i++) block[i]=-1;
    int i,pageL=0,temp,max,* ntime;
    ntime=new int(phyBlockNum);
    for(i=0; i<phyBlockNum; i++) ntime[i]=-1;
    cout<<"页号\t";
    for(i=0; i<phyBlockNum; i++) cout<<"页块"<<i<<"\t";
    cout<<"是否缺页\n";
    for(i=0; block[phyBlockNum-1]==-1; i++) {
        temp=page[i];
        cout<<temp<<"\t";
        if(!inblock(block,temp)) {
            block[pageL++]=temp;
            temp=1;
        } else temp=0;
        show(block,temp);
    }
    for(; page[i]!=-1; i++) {
        temp=page[i];
        cout<<temp<<"\t";
        max=0;
        for(int k=0; k<phyBlockNum; k++) {
            for(int m=i; page[m]!=-1; m++) {
                if(page[m]==block[k]) {
                    ntime[k]=m;
                    break;
                } else if(page[m+1]==-1) ntime[k]=m+1;
            }
        }
        for(int j=1; j<phyBlockNum; j++) max=ntime[max]<ntime[j]?j:max;
        if(!inblock(block,temp)) {
            block[max]=temp;
            pageL++;
            temp=1;
        } else temp=0;
        show(block,temp);
    }
    cout<<"OPT算法的缺页率为"<<(double)pageL/(double)i<<endl;
}
void LRU(int* block,int* page) {
    for(int i=0; i<phyBlockNum; i++) block[i]=-1;
    int i,pageL=0,temp,min,* ntime;
    ntime=new int(phyBlockNum);
    for(i=0; i<phyBlockNum; i++) ntime[i]=-1;
    cout<<"页号\t";
    for(i=0; i<phyBlockNum; i++) cout<<"页块"<<i<<"\t";
    cout<<"是否缺页\n";
    for(i=0; block[phyBlockNum-1]==-1; i++) {
        temp=page[i];
        cout<<temp<<"\t";
        if(!inblock(block,temp)) {
            block[pageL++]=temp;
            temp=1;
        } else temp=0;
        show(block,temp);
    }
    for(; page[i]!=-1; i++) {
        temp=page[i];
        min=0;
        for(int k=0; k<phyBlockNum; k++) {
            for(int m=i; m>=0; m--) {
                if(page[m]==block[k]) {
                    ntime[k]=m;
                    break;
                } else if(m==0) ntime[k]=-1;
            }
        }
        for(int j=1; j<phyBlockNum; j++) min=ntime[min]>ntime[j]?j:min;
        cout<<temp<<"\t";
        if(!inblock(block,temp)) {
            block[min]=temp;
            pageL++;
            temp=1;
        } else temp=0;
        show(block,temp);
    }
    cout<<"LRU算法的缺页率为"<<(double)pageL/(double)i<<endl;
}
int main() {
    int * Block;
    int pageQue[maxPage];
    cout<<"输入分配给改作业的物理块数:";
    cin>>phyBlockNum;
    Block=new int(phyBlockNum);
    cout<<"输入一组页面访问顺序,输入-1结束:";
    for(int i=0; i<maxPage; i++) {
        cin>>pageQue[i];
        if(pageQue[i]==-1) break;
    }
    cout<<"\n-----------------OPT算法-----------------\n";
    OPT(Block,pageQue);
    cout<<"\n-----------------FIFO算法----------------\n";
    FIFO(Block,pageQue);
    cout<<"\n-----------------LRU算法-----------------\n";
    LRU(Block,pageQue);
    return 0;
}

运行结果:

输入分配给改作业的物理块数:4
输入一组页面访问顺序,输入-1结束:1 2 5 7 5 7 1 4 3 5 6 4 3 2 1 5 2 -1

-----------------OPT算法-----------------
页号    页块0   页块1   页块2   页块3   是否缺页
1       1                                是
2       1       2                        是
5       1       2       5                是
7       1       2       5       7        是
5       1       2       5       7        否
7       1       2       5       7        否
1       1       2       5       7        否
4       1       2       5       4        是
3       3       2       5       4        是
5       3       2       5       4        否
6       3       2       6       4        是
4       3       2       6       4        否
3       3       2       6       4        否
2       3       2       6       4        否
1       1       2       6       4        是
5       5       2       6       4        是
2       5       2       6       4        否
OPT算法的缺页率为0.529412

-----------------FIFO算法----------------
页号    页块0   页块1   页块2   页块3   是否缺页
1       1                                是
2       1       2                        是
5       1       2       5                是
7       1       2       5       7        是
5       1       2       5       7        否
7       1       2       5       7        否
1       1       2       5       7        否
4       4       2       5       7        是
3       4       3       5       7        是
5       4       3       5       7        否
6       4       3       6       7        是
4       4       3       6       7        否
3       4       3       6       7        否
2       4       3       6       2        是
1       1       3       6       2        是
5       1       5       6       2        是
2       1       5       6       2        否
FIFO算法的缺页率为0.588235

-----------------LRU算法-----------------
页号    页块0   页块1   页块2   页块3   是否缺页
1       1                                是
2       1       2                        是
5       1       2       5                是
7       1       2       5       7        是
5       1       2       5       7        否
7       1       2       5       7        否
1       1       2       5       7        否
4       1       4       5       7        是
3       1       4       3       7        是
5       1       4       3       5        是
6       6       4       3       5        是
4       6       4       3       5        否
3       6       4       3       5        否
2       6       4       3       2        是
1       1       4       3       2        是
5       1       5       3       2        是
2       1       5       3       2        否
LRU算法的缺页率为0.647059
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 8.1虚拟存储的需求背景 虚拟内存是非连续内存分配的一个延续,非连续内存分配在存储空间内可以连续也可以不连续。虚拟...
    龟龟51阅读 5,854评论 2 6
  • 进程运行时,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的...
    saviochen阅读 3,020评论 0 6
  • 最佳置换算法 先进先出(FIFO)置换算法 最近最少未使用(LRU)算法 1.最佳置换算法(理想化算法) 淘汰最久...
    Corbin___阅读 2,533评论 0 2
  • 地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个...
    vbuer阅读 1,573评论 0 3
  • 进程“抖动” 进程页面置换过程中,刚被换出的页面很快又要被访问,需要将它重新调入,此时又需要再选一页调出;而此时刚...
    NoFacePeace阅读 1,235评论 0 0