编写程序:
在linux的环境下,使用c/c++语言,编写程序模拟实现:
先进先出调度算法(必做)
最近最少使用调度算法(选做,有加分)
最近最不常用调度算法(选做,有加分),要求用程序框图描述程序功能,并上交框图。
程序具体要求:设置页框的大小为n个物理块,在输入一个内存块需求序列(如:3 2 1 3 2 5 2 3 6 2 1 4 2)之后,屏显每次页面调度结果,并屏显置换率。
LRU:
程序代码(最后有结果截图)
#include<iostream>
using namespace std;
int m, pMax = 6; //m是物理块数,pMax是次作业最大页号(全局变量)
int list[13] = { 3,2,1,3,2,5,2,3,6,2,1,4,2 };//示例的页号走向
struct page { //页结构体
int num;
int time;
};
//**main函数**:
int main()
{
cout << "\t\t请输入物理块大小(3--5之间):";
while (cin >> m) {//输入物理块
if (m >= 3 && m <= 5)
break;
else cout << "\t\t重新输入物理块大小(3--5之间):";
}
page *m_page = new page[m];
*m_page = initPage(m_page, m);
cout << "\t\t页表为:";
for (int i = 0; i < m; i++)
cout << m_page[i].num << " ";
cout << endl;
cout << "\t\t1.FIFO\n\t\t2.LRU\n\t\t3.LFU\n\t\t输入其他则重选!\n";
int choice;
while (cin >> choice)
{
if (choice == 1)
{
Fifo(m_page);
cout << "\n\n";
*m_page = initPage(m_page, m);
}
else if(choice==2)
{
Lfu(m_page);
cout << "\n\n";
*m_page = initPage(m_page, m);
}
else if (choice == 3)
{
Lru(m_page);
cout << "\n\n";
*m_page = initPage(m_page, m);
}
else
{
cout << "\t\t选错了!重选!\n\t\t1.FIFO\n\t\t2.LRU\n\t\t3.LFU\n\t\t输入其他则重选!\n";
}
cout << "\t\t1.FIFO\n\t\t2.LRU\n\t\t3.LFU\n\t\t输入其他则重选!\n";
}
}
//Max函数: //求出最近最长时间没有用的页
int Max(page *p)
{
int e = p[0].time;
for (int i = 0; i < m; i++)
{
if (e < p[i].time)
e = p[i].time;
}
for (int i = 0; i < m; i++)
{
if (e == p[i].time)
return i;
}
return -1;
}
//Min函数: //求出最近用的次数最少的页
int Min(page *p)
{
int e = p[0].time;
for (int i = 0; i < m; i++)
{
if (e > p[i].time)
e = p[i].time;
}
for (int i = 0; i < m; i++)
{
if (e == p[i].time)
return i;
}
return -1;
}
//show函数://打印出物理块里的内容
void show(page *p)
{
cout << "\t\t页表为:";
for (int i = 0; i < m; i++)
cout << p[i].num << " ";
cout << "\t";
}
//Search函数: //判断此页是否在页表中
int Search(int tem, page *p)
{
for (int i = 0; i < m; i++)
{
if (p[i].num == tem)
return i;
}
return -1;
}
initPage函数://将页表内容初始化为全0
page initPage(page *m_p, int tem)
{
for (int i = 0; i < tem; i++) {
m_p[i].num = 0;
m_p[i].time = 0;
}
cout << "\t\t初始化完成!\n";
return *m_p;
}
//(1)Fifo //先进先出
void Fifo(page* p) {
int flag = 0;
int next = 0;
int inMem = 0;
cout << "\t\t页面走向为:";
for (int i = 0; i < 13; i++)
cout << list[i] << " ";
cout << endl;
for (int q = 0; q < 13; q++) {
cout << "\t\t" << list[q] << endl;
if (list[q] <= pMax) {
int t = Search(list[q], p);
if (t >=0)
{
inMem = 1;
show(p);
cout << "\t\t在内存\n";
}
else inMem = 0;
if (inMem != 1)
{
for (int j = 0; j < m; j++)
{
if (p[j].num == 0)
{
flag = 1;
next = j;
break;
}
else flag = 0;
}
if (flag == 1)
{
p[next].num = list[q];
next = (next + 1) % m;
show(p);
cout << "\t\t调入\n";
}
else
{
p[next].num = list[q];
next = (next + 1) % m;
show(p);
cout << "\t\t置换\n";
}
}
}
else {
cout << "\t\t越界!程序退出\n";
exit(0);
}
}
}
//(2)Lru //最近最久未使用
void Lru(page* p) {
int flag = 0;
int next = 0;
int inMem = 0;
cout << "\t\t页面走向为:";
for (int i = 0; i < 13; i++)
cout << list[i] << " ";
cout << endl;
for (int q = 0; q < 13; q++) {
cout << "\t\t" << list[q] << endl;
if (list[q] <= pMax) {
next = Search(list[q], p);
if (next >= 0)
{
inMem = 1;
show(p);
p[next].time = 0;
cout << "\t\t在内存\n";
}
else inMem = 0;
if (inMem != 1)
{
for (int j = 0; j < m; j++)
{
if (p[j].num == 0)
{
flag = 1;
next = j;
break;
}
else flag = 0;
}
if (flag == 1)
{
p[next].num = list[q];
p[next].time = 0;
for (int z = 0; z < m; z++)
if (z != next)
p[z].time++;
//next = (next + 1) % m;
show(p);
cout << "\t\t调入\n";
}
else
{
next = Max(p);
p[next].num = list[q];
p[next].time = 0;
for (int z = 0; z < m; z++)
if (z != next)
p[z].time++;
//next = (next + 1) % m;
show(p);
cout << "\t\t置换\n";
}
}
else
{
p[next].time = 0;
for (int z = 0; z < m; z++)
if (z != next && p[z].num != 0)
p[z].time++;
}
}
else {
cout << "\t\t越界!程序退出\n";
exit(0);
}
}
}
//(3)Lfu //最近最少用
void Lfu(page* p)
{
int flag = 0;
int next = 0;
int inMem = 0;
cout << "\t\t页面走向为:";
for (int i = 0; i < 13; i++)
cout << list[i] << " ";
cout << endl;
for (int q = 0; q < 13; q++) {
cout << "\t\t" << list[q] << endl;
if (list[q] <= pMax) {
next = Search(list[q], p);
if (next >= 0)
{
inMem = 1;
show(p);
cout << "\t\t在内存\n";
}
else inMem = 0;
if (inMem != 1)
{
for (int j = 0; j < m; j++)
{
if (p[j].num == 0)
{
flag = 1;
next = j;
break;
}
else flag = 0;
}
if (flag == 1)
{
p[next].num = list[q];
p[next].time++;
show(p);
cout << "\t\t调入\n";
}
else
{
next = Min(p);
p[next].num = list[q];
p[next].time = 1;
show(p);
cout << "\t\t置换\n";
}
}
else
{
p[next].time++;
}
}
else {
cout << "\t\t越界!程序退出\n";
exit(0);
}
}
}