操作系統實驗——頁面置換模擬程序設計

#include <iostream>
#include <stdlib.h>
#include <time.h> 
using namespace std;
#define VM_PAGE 32      /*假設每個頁面可以存放10條指令,則共有32個虛頁*/
#define PM_PAGE 4         /*分配給作業的內存塊數爲4*/
#define TOTAL_INSERT 320
typedef struct
{
	int vmn;
	int pmn;
	int exist;
	int time;
	int number;
}vpage_item;
vpage_item page_table[VM_PAGE];
vpage_item* ppage_bitmap[PM_PAGE];
int vpage_arr[TOTAL_INSERT];
void init_data() //數據初始化
{
	for (int i = 0; i < VM_PAGE; i++)
	{
		page_table[i].vmn = i + 1;  //虛頁號
		page_table[i].pmn = -1;    //實頁號
		page_table[i].exist = 0;
		page_table[i].time = -1;
		page_table[i].number = 0;
	}
	for (int i = 0; i < PM_PAGE; i++) /*最初4個物理塊爲空*/
	{
		ppage_bitmap[i] = NULL;
	}
}
void FIFO()/*FIFO頁面置換算法*/
{
	int k = 0;
	int i;
	int sum = 0;
	int missing_page_count = 0;
	int current_time = 0;
	bool isleft = true;   /*當前物理塊中是否有剩餘*/
	while (sum < TOTAL_INSERT)
	{
		if (page_table[vpage_arr[sum] - 1].exist == 0)
		{
			missing_page_count++;
			if (k < PM_PAGE)
			{
				if (ppage_bitmap[k] == NULL) /*找到一個空閒物理塊*/
				{
					ppage_bitmap[k] = &page_table[vpage_arr[sum] - 1];
					ppage_bitmap[k]->exist = 1;
					ppage_bitmap[k]->pmn = k;
					ppage_bitmap[k]->time = current_time;
					k++;
				}
			}
			else
			{
				int temp = ppage_bitmap[0]->time;	/*記錄物理塊中作業最早到達時間*/
				int j = 0;                    /*記錄應當被替換的物理塊號*/
				for (i = 0; i < PM_PAGE; i++)
				{
					if (ppage_bitmap[i]->time < temp)
					{
						temp = ppage_bitmap[i]->time;
						j = i;
					}
				}
				ppage_bitmap[j]->exist = 0;
				ppage_bitmap[j] = &page_table[vpage_arr[sum] - 1];      /*更新頁表項*/
				ppage_bitmap[j]->exist = 1;
				ppage_bitmap[j]->pmn = j;
				ppage_bitmap[j]->time = current_time;
			}
		}
		current_time++;
		sum++;
	}
	printf("FIFO算法缺頁次數爲:%d\t缺頁率爲:%f\t置換次數爲:%d\t置換率爲:%f\n", missing_page_count, missing_page_count / (float)TOTAL_INSERT, missing_page_count - 4, (missing_page_count - 4) / (float)TOTAL_INSERT);
}
void LRU()
{
	int k = 0;
	int i;
	int sum = 0;
	int missing_page_count = 0;
	int current_time = 0;
	bool isleft = true;   /*當前物理塊中是否有剩餘*/
	while (sum < TOTAL_INSERT)
	{
		if (page_table[vpage_arr[sum] - 1].exist == 0)
		{
			missing_page_count++;
			if (k < PM_PAGE)
			{
				if (ppage_bitmap[k] == NULL) /*找到一個空閒物理塊*/
				{
					ppage_bitmap[k] = &page_table[vpage_arr[sum] - 1];
					ppage_bitmap[k]->exist = 1;
					ppage_bitmap[k]->pmn = k;
					ppage_bitmap[k]->time = current_time;
					k++;
				}
			}
			else
			{
				int temp = ppage_bitmap[0]->time;	/*記錄物理塊中作業最早到達時間*/
				int j = 0;                    /*記錄應當被替換的物理塊號*/
				for (i = 0; i < PM_PAGE; i++)
				{
					if (ppage_bitmap[i]->time < temp)
					{
						temp = ppage_bitmap[i]->time;
						j = i;
					}
				}
				ppage_bitmap[j]->exist = 0;
				ppage_bitmap[j] = &page_table[vpage_arr[sum] - 1];      /*更新頁表項*/
				ppage_bitmap[j]->exist = 1;
				ppage_bitmap[j]->pmn = j;
				ppage_bitmap[j]->time = current_time;
			}
		}
		else
		{
			page_table[vpage_arr[sum] - 1].time = current_time;
		}
		current_time++;
		sum++;
	}
	printf("LRU算法缺頁次數爲:%d\t缺頁率爲:%f\t置換次數爲:%d\t置換率爲:%f\n", missing_page_count, missing_page_count / (float)TOTAL_INSERT, missing_page_count - 4, (missing_page_count - 4) / (float)TOTAL_INSERT);
}
void OPT()
{
	int k = 0;
	int i;
	int sum = 0;
	int missing_page_count = 0;
	int current_time = 0;
	while (sum < TOTAL_INSERT)
	{
		if (page_table[vpage_arr[sum] - 1].exist == 0)
		{
			missing_page_count++;
			if (k < PM_PAGE)
			{
				if (ppage_bitmap[k] == NULL) /*找到一個空閒物理塊*/
				{
					ppage_bitmap[k] = &page_table[vpage_arr[sum] - 1];
					ppage_bitmap[k]->exist = 1;
					ppage_bitmap[k]->pmn = k;
					ppage_bitmap[k]->time = current_time;
					ppage_bitmap[k]->number = vpage_arr[sum];
					k++;
				}
			}
			else
			{    
				int i, k;
				int j = 0;/*記錄應當被替換的物理塊號*/
				int distance[PM_PAGE] = {0};
				int count = 0;
				for (i = sum + 1; i < TOTAL_INSERT; i++)
				{
					for (k = 0; k < PM_PAGE; k++)
					{
						if (vpage_arr[i] == ppage_bitmap[k]->number&&distance[k] == 0)
						{
							distance[k] = i - sum;
							count++;
							break;
						}
					}
					if (count == 3)
					{
						for (k = 0; k < PM_PAGE; k++)
						{
							if (distance[k] == 0)
							{
								j = k;
								break;
							}
						}
						break;
					}
				}
				ppage_bitmap[j]->exist = 0;
				ppage_bitmap[j] = &page_table[vpage_arr[sum] - 1];      /*更新頁表項*/
				ppage_bitmap[j]->exist = 1;
				ppage_bitmap[j]->pmn = j;
				ppage_bitmap[j]->time = current_time;
				ppage_bitmap[j]->number = vpage_arr[sum];
			}
		}
		current_time++;
		sum++;
	}
	printf("OPT算法缺頁次數爲:%d\t缺頁率爲:%f\t置換次數爲:%d\t置換率爲:%f\n", missing_page_count, missing_page_count / (float)TOTAL_INSERT, missing_page_count - 4, (missing_page_count - 4) / (float)TOTAL_INSERT);
}
int main()
{
	int a, n, m, count = -1;
	int live[TOTAL_INSERT] = {0};
srand((unsigned)time(NULL));
	while (count < TOTAL_INSERT - 1)
	{
		//產生隨機數n,0至319
		n = rand() % 320;
		if (live[n] == 0)
		{
			live[n] == 1;
			count++;
		}
		else
			continue;
		m = n / 10 + 1;//m爲頁面號,每10個指令爲一個頁面
		vpage_arr[count] = m;//頁面號存入
	}
	printf("請輸入需要選擇的頁面置換算法:1.FIFO\t2.LRU\t3.OPT\t輸入0結束\n");
	do
	{
		scanf_s("%d", &a);
		switch (a)
		{
		case 1:
			init_data();
			FIFO();
			break;
		case 2:
			init_data();
			LRU();
			break;
		case 3:
			init_data();
			OPT();
			break;
		}
	} while (a != 0);
	return 0;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章