-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfifo.h
79 lines (79 loc) · 2.2 KB
/
fifo.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<memory.h>
using namespace std;
struct page{
int pagenumber;
int memorynumber;
int IsInmemory;
};
typedef page PAGE;
PAGE *PageTable;
/***************************************
入口参数:
page_size:页的个数
requestsize:随机访问串的长度
memorysize:内存帧的个数
random:随机产生的访问串数组
*************************************/
void FIFO(int page_size,int requestsize,int memorysize,int *random)
{
int *memory;//模拟内存
memory = (int*)malloc(sizeof(int)*memorysize);
PageTable = (PAGE*)malloc(sizeof(PAGE)*page_size);
int i,j;
for(i=0;i<memorysize;i++)
memory[i] = -1;
for(i = 0;i<page_size;i++){
PageTable[i].IsInmemory = 0;
PageTable[i].memorynumber = -1;
PageTable[i].pagenumber = i;
}
int PageFalseTime = 0;//记录缺页的次数
int FirstIn = 0;//记录最先进入内存的页
int FullNumber = 0;//记录物理块是否已经被占满
int index = 0;//随机访问串数组的起始下标
while(FullNumber != memorysize)
{
if(PageTable[random[index]].IsInmemory == 0){
cout<<"页"<<random[index]<<" 不在内存中"<<endl;
memory[FullNumber] = random[index];//将页面装入内存中
PageTable[random[index]].IsInmemory = 1;
PageTable[random[index]].memorynumber = FullNumber;
FullNumber++;
index++;
PageFalseTime++;
}
else if(PageTable[random[index]].IsInmemory == 1){
cout<<"页"<<random[index]<<" 在内存中"<<endl;
index++;
}
}
int next_index = index;
for(index = next_index;index<requestsize;index++)
{
if(PageTable[random[index]].IsInmemory == 1){
cout<<"页"<<random[index]<<" 在内存中"<<endl;
}
else{
PageFalseTime++;
memory[FirstIn]=random[i];
for(j=0;j<requestsize;j++){
if(PageTable[j].memorynumber==FirstIn){
cout<<" 页 "<<random[index]<<" 不 在 内 存 中 ,"<<" 替 换 页"<<j<<endl;
PageTable[j].memorynumber = -1;
PageTable[j].IsInmemory = 0;
break;
}
}
PageTable[random[index]].IsInmemory = 1;
PageTable[random[index]].memorynumber = FirstIn;
FirstIn = (FirstIn + 1)%memorysize;
}
}
cout<<"缺页次数为:"<<PageFalseTime<<endl;
cout<<"缺页率为:"<<(double)PageFalseTime/requestsize*100<<"%"<<endl;
free(memory);
free(PageTable);
}