页面置换模拟程序设计(C语言的存储管理) 您所在的位置:网站首页 c语言存储结构有哪些 页面置换模拟程序设计(C语言的存储管理)

页面置换模拟程序设计(C语言的存储管理)

2023-07-01 12:40| 来源: 网络整理| 查看: 265

源码下载地址:https://download.csdn.net/download/sheziqiong/87791262 源码下载地址:https://download.csdn.net/download/sheziqiong/87791262

1. 题目简介

用C语言设计一个程序,模拟一作业的执行过程。设该作业共有320条指令,即它的地址空间为32页,目前它的所有页面都还未调入内存。在模拟过程中,如果所访问的指令已经在内存,则显示其物理地址,并转下一条指令。如果所访问的指令尚未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业的虚页面,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。

2. 所用数据结构 /*定义内存中物理块的结构*/ struct memoryblock { int pagenumber; // 页面号 int access; // 访问位 int time; // 访问时间 int counter; // 访问次数 }; struct memoryblock M[4]; 3. 程序代码描述 void init()//初始化内存物理块 void random()//生成随机数 void FIFO()//先进先出置换算法 void CLOCK()//时钟置换算法 void LRU()//最近最久未使用置换算法 void LFU()//最近最少访问置换算法

核心代码:

void random() { srand((unsigned)time(NULL)); int cnt = 0; command[cnt] = rand() % 320; cnt++; command[cnt] = command[cnt - 1] + 1; cnt++; while (cnt < 320) { command[cnt] = rand() % command[cnt - 2]; cnt++; command[cnt] = command[cnt - 1] + 1; cnt++; command[cnt] = rand() % (320 - command[cnt - 1]) + command[cnt - 1]; cnt++; command[cnt] = command[cnt - 1] + 1; cnt++; } } void oncefifo(int a) { int i; int p=0;//指向队首的指令 int b = a / 10; int flag=0; for (i = 0;i < 4;i++) { if (M[i].pagenumber == b)//表示页面在内存中 { M[i].access = 1; flag = 1; break; } if (M[i].pagenumber == -1)//表示页面不在内存中,且物理块为空 { M[i].access = 1; M[i].pagenumber = b; p = (p + 1) % 4; unfindpage++; flag = 1; break; } } if (flag == 0)//进行页面置换 { M[p].pagenumber = b; M[p].access = 1; unfindpage++; } } void onceclock(int a) { int i; int p=0; int b = a / 10; int flag = 0; for (i = 0;i < 4;i++) { if (M[i].pagenumber == b)//表示页面在内存中 { M[i].access = 1; flag = 1; break; } if (M[i].pagenumber == -1)//表示页面不在内存中,且物理块为空 { M[i].access = 1; M[i].pagenumber = b; p = (p + 1) % 4; unfindpage++; flag = 1; break; } } if (flag == 0) { while (M[p].access != 0) { M[p].access = 0; p = (p + 1) % 4; } M[p].pagenumber = b; M[p].access = 1; p = (p + 1) % 4; unfindpage++; } } void oncelru(int a) { int b = a / 10; int flag = 0; int i,j; for (i = 0;i < 4;i++) { if (M[i].pagenumber == b)//页面在内存中,更新时间 { M[i].time = 0; M[i].access = 1; flag = 1; for (j = 0;j < 4;j++) { if (j != i&&M[j].pagenumber != -1)//其他未被访问的页面的时间加一 { M[j].time++; } } break; } if (M[i].pagenumber == -1)//页面不在内存中,且物理块为空 { M[i].time = 0; M[i].pagenumber = b; M[i].access = 1; unfindpage++; flag = 1; for (j = 0;j < 4;j++) { if (j != i&&M[j].pagenumber != -1) { M[j].time++; } } break; } } if (flag == 0)//页面不在内存中,进行置换 { sort(M, M + 4, cmp1); M[0].time=0; M[0].access = 1; M[0].pagenumber = b; unfindpage++; for (j = 1;j < 4;j++) { M[j].time++; } } } void oncelfu(int a) { int b = a / 10; int flag = 1; int i; for (i = 0;i < 4;i++) { if (M[i].pagenumber == b)//页面在内存中 { M[i].counter++; flag = 1; M[i].access = 1; break; } if (M[i].pagenumber = -1) { M[i].counter++; M[i].pagenumber = b; M[i].access = 1; flag = 1; unfindpage++; break; } } if (flag == 0) { sort(M, M + 4, cmp2); M[0].pagenumber = b; M[0].counter=1; M[i].access = 1; unfindpage++; } } 4. 运行结果

主菜单:

源码下载地址:https://download.csdn.net/download/sheziqiong/87791262 源码下载地址:https://download.csdn.net/download/sheziqiong/87791262



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有