📄 test1.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#define mSIZE 4
#define pSIZE 15
int memery[mSIZE] = {0};
int process[pSIZE] = {0};
void build(); //生成一个随机数序列
void LRU(); //最近最久未使用(LRU)置换算法
void FIFO(); //先进先出(FIFO)页面置换算法
void OPT(); //最佳淘汰(OPT)算法
void LFU(); //最少访问(LFU)页面算法
void NUR(); //最近最不经常使用(NUR)算法
int main() {
int core;
printf("=============================\n");
printf("产生随机序列如下:");
build();
do{
printf("\n 主菜单\n\n");
printf("1. 先进先出(FIFO)页面置换算法\n");
printf("2. 最近最久未使用(LRU)置换算法\n");
printf("3. 最佳淘汰(OPT)算法\n");
printf("4. 最少访问(LFU)页面算法\n");
printf("5. 最近最不经常使用(NUR)算法 \n");
printf("6. 退出程序\n");
printf("请输入你的选择(1,2,3,4,5,6)\n");
printf("=============================\n");
scanf("%d",&core);
switch(core){
case 1:FIFO();break;
case 2:LRU(); break;
case 3:OPT(); break;
case 4:LFU(); break;
case 5:NUR();break;
case 6:exit(0);
}
}while(core<=6);
return 0;
}
void build() {
int i = 0;
for(i=0; i<pSIZE; i++) {
process[i] = (int)(10.0*rand()/(RAND_MAX+1.0) + 1);
printf("%d ",process[i]);
}
printf("\n");
}
void FIFO() {
int time[mSIZE] = {0};
int i = 0, j = 0;
int m = -1, n = -1;
int max = -1,maxtime = 0;
int count = 0;
for(i = 0; i<pSIZE; i++) { //找一个空闲的物理块
for(j=0; j<mSIZE; j++) {
if(memery[j] == 0) {
m = j;
break;
}
}
for(j = 0; j < mSIZE; j++) { //找与进程相同的标号
if(memery[j] == process[i]) {
n = j;
}
}
for(j = 0; j < mSIZE;j++) { //找time值最大的
if(time[j]>maxtime) {
maxtime = time[j];
max = j;
}
}
if(n == -1){ //不存在相同进程
if(m != -1){ //存在空闲物理块
memery[m] = process[i];
time[m] = 0;
for(j = 0;j <= m; j++) {
time[j]++;
}
m = -1;
}
else{ //不存在空闲物理块
memery[max] = process[i];
time[max] = 0;
for(j = 0;j < mSIZE; j++) {
time[j]++;
}
max = -1;
maxtime = 0;
count++;
}
}
else{ //存在相同的进程
memery[n] = process[i];
for(j = 0;j < mSIZE; j++) {
time[j]++;
}
n = -1;
}
for(j = 0 ;j < mSIZE; j++)
printf("[ %d ]",memery[j]);
printf("\n");
}
for(j = 0 ;j < mSIZE; j++)
memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE);
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE);
}
void LRU() {
int flag[mSIZE] = {0};
int i = 0, j = 0;
int m = -1, n = -1;
int max = -1,maxflag = 0;
int count = 0;
for(i = 0; i<pSIZE; i++) { //找第一个空闲的物理块
for(j=0; j<mSIZE; j++) {
if(memery[j] == 0) {
m = j;
break;
}
}
//找与进程相同的标号
for(j = 0; j < mSIZE; j++) {
if(memery[j] == process[i]) {
n = j;
}
}
//找flag值最大的
for(j = 0; j < mSIZE;j++) {
if(flag[j]>maxflag) {
maxflag = flag[j];
max = j;
}
}
if(n == -1){ //不存在相同进程
if(m != -1){ //存在空闲物理块
memery[m] = process[i];
flag[m] = 0;
for(j = 0;j <= m; j++) {
flag[j]++;
}
m = -1;
}
else{ //不存在空闲物理块
memery[max] = process[i];
flag[max] = 0;
for(j = 0;j < mSIZE; j++) {
flag[j]++;
}
max = -1;
maxflag = 0;
count++;
}
}
else{ //存在相同的进程
memery[n] = process[i];
flag[n] = 0;
if(m != -1){ //若存在空闲物理块
flag[m] = 0;
}
for(j = 0;j < mSIZE; j++) {
flag[j]++;
}
max = -1;
maxflag = 0;
n = -1;
}
for(j = 0 ;j < mSIZE; j++) {
printf("[ %d ]",memery[j]);
}
printf("\n");
}
for(j = 0 ;j < mSIZE; j++)
memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE);
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE);
}
void OPT(){
int Lasttime[mSIZE] = {0};
int i = 0, j = 0;
int m = -1, n = -1;
int max = -1,maxLasttime = 0;
int count = 0;
for(i = 0; i<pSIZE; i++) { //找第一个空闲的物理块
for(j=0; j<mSIZE; j++) {
if(memery[j] == 0) {
m = j;
break;
}
}
for(j = 0; j < mSIZE; j++) { //找与进程相同的标号
if(memery[j] == process[i]) {
n = j;
}
}
for(j = 0; j < mSIZE;j++) { //找Lasttime值最大的
if(Lasttime[j]>maxLasttime) {
maxLasttime = Lasttime[j];
max = j;
}
}
if(n == -1){ //不存在相同进程
if(m != -1){ //存在空闲物理块
memery[m] = process[i];
Lasttime[m] = 0;
for(int a=i;a<pSIZE;a++)
for(j = 0;j < mSIZE; j++){
if(memery[j]!=process[a])
Lasttime[j]++;
break;
}
m = -1;
}
else{ //不存在空闲物理块
memery[max] = process[i];
Lasttime[max] = 0;
for(int a=i;a<pSIZE;a++)
for(j = 0;j < mSIZE; j++){
if(memery[j]!=process[a])
Lasttime[j]++;
break;
}
max = -1;
maxLasttime = 0;
count++;
}
}
else{ //存在相同的进程
memery[n] = process[i];
Lasttime[n] = 0;
if(m != -1){ //若存在空闲物理块
Lasttime[m] = 0;
for(int a=i;a<pSIZE;a++)
for(j = 0;j < mSIZE; j++){
if(memery[j]!=process[a])
Lasttime[j]++;
break;
}
max = -1;
maxLasttime = 0;
}
n = -1;
}
for(j = 0 ;j < mSIZE; j++)
printf("[ %d ]",memery[j]);
printf("\n");
}
for(j = 0 ;j < mSIZE; j++)
memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE);
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE);
}
void LFU(){
int less[mSIZE] = {0};
int i = 0, j = 0;
int m = -1, n = -1;
int min = -1,minless = 32767;
int count = 0;
for(i = 0; i<pSIZE; i++) { //找第一个空闲的物理块
for(j=0; j<mSIZE; j++) {
if(memery[j] == 0) {
m = j;
break;
}
}
//找与进程相同的标号
for(j = 0; j < mSIZE; j++) {
if(memery[j] == process[i]) {
n = j;
}
}
//找less值最小的
for(j = 0; j < mSIZE;j++) {
if(less[j]<minless) {
minless = less[j];
min = j;
}
}
if(n == -1){ //不存在相同进程
if(m != -1){ //存在空闲物理块
memery[m] = process[i];
less[m] = 1;
m = -1;
}
else{ //不存在空闲物理块
memery[min] = process[i];
less[min] = 1;
min= -1;
minless = 32767;
count++;
}
}
else{ //存在相同的进程
memery[n] = process[i];
less[n]++;
min = -1;
minless = 32767;
n = -1;
}
for(j = 0 ;j < mSIZE; j++) {
printf("[ %d ]",memery[j]);
}
printf("\n");
}
for(j = 0 ;j < mSIZE; j++)
memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE);
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE);
}
void NUR(){
int nur[mSIZE] = {0};
int i = 0, j = 0;
int m = -1, n = -1;
int max = -1,maxnur = 0;
int count = 0;
for(i = 0; i<pSIZE; i++) { //找第一个空闲的物理块
for(j=0; j<mSIZE; j++) {
if(memery[j] == 0) {
m = j;
break;
}
}
//找与进程相同的标号
for(j = 0; j < mSIZE; j++) {
if(memery[j] == process[i]) {
n = j;
}
}
//找nur值最大的
for(j = 0; j < mSIZE;j++) {
if(nur[j]>maxnur) {
maxnur = nur[j];
max = j;
}
}
if(n == -1){ //不存在相同进程
if(m != -1){ //存在空闲物理块
memery[m] = process[i];
nur[m] = 0;
for(j = 0;j < m; j++) {
nur[j]++;
}
m = -1;
}
else{ //不存在空闲物理块
memery[max] = process[i];
nur[max] = 0;
for(j = 0;j < mSIZE&&j!=max;j++) {
nur[j]++;
}
max = -1;
maxnur = 0;
count++;
}
}
else{ //存在相同的进程
memery[n] = process[i];
nur[n] = 0;
if(m != -1){ //若存在空闲物理块
nur[m] = 0;
}
for(j = 0;j < mSIZE&&j!=n; j++) {
nur[j]++;
}
max = -1;
maxnur = 0;
n = -1;
}
for(j = 0 ;j < mSIZE; j++) {
printf("[ %d ]",memery[j]);
}
printf("\n");
}
for(j = 0 ;j < mSIZE; j++)
memery[j]=0;
printf("页面换算次数为:%d\n",count+mSIZE);
printf("页面命中率:%6f\n",1-(float)(count+mSIZE)/pSIZE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -