操作系统页面置换算法(opt,lru,fifo,clock)实现

#include <iostream>
#include<map>
#include<set>
#include <algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 200
using namespace std;  

int page[N];//页面引用号
int block[N];//物理块,内存
int dist[N][N];//表示第i次访问内存的时候,内存中的页面j 在以后被访问的最小时间 

int n;//页面引用号个数
int m;//物理块数目
int page_max;//最大页面号 

int pre[N];//page[i]在page中的索引
int opt(){//最佳页面置换算法
    int page_lack = 0;
    memset(pre, 0, sizeof(pre));
    memset(dist, 0x3f, sizeof(dist));
    memset(block, -1, sizeof(block));
    for(int i=n; i>=1; --i){
         for(int j=0; j<=page_max; ++j)
             if(pre[j])
                dist[i][j] = pre[j] - i;
         pre[page[i]] = i;
    }

    for(int i=1; i<=n; ++i){//开始访问页面,初始是内存中没有分页
        int j;
        int max_dist = 0, p;
        for(j=1; j<=m; ++j){
            if(block[j] == -1){//改块没有放入页面,则直接放入, 产生缺页
                block[j] = page[i];
                cout<<"页面"<<page[i]<<"不在内存,直接放入物理块"<<j<<"中!"<<endl;
                page_lack++;
                break;
            } else if(block[j] == page[i])//页面存在内存中
                break;

            if(max_dist < dist[i][block[j]]){
                max_dist = dist[i][block[j]];//说明block[j] 对应的页面以后会长时间不会用到
                p = j;//block[] 第j个页面会被替换掉
            }
        }
        if(j > m){//此时内存中不能在放入新的分页,而且没有找到page[i]对应的分页,接下来进行页面替换
             cout<<"页面"<<page[i]<<"不在内存,将物理块"<<p<<"中的页面" <<block[p]<<"替换掉!"<<endl;
             block[p] = page[i];
             page_lack++;
        }
        cout<<endl<<"当前内存中页面的情况:"<<endl;
        for(int k=1; k<=m; ++k)//内存中页面加载情况
            cout<<block[k]<<" ";
        cout<<endl<<endl;
    }
    return page_lack;//返回缺页次数
} 

int lru(){//最近最久未使用算法和opt算法差不多,只不过是lru是向前看, opt是向后看
    int page_lack = 0;
    memset(pre, 0, sizeof(pre));
    memset(dist, 0x3f, sizeof(dist));
    memset(block, -1, sizeof(block));
    for(int i=1; i<=n; ++i){
         for(int j=0; j<=page_max; ++j)
             if(pre[j])
                dist[i][j] = i - pre[j];
         pre[page[i]] = i;
    }

    for(int i=1; i<=n; ++i){//开始访问页面,初始是内存中没有分页
        int j;
        int max_dist = 0, p;
        for(j=1; j<=m; ++j){
            if(block[j] == -1){//改块没有放入页面,则直接放入, 产生缺页
                block[j] = page[i];
                cout<<"页面"<<page[i]<<"不在内存,直接放入物理块"<<j<<"中!"<<endl;
                page_lack++;
                break;
            } else if(block[j] == page[i])//页面存在内存中
                break;

            if(max_dist < dist[i][block[j]]){
                max_dist = dist[i][block[j]];//说明block[j] 对应的页面以后会长时间不会用到
                p = j;//block[] 第j个页面会被替换掉
            }
        }
        if(j > m){//此时内存中不能在放入新的分页,而且没有找到page[i]对应的分页,接下来进行页面替换
             cout<<"页面"<<page[i]<<"不在内存,将物理块"<<p<<"中的页面" <<block[p]<<"替换掉!"<<endl;
             block[p] = page[i];
             page_lack++;
        }
        cout<<endl<<"当前内存中页面的情况:"<<endl;
        for(int k=1; k<=m; ++k)//内存中页面加载情况
            cout<<block[k]<<" ";
        cout<<endl<<endl;
    }
    return page_lack;//返回缺页次数
} 

