#include <stdio.h>
void initializeList(int list[],int number){
for (int i = 0; i < number; i ++) {
list[i] = -1;
}
}
void showList(int list[], int number){
for (int i = 0; i < number; i ++) {
printf("%2d",list[i]);
}
printf("\n");
}
void showMemoryList(int list[],int phyBlockNum){
for (int i = 0; i < phyBlockNum; i ++) {
if (list[i] == -1) {
break;
}
printf(" |%d|",list[i]);
}
printf("\n");
}
void informationCount(int missingCount,int replaceCount,int pageNum){
printf("缺页次数:%d 缺页率:%d/%d\n",missingCount,missingCount,pageNum);
double result = (double)(pageNum - missingCount)/(double)pageNum;
printf("置换次数:%d 命中率:%.2f\n",replaceCount,result);
}
int getNextPosition(int currentPage,int currentPosition,int strList[],int pageNum){
for (int i = currentPosition+1; i < pageNum; i ++) {
if (strList[i] == currentPage) {
return i;
}
}
return 100;
}
void replacePageByFIFO(int memoryList[],int phyNum,int strList[],int pageNum){
int replaceCount = 0;
int missingCount = 0;
int pointer = 0;
int isVisited = 0;
for (int i = 0; i < pageNum; i ++) {
isVisited = 0;
for (int j = 0; j < phyNum; j ++) {
if (memoryList[j] == strList[i]) {
isVisited = 1;
printf("%d\n",strList[i]);
break;
}
if (memoryList[j] == -1) {
memoryList[j] = strList[i];
isVisited = 1;
missingCount ++;
printf("%d\n",strList[i]);
showMemoryList(memoryList, phyNum);
break;
}
}
if (!isVisited) {
memoryList[pointer] = strList[i];
pointer ++;
if (pointer > phyNum-1) {
pointer = 0;
}
missingCount ++;
replaceCount ++;
printf("%d\n",strList[i]);
showMemoryList(memoryList, phyNum);
}
}
informationCount(missingCount, replaceCount, pageNum);
}
void replacePageByLRU(int memoryList[],int phyNum,int strList[],int pageNum){
int replaceCount = 0;
int missingCount = 0;
int timeRecord[phyNum];
initializeList(timeRecord, phyNum);
int isVisited = 0;
int pageCount = 0;
for (int i = 0; i < pageNum; i ++) {
isVisited = 0;
for (int p = 0; p < pageCount; p ++) {
if (memoryList[p] != -1) {
timeRecord[p] ++;
}
}
for (int j = 0; j < phyNum; j ++) {
if (memoryList[j] == strList[i]) {
isVisited = 1;
timeRecord[j] = -1;
printf("%d\n",strList[i]);
break;
}
if (memoryList[j] == -1) {
memoryList[j] = strList[i];
pageCount ++;
isVisited = 1;
timeRecord[j] ++;
missingCount ++;
printf("%d\n",strList[i]);
showMemoryList(memoryList, phyNum);
break;
}
}
if (!isVisited) {
int max = 0;
for (int k = 0; k < phyNum; k ++) {
if (timeRecord[max] < timeRecord[k]) {
max = k;
}
}
memoryList[max] = strList[i];
timeRecord[max] = -1;
missingCount ++;
replaceCount ++;
printf("%d\n",strList[i]);
showMemoryList(memoryList, phyNum);
}
}
informationCount(missingCount, replaceCount, pageNum);
}
int main(int argc, const char * argv[]) {
int phyBlockNum;
printf("请输入物理块数量:\n");
scanf("%d",&phyBlockNum);
int memoryList[phyBlockNum];
initializeList(memoryList, phyBlockNum);
int pageNum;
printf("请输入要访问的页面总数:\n");
scanf("%d",&pageNum);
int pageNumStrList[pageNum];
srand(time(null));
for (int i = 0; i < pageNum; i ++) {
pageNumStrList[i]=rand()%10;
}
showList(pageNumStrList, pageNum);
int chose;
while (1) {
printf("请选择所需的置换算法:\n");
printf("1.FIFO 2.LRU 3.退出\n");
scanf("%d",&chose);
switch (chose) {
case 1:
showList(pageNumStrList, pageNum);
replacePageByFIFO(memoryList, phyBlockNum, pageNumStrList, pageNum);
initializeList(memoryList , phyBlockNum);
break;
case 2:
showList(pageNumStrList, pageNum);
replacePageByLRU(memoryList, phyBlockNum, pageNumStrList, pageNum);
initializeList(memoryList, phyBlockNum);
break;
default:
return 0;
break;
}
}
return 0;
}