调度算法实现---C++

编写程序:
在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);
		}
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值