set<int>page_set;
int fifo(){//先进先出页面置换算法
    int page_lack = 0;
    memset(block, -1, sizeof(block));
    int index = 1;
    for(int i=1; i<=n; ++i){
        if(index > m) index = 1;
        set<int>::iterator it;
        it = page_set.find(page[i]);
        if(it == page_set.end()){
            if(block[index] != -1)
                page_set.erase(block[index]);
            page_set.insert(page[i]);
            block[index++] = page[i];
            ++page_lack;
        }
        for(int k=1; k<=m; ++k)
            cout<<block[k]<<" ";
        cout<<endl;
    }
    return page_lack;
}

int nru[N];//表示 物理块 i 最近时候被访问过
int page_in_block[N];//页面 i 在 block的下标索引
int clock(){
    int index = 1;
    int page_lack = 0;
    memset(block, -1, sizeof(block));
    for(int i=1; i<=n; ++i){
        if(page_in_block[page[i]]){//如果page[i]已经在内存中
            nru[page_in_block[page[i]]] = 1;//重新标记这个物理块中的页面被访问过了
            cout<<endl<<"第"<<i<<"次: 页面"<<page[i]<<"已经存在物理块"<< page_in_block[page[i]] << "中!"<<endl;
        }
        else {
            while(true){
                if(index > m) index = 1;
                if(block[index] == -1) {
                    nru[index] = 1;
                    page_in_block[page[i]] = index;
                    block[index++] = page[i];
                    ++page_lack;
                    break;
                }
                if(block[index] == page[i]){
                    nru[index++] = 1;
                    break;
                } else {
                    if(nru[index] == 0){//替换该页面
                        nru[index] = 1;
                        page_in_block[block[index]] = 0;
                        cout<<endl<<"第"<<i<<"次: 物理块"<<index<<"中的页面"<< block[index] <<"最近未被使用,将要被页面"<<page[i]<<"替换!"<<endl;
                        page_in_block[page[i]] = index;
                        block[index++] = page[i];
                        ++page_lack;
                        break;
                    } else
                        nru[index++] = 0;
                }
            }
        }
        for(int k=1; k<=m; ++k)
            cout<<block[k]<<" ";
        cout<<endl;
    }
    return page_lack;
}

int main(){
    cin>>n>>m;
    for(int i=1; i<=n; ++i){
        cin>>page[i];
        page_max = max(page_max, page[i]) ;
    }
     cout<<"opt缺页中断次数:"<<opt()<<endl;
     cout<<"***********************************"<<endl;
     cout<<"lru缺页中断次数:"<<lru()<<endl;
    cout<<"***********************************"<<endl;
    cout<<"fifo缺页中断次数:"<<fifo()<<endl;
    cout<<"***********************************"<<endl;
    cout<<"clock缺页中断次数:"<<clock()<<endl;
    return 0;
}
/*
20 3
7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1

12 3
2 3 2 1 5 2 4 5 3 2 5 2
*/ 
时间: 2024-11-06 14:30:21

操作系统页面置换算法(opt,lru,fifo,clock)实现的相关文章

操作系统 页面置换算法LRU和FIFO

LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换算法.该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最长的页面给予淘汰. FIFO置换算法有这样一个奇怪现象:内存空间块数越多,缺页中断率可能相反的越高(缺页中断次数越高). LFU(Least Frequently Used)最近最少使用算法,它是基于“如果一个数据在最近一段时间内使用次

操作系统虚拟内存中的四种典型页替换算法(OPT,LRU,FIFO,Clock)

