采用FIFO页面置换算法,当页面的顺序为 0 1 2 3 0 1 4 0 1 2 3 4 时,m=3和m=4时,缺页中断的次数各为多少?
典型的Belady
一个9次,一个10次
当m值为3时,缺页中断的次数为4;当m值为4时,缺页中断的次数为5。
解决方案:
FIFO页面置换算法就是按照被调入内存的页面的先后次序来调置物理块,将最早进入内存的页面先置换出去,由新调入的页面占用这个物理块。
首先需要先定义结构体MemSchedule,用于存储内存访问序列和内存块大小等信息:
typedef struct {
int seq; // 内存块号
int priority; // 优先级
}MemBlock;
typedef struct {
int *VisitSeq; // 内存访问序列
int length; // 序列长度
MemBlock *WorkSpace; // 内存块大小
int work_len; // 内存块数
int e; // 内存块大小
int change; // 是否发生了换页
}MemSchedule;
使用FIFO算法来统计缺页中断的次数,可以定义Fifo()函数,具体实现如下:
int Fifo(MemSchedule s1)
{
clock_t start, finish;
start = clock();
int miss = 0;
printf("***************先入先出算法*****************\n");
printf("seq\t");
for (int i = 0; i<s1.e; i++)
{
printf("%d\t", i + 1);
}
printf("\n");
for (int i = 0; i<s1.length; i++)
{
int pointer = s1.VisitSeq[i];
printf("%d:\t", pointer);
if (s1.work_len<s1.e)
{
int flag = 0;
for (int m = 0; m<s1.work_len; m++)
{
s1.WorkSpace[m].priority--;
if (s1.WorkSpace[m].seq == pointer)
{
flag = 1;
s1.WorkSpace[m].priority = s1.e;
}
}
if (flag == 1)
{
s1.change = -1;
}
if (flag == 0)
{
s1.WorkSpace[s1.work_len].seq = pointer;
s1.WorkSpace[s1.work_len].priority = s1.e;
s1.change = s1.work_len;
s1.work_len++;
}
for (int k = 0; k<s1.work_len; k++)
{
if (k == s1.change)
{
printf("%d@\t", s1.WorkSpace[k].seq);
miss++;
}
else
printf("%d\t", s1.WorkSpace[k].seq);
}
for (int j = 0; j<s1.e - s1.work_len; j++)
{
printf("*\t");
}
}
else
{
int flag = 0;
for (int m = 0; m<s1.work_len; m++)
{
s1.WorkSpace[m].priority--;
if (s1.WorkSpace[m].seq == pointer)
{
flag = 1;
s1.WorkSpace[m].priority = s1.e;
}
}
if (flag == 1)
{
s1.change = -1;
}
if (flag == 0)
{
int min_pri = 0xffffff;
for (int m = 0; m<s1.work_len; m++)
{
int n = s1.WorkSpace[m].priority;
if (n < min_pri)
{
s1.change = m;
min_pri = n;
}
}
s1.WorkSpace[s1.change].seq = pointer;
s1.WorkSpace[s1.change].priority = s1.e;
}
for (int m = 0; m<s1.e; m++)
{
if (m == s1.change)
{
printf("%d@\t", s1.WorkSpace[m].seq);
miss++;
}
else
printf("%d\t", s1.WorkSpace[m].seq);
}
}
printf("\n");
}
finish = clock();
printf("******************算法评估**************\n");
printf("缺页率:\t%.2f %%\n", (miss*1.0) / s1.length * 100);
printf("时间开销:\t%.2f ms\n", (double)(finish - start));
free(s1.WorkSpace);
free(s1.VisitSeq);
return 0;
}
最后调用Fifo()函数计算缺页中断的次数即可:
int VisitSeq[] = { 0, 1, 2, 3, 0, 1, 4, 0, 1, 2, 3, 4 };
int size = sizeof(VisitSeq) / sizeof(VisitSeq[0]);
MemBlock *WorkSpace;
WorkSpace = (MemBlock*)malloc(m * sizeof(MemBlock));
for (int i = 0; i < m; i++) {
WorkSpace[i].seq = -1;
WorkSpace[i].priority = 0;
}
MemSchedule s1 = { VisitSeq, size, WorkSpace, 0, m, -1 };
Fifo(s1);
完整代码如下: