操作系统 实验二内容2

使用C语言模拟时钟置换页法

下面是题目

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

以下是代码,不保证最优

#include<stdio.h>
#define PAGE_SIZE 4096 //定义页面大小为 4KB
#define PAGE_NUM 4 //定义分配给进程的物理页帧数为 4 页
#define VIRTURAL_SPACE 8 //定义进程的虚拟地址空间大小为 8 页
int main(){
	int n; 
	int i;
	int page_now;
	int page_line;
	int page_change;
	int page[PAGE_NUM];
	int page_p[VIRTURAL_SPACE];
	int page_r[VIRTURAL_SPACE]; 
	int page_vir[VIRTURAL_SPACE];
	int add_phy;
	for(i=0;i<VIRTURAL_SPACE;i++){
		page_p[i] = 0;
		page_r[i] = 0;
		page_vir[i] = 0;
	}
	page_now = 0;
	page_line = 0;
	page_change = 0;
	add_phy = 0;
	for(i=0;i<PAGE_NUM;i++){
		page[i] = -1;
	} 
	printf("please input the virtual address (end of -1):");
	scanf("%d", &n);
	while(n >= 0){
		page_line = n / PAGE_SIZE;
		if(page_p[page_line] == 1){
			add_phy = n;
			printf("the page is in the RAM, and the physical address is %d\n",add_phy);
			//刷新r
			for(i=0;i<VIRTURAL_SPACE;i++){
				if(i != page_line){
					page_r[i] = 0;
				} 
				else{
					page_r[i] = 1;
				}
			}
		}
		else{
			printf("the page is not in the RAM!\n"); 
			if(page_now < PAGE_NUM){ 
				printf("there are free pages, we can get NO.%d page!\n",page_now); 
				page_now++;
				page[page_change] = page_line;
				for(i=0;i<VIRTURAL_SPACE;i++){
					if(i != page_line){
						page_r[i] = 0;
					} 
					else{
						page_r[i] = 1;
					}
				}
				page_r[page_line] = 1; 
				page_vir[page_line] = page_change;
				page_change=(page_change + 1)%PAGE_NUM;
			}
			else{
				printf("there is no free page in RAM,so we have to exchange one!\n");
				if(page_r[page[page_change]] == 1){
					printf("page NO.%d is just read, we should search next one!\n",page_change);
					page_change=(page_change + 1)%PAGE_NUM;
				}
				printf("NO.%d page is exchanged!!\n",page_change);
				page[page_change] = page_line;
				page_vir[page_line] = page_change;
				page_change=(page_change + 1)%PAGE_NUM;
				for(i=0;i<VIRTURAL_SPACE;i++){
					if(i != page_line){
						page_r[i] = 0;
					} 
					else{
						page_r[i] = 1;
					}
				}
			}
			
		} 
		for(i=0;i<VIRTURAL_SPACE;i++){
			page_p[i] = 0;
		}
		for(i = 0;i<PAGE_NUM;i++) {
			if(page[i] != -1){
				page_p[page[i]] = 1;
			}
		}
		printf("pa_num\tR\tP\n");
		for(i = 0;i<VIRTURAL_SPACE;i++){
			printf("%d\t%d\t%d\n",page_vir[i],page_r[i],page_p[i]);
		}
		printf("please input the virtual address (end of -1):");
		scanf("%d",&n);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值