操作系统题目3 页面置换算法模拟程序

操作系统题目3 页面置换算法模拟程序

一、目的

熟悉页面置换算法及其实现,引入计算机系统性能评价方法的概念。

二、内容

编制页面置换算法的模拟程序。

三、要求

1.用随机数方法产生页面走向,页面走向长度为L。

2.根据页面走向,分别采用FIFO和LRU算法进行页面置换,统计缺页率。

3.假定可用内存块和页表长度 (作业的页面数)分别为m和k,初始时,作业页面都不在内存。

随机数产生程序:
function random: real:
begin Seed: =125.0*(seed+1.0)
Seed: =Seed-8192.0*trunc (seed/8192)
random: = (Seed+0.5)/8192
end;
上述随机数发生函数产生的随机数为0.0-1.0,稍另变化就可得到0~n-1之间的随机数。
程序开始时,应对变量Seed (实型)赋初值。

四、代码示例

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    //ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    init();
    //cout << "请分别输入可用内存块m,作业的页面数k,页面走向长度为L\n";
    //cin >> m >> k >> L;
    //读取可用内存块m,作业的页面数k,页面走向长度L
    m = ui->lineEdit->text().toInt();
    k = ui->lineEdit_2->text().toInt();
    L = ui->lineEdit_3->text().toInt();

    //cout << "随机生成的页面走向为:\n";
    //随机生成页面走向
    for (int i = 0; i < L; i++) {
      ReqPage[i] = static_cast<int>(random() * k);
       // random()生成0~1,  random()*k 向零取整为0~k-1
      //out << ReqPage[i]<< " ";
      ui->plainTextEdit->insertPlainText(QString::number(ReqPage[i])+" ");
    }
    ui->plainTextEdit->insertPlainText("\n");
    //puts("");
    //!!!因为请求序列是随机生成的,不符合局部性原理,很多情况下LRU表现不比FIFO好
    CALC_FIFO();
    CALC_LRU();
}

void MainWindow::on_pushButton_2_clicked()
{
    init();
    ui->lineEdit->clear();
    ui->lineEdit_2->clear();
    ui->lineEdit_3->clear();
    ui->lineEdit_4->clear();
    ui->lineEdit_5->clear();
}

double MainWindow::random() {
    static double Seed = 233;  //随机种子,在此处可改变初值
    Seed = 125.0 * (Seed + 1.0);
    Seed = Seed - 8192.0 * (int)(Seed/8192);
    return (Seed+0.5)/8192;
}


void MainWindow::CALC_FIFO() {
    //cout << "FIFO strategy\n";
    static int PageTable[MAX_M];
    int missNum = 0;
    for (int i = 0; i<m && i<L; i++) {
      PageTable[i] = ReqPage[i];
      missNum++;
    }
    int lastId = 0;
    if (L > m) {
        for (int i = m; i < L; i++) {
            int *pageIt = std::find(PageTable, PageTable+m, ReqPage[i]);//QT 用find 函数要 std::find
            if (pageIt != PageTable+m) continue;
            missNum++;
            //printf("第%d次缺页,%d换入,%d换出\n",missNum,ReqPage[i],PageTable[lastId]);
            ui->plainTextEdit_2->insertPlainText("第"+QString::number(missNum)+"次查页表时缺页,换出页面"+QString::number(PageTable[lastId])+",换入页面"+QString::number(ReqPage[i])+";\n");
            PageTable[lastId] = ReqPage[i];
            lastId = lastId+1;
            if (lastId == m) lastId = 0;
        }
    }
    //printf("缺页率%g\n", 1.0*missNum/L);
    ui->lineEdit_4->setText(QString::number(1.0*missNum/L));
}

void MainWindow::CALC_LRU() {
   // cout << "LRU算法\n";
    int PageTable[MAX_M];
    int LastVisitTime[MAX_M]; //记录最近访问时间
    int missNum = 0;
    for (int i = 0; i<m && i<L; i++) {
      PageTable[i] = ReqPage[i];
      LastVisitTime[i] = i;
      missNum++;
    }
    if (L > m) {
        for (int i = m; i < L; i++) {
            int *pageIt = std::find(PageTable, PageTable+m, ReqPage[i]);
            if (pageIt != PageTable+m) {
                LastVisitTime[pageIt - PageTable] = i;
                continue;
            }
            missNum++;
            int *minLastVisitIt = min_element(LastVisitTime, LastVisitTime + m);
            int pageOutId = minLastVisitIt - LastVisitTime;
            //printf("第%d次缺页,%d换入,%d换出\n",missNum,ReqPage[i],PageTable[pageOutId]);
            ui->plainTextEdit_3->insertPlainText("第"+QString::number(missNum)+"次查页表时缺页,换出页面"+QString::number(PageTable[pageOutId])+",换入页面"+QString::number(ReqPage[i])+";\n");
            PageTable[pageOutId] = ReqPage[i];
            LastVisitTime[pageOutId] = i;
        }
    }
    //printf("\n缺页率%g\n", 1.0*missNum/L);
    ui->lineEdit_5->setText(QString::number(1.0*missNum/L));
}

void MainWindow::init(){
    for (int i = 0; i < L; i++) {
        ReqPage[i]=0;
    }
    m=0;
    k=0;
    L=0;
    ui->plainTextEdit->clear();
    ui->plainTextEdit_2->clear();
    ui->plainTextEdit_3->clear();
}

界面:
在这里插入图片描述源码详见主页资源


参考链接

http://t.csdn.cn/TPwC5

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值