操作系统之——页面置换算法C语言实现

// 页面置换算法.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "string.h"


#define MEMORY_BLOCKS 20	//内存物理总块数
#define PROGRAM_PAGES 50	//程序分页数上限
#define PAGE_USE_LONGTH 100	//页面走向长度最大值
#define FIFO 1	//先进先出置换
#define LRU 2	//最久未用置换


int memory_blocks=0;	//分配内存物理块数
int program_pages=0;	//程序分页数

int memory_allocation[MEMORY_BLOCKS];	//内存分配情况

struct VISIT {	//访问字段
	int load_time;	//装载时间
	int frequency;	//使用频率的顺序,0为最高
};

struct PAGR_LIST {	//页表
	int page_num;	//页号
	int block_num;	//物理块号
	bool state;		//状态位
	bool modify;	//修改位
	struct VISIT visit;	//访问字段
	int disk;	//外存地址
}page_list[PROGRAM_PAGES];


int create_rand(int a, int b);
void init(int m, int p);
void page_adjust(int p);
bool allocation_once(int p, int f);
int change_page(int f);
void huanhang(int l);
void show_me();
void simulation(int l, int f);
void menu();


int create_rand(int a, int b) {		//生成随机数
	int r;
	r = rand() % (b - a+1) + a;
	//printf("%d",r);
	return r;
}

void init(int m,int p) {	
	memory_blocks = m;
	program_pages = p;
	for (int i = 0; i < memory_blocks ; i++) {
		memory_allocation[i] = -1;
	}
	for (int i = 0; i < program_pages ; i++) {
		page_list[i].page_num = i;
		page_list[i].block_num = -1;
		page_list[i].state = false;
		page_list[i].modify = false;
		page_list[i].visit.load_time = 0;
		page_list[i].visit.frequency = -1;
	}
	printf("\n初始化完成\n");
}

void page_adjust(int p) {	//内存中其他页的调整
	for (int i = 0; i  out) {
				out = page_list[memory_allocation[i]].visit.load_time;
				block = i;
			}		
		}
		out = memory_allocation[block];
	}
	else if(f == LRU){
		for (int i = 0; i < memory_blocks; i++) {
			if (page_list[memory_allocation[i]].visit.frequency == memory_blocks-1) {
				block = i;
				break;
			}				
		}
		out= memory_allocation[block];
	}
	//收尾操作
	memory_allocation[block] = -1;
	page_list[out].block_num = -1;
	page_list[out].state = false;
	page_list[out].visit.load_time = 0;
	page_list[out].visit.frequency = -1;
	return out;
}

void huanhang(int l){	//换行(页表显示用)
	printf("\n+--------");
	for (int i = 0; i PROGRAM_PAGES||a<1) {
				printf("\n输入数值非法,请重新输入", PROGRAM_PAGES);
				scanf("%d", &a);
			}
			printf("\n请输入为该进程分配的物理块数(最大%d)  ", MEMORY_BLOCKS);
			scanf("%d", &b);
			while (b > MEMORY_BLOCKS||b<1) {
				printf("\n输入数值非法,请重新输入", MEMORY_BLOCKS);
				scanf("%d", &b);
			}
			init(b,a);
		}
		else if (_stricmp(code, "show") == 0) {	//显示功能
			show_me();
		}
		else if (_stricmp(code, "FIFO") == 0) {	//先进先出置换
			int l;
			printf("\n请输入页面走向长度  ");
			scanf("%d",&l);
			simulation(l,FIFO);
		}
		else if (_stricmp(code, "LRU") == 0) {	//最久未用置换
			int l;
			printf("\n请输入页面走向长度  ");
			scanf("%d", &l);
			simulation(l, LRU);
		}
		else if (_stricmp(code, "clear") == 0) {	//清屏
			system("cls");
			printf("\n                             页面置换模拟\n");
			printf("\n初始化(init) 显示页表信息(show) 页面置换算法(FIFO)或(LRU) \n清屏(clear)\n");
		}
		else printf("命令无效,请重新输入\n");
	}
}


int main()
{
	srand(time(NULL));
	menu();
	
	getchar();
	
    return 0;
}

你可能感兴趣的:(操作系统)