由于程序可能会远大于内存,需要引入虚拟内存.基本思想是:每个程序都拥有自己的地址空间,这个空间被分割成很多块,每一块称作为一个页面,每一页有连续的地址范围,这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序.当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射,而当程序引用到一部分不在内存的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令.如果一个页面没有映射,内存管理单元注意到它没有映射时,使CPU陷入到操作系统,这个陷阱称为缺页中断. [

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

页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:FIFO置换算法.LRU置换算法.LFU置换算法 最佳置换算法:不可能实现-->是衡量其他置换算法的方法. FIFO置换算法:先进先出置换算法,淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰.(实现简单) LRU置换算法:最近最久未使用置换算法,该算法赋予每个页面一个访问字段,用来记录一

操作系统之页面置换算法(最佳置换OPT,先进先出FIFO,最近最久未使用LRU)

最近学习操作系统时,实验要求实现常见的三种页面置换算法,博主按照书上要求试着编写,实现了案例,并记录在博客随记中,以便后续自己复习并也给需要的同学分享参考一下!水平有限,若有错,请悄悄告诉博主!博主好立即改正. 最佳置换算法(optimal replacement,OPT)是从内存中选择今后不再访问的页面或者在最长一段时间后才需要访问的页面进行淘汰.如下例子: 1 #include <iostream> 2 #include <stdio.h> 3 #include <std

C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

目录 00 简介 01 算法概述 02 公用方法 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存的忙闲状态,为进程分配和释放内存.当主存的空间太小而无法装入所有的进程时,就需要在内存和硬盘之间进行调度操作. 多数操作系统只采用某种特定的页面置换算法进行置换,无法预先探测当前运行进程的页面访问模式,因此不能根据不同的页面访问模式,选用不同的页面置换算法.当然,如果能对不同的访问模式选取相应的页面置换算法,

操作系统之页面置换算法

在请求分页存储管理系统中,由于使用了虚拟存储管理技术,使得所有的进程页面不是一次性地全部调入内存,而是部分页面装入.这就有可能出现下面的情况:要访问的页面不在内存,这时系统产生缺页中断.操作系统在处理缺页中断时,要把所需页面从外存调入到内存中.如果这时内存中有空闲块,就可以直接调入该页面:如果这时内存中没有空闲块,就必须先淘汰一个已经在内存中的页面,腾出空间,再把所需的页面装入,即进行页面置换. 常见的页面置换算法有:先进先出法(FIFO).最佳置换法(OPT)和最近最少使用置换法(LRU).

页面置换算法-操作系统

操作系统中的页面置换算法 1.最佳置换算法(OPT) 这是理想算法,不可能实现的. 该算法是指,其所选择的淘汰页面,将是以后不再使用,或者未来最长时间内不再被访问的页面.这样来保证最低的缺页率. 例子: 假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串: 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1 (1)进程运行时,先将7,0,1 三个页面装入内存. (2)当进程要访问页面2 时,将会产生缺页中断.此时OS根据最佳置换算法,将选择页面7 予以淘汰.

操作系统原理(二)——内存管理之页面置换算法

页面置换算法 1. 总述 为提高内存利用率,解决内存供不应求的问题,更加合理的使用内存,人们创造了分页式内存抽象.同时有一个虚拟内存的概念,是指将内存中暂时不需要的部分写入硬盘,看上去硬盘扩展了内存的容量,所以叫做“虚拟”内存.使用虚拟内存,应用程序可以使用比实际物理内存更大的内存空间.可以认为这个更大的内存空间就在硬盘上,只有将某一部分需要被用到时,才被写入真实内存:当它暂时不再被用到时,又被写回硬盘.分页式内存管理将物理内存分为等大的小块,每块大小通常为1K.2K.4K等,称为页帧:逻辑内存

操作系统中10种页面置换算法的总结

页面置换算法总结 当发生缺页中断时,操作系统必须将内存中选择一个页面置换出去为要调入的新页面腾出空间. 那究竟选择哪一个淘汰哪一个一面比较好呢? 1.      最优页面置换算法 选择最长时间内不会被访问的页面丢掉.越久越好.但是理论上不能实现. 2.      最近未使用页面置换算法(NRU)算法 找到最久没有使用的页面置换出去,页面被访问时设置R位,修改时设置M位,R位定期清0: 把页面分四类 0类.未被访问,未被修改的R=M=0 1类未被访问,被修改R=0,M=1 2类被访问,未被修改R=