#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
#include <iostream>
#include <memory.h>
using namespace std;
#define MAX_PAGES 50 // 页面序列最大长度
#define MAX_BLOCK 10 // 内存块最大长度
int block_num; // 内存块数量
int page_max_num; // 随机页号最大值
int count_pages; // 页面序列长度
int pages[MAX_PAGES]; // 保存页面序列的数组
int* block; // 动态内存块数组
int* pages_in_block; // 保存页面状态
int page_replaced = 0; // 淘汰页号
int page_lack_count = 0; // 缺页次数
void MainWindow::FIFO() {
int i, j;
int replaced_old;
page_replaced = 0;
page_lack_count = 0;
// 初始化内存块block和页面状态的值为-1,表示没有装入
block = (int*)malloc(block_num * sizeof(int));
memset(block, -1, block_num * sizeof(int));
pages_in_block = (int*)malloc(page_max_num * sizeof(int));
memset(pages_in_block, -1, page_max_num * sizeof(int));
QString txt;
for (i = 0; i < count_pages; i++) {
txt = tr("%1").arg(pages[i]) + " --> ";
ui->textBrowser_2->insertPlainText(txt);
if (pages_in_block[pages[i]] == -1) {
page_lack_count++;
// 寻找空闲块,修改block状态为已装入,page状态为已装入
for(j = 0; j < block_num; j++){
if (block[j] == -1) break;
}
if(j < block_num){
// 有空闲块
block[j] = pages[i];
pages_in_block[pages[i]] = 1;
}
else{
// 没有空闲块,页面置换:淘汰页面状态置为-1,修改淘汰页面索引
pages_in_block[block[page_replaced]] = -1;
replaced_old = block[page_replaced];
block[page_replaced] = pages[i];
page_replaced = (page_replaced + 1) % block_num;
pages_in_block[pages[i]] = 1;
}
for(j = 0; j < block_num; j++)
if (block[j] != -1){
txt = tr("%1").arg(block[j]) + " ";
ui->textBrowser_2->insertPlainText(txt);
}
if (page_lack_count > block_num){
txt = " 淘汰页为:" + tr("%1").arg(replaced_old) + "\n";
ui->textBrowser_2->insertPlainText(txt);
}
else
ui->textBrowser_2->insertPlainText("\n");
}
else
ui->textBrowser_2->insertPlainText("\n");
}
txt = "缺页次数为:" + tr("%1").arg(page_lack_count) + ",缺页率为:" + tr("%1").arg(page_lack_count * 1.0 / count_pages) + "\n";
ui->textBrowser_2->insertPlainText(txt);
}
void MainWindow::LRU() {
int i, j, k, m, h;
int replaced_old;
page_replaced = 0;
page_lack_count = 0;
block = (int*)malloc(block_num * sizeof(int));
memset(block, -1, block_num * sizeof(int));
pages_in_block = (int*)malloc(page_max_num * sizeof(int));
memset(pages_in_block, -1, page_max_num * sizeof(int));
QString txt;
for (i = 0; i < count_pages; i++) {
h = 0;
txt = tr("%1").arg(pages[i]) + " --> ";
ui->textBrowser_2->insertPlainText(txt);
if (pages_in_block[pages[i]] == -1){
page_lack_count++;
// 找空闲块
for(j = 0; j < block_num; j++){
if (block[j] == -1) break;
}
if(j < block_num){
block[j] = pages[i];
pages_in_block[pages[i]] = 1;
}
else{
int a[MAX_BLOCK], p;
for (p = 0; p < block_num; p++)
a[p] = 0;
for (k = i - 1; k >= 0; k--) {
for (m = 0; m < j; m++)
if (pages[k] == block[m] && a[m] == 0){
h = m;
a[m] = 1;
}
}
pages_in_block[block[h]] = -1;
replaced_old = block[h];
block[h] = pages[i];
pages_in_block[pages[i]] = 1;
}
for (j = 0; j < block_num; j++) //显示内存块数组中的页号
if (block[j] != -1){
txt = tr("%1").arg(block[j]) + " ";
ui->textBrowser_2->insertPlainText(txt);
}
if (page_lack_count > block_num){
txt = " 淘汰页为:" + tr("%1").arg(replaced_old) + "\n";
ui->textBrowser_2->insertPlainText(txt);
}
else
ui->textBrowser_2->insertPlainText("\n");
}
else
ui->textBrowser_2->insertPlainText("\n");
}
txt = "缺页次数为:" + tr("%1").arg(page_lack_count) + ",缺页率为:" + tr("%1").arg(page_lack_count * 1.0 / count_pages) + "\n";
ui->textBrowser_2->insertPlainText(txt);
}
void MainWindow::on_pushButton_clicked()
{
block_num = ui->lineEdit->text().toInt();
page_max_num = ui->lineEdit_2->text().toInt();
count_pages = ui->lineEdit_3->text().toInt();
int i, n;
QString txt;
// 生成随机页面序列
for (i = 0; i < count_pages; i++) {
n = rand() % page_max_num;
pages[i] = n;
}
ui->textBrowser->clear();
for(i = 0; i < count_pages; i++){
txt = tr("%1").arg(pages[i]) + " ";
ui->textBrowser->insertPlainText(txt);
}
}
void MainWindow::on_pushButton_2_clicked()
{
QButtonGroup *m_btnGroup1 = new QButtonGroup;
m_btnGroup1->addButton(ui->radioButton, 0);
m_btnGroup1->addButton(ui->radioButton_2, 1);
ui->textBrowser_2->clear();
// 如果按钮组内ID为0的单选按钮被选中
if(m_btnGroup1->checkedId() == 0)
FIFO();
if(m_btnGroup1->checkedId() == 1)
LRU();
}
没有合适的资源?快使用搜索试试~ 我知道了~
操作系统实验:内存管理作业(有界面 QT 可视化)
共6个文件
cpp:2个
pro:1个
h:1个
需积分: 5 5 下载量 48 浏览量
2022-07-14
12:33:24
上传
评论 5
收藏 6KB ZIP 举报
温馨提示
内存管理作业 1、实验目的:加深对于存储管理的了解,掌握虚拟存储器的实现原理;观察和了 解重要的页面置换算法和置换过程。练习模拟算法的编程技巧,锻炼分析试验数据的能力。 2、实验说明:(1)示例实验程序中模拟两种置换算法:LRU 算法和 FIFO 算法。(2)给定任意序列不同的页面引用序列和任意分配页面数目,显示两种 算法的页置换过程。(3)能统计和报告不同置换算法情况下依次淘汰的页号、缺页次数(页 错误数)和缺页率。
资源详情
资源评论
资源推荐
收起资源包目录
04.zip (6个子文件)
04
04.pro.user 22KB
main.cpp 183B
mainwindow.ui 6KB
04.pro 1021B
mainwindow.cpp 6KB
mainwindow.h 494B
共 6 条
- 1
EuphoriaTime
- 粉丝: 4
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0