伊顿电气官网:操作系统教程题目求救5555555555555555

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/03 03:23:51
有一个文件,格式如下:
pageserial:1 2 3 4 1 2 5 1 2 3 4 5
procpage:3

说明:pageserial表示进程访问的页面序列,procpage表示系统分配给进程的内存页,初始为空.
要求:
构造一个数据结构读入上述数据,并输出到屏幕
2.按照LRU算法,给出页面淘汰的序列,并计算缺页中断率

1 2 3 4 1 2 5 1 2 3 4 5

1 2 3 3 3 2 2 2 2 2 2 5
1 2 2 1 1 1 1 1 1 4 4
1 4 4 4 5 5 5 3 3 3
1 2 3 4 5 1 2 (淘汰的序列)
* * * * * * * * * * 10
12
缺页中断率10/12 = 0.8333

/***************************************
* pageserial:1 2 3 4 1 2 5 1 2 3 4 5
procpage:3

白菜下的蓝天 Anki 2005.11.6
****************************************/

#define LMRY 3
#define LPSL 12

int hasPoc(int src, int dec[], int len)
/***************************************************************
* 判断在系统分配给进程的内存页是否有进程访问的页面序列为src的 *
* 若有则返回其所在数组的位置,否则返回-1 *
****************************************************************/
{
int j;
for(j = 0; j < len; j ++)
if(src == dec[j])
return j;
return -1;
}

int hasNoUsage(int dec[], int len)
/***************************************************************
* 判断在系统分配给进程的内存页是否有空闲块 *
* 若有则返回其所在数组的位置,否则返回-1 *
****************************************************************/
{
int j;
for(j = 0; j < len; j ++)
if(dec[j] <= 0)
return j;
return -1;
}

int findLRU(int dec[], int len)
/***************************************************************
* 根据LRU判断在系统分配给进程的内存页号所在数组的位置 *
* *
****************************************************************/
{
int j;
int var = dec[0];
int index = 0;
for(j = 0; j < len; j ++)
if(var < dec[j])
{
var = dec[j];
index = j;
}
return index;
}

void updataCnt(int dec[], int len)
/***************************************************************
* 系统分配给进程的内存页号未被使用次数加1 *
* *
****************************************************************/
{
int j;
for(j = 0; j < len; j ++)
dec[j] += 1;
}

void prtAry(int ary[], int len)
{
int j;
for(j = 0; j < len; j ++)
printf("\t%d", ary[j]);
}

main()
{
int aryProcpage[LMRY]; /*表示系统分配给进程的内存页的数组*/
int cntAryProcpage[LMRY];/*表示系统分配给进程的内存页存在次数的数组*/
int aryPageserial[LPSL]; /*表示进程访问的页面序列的数组*/
int cnt = 0;
int i;

for(i = 0; i < LMRY; i ++)/*初始化各数组,0表示没有被使用*/
{
aryProcpage[i] = 0;
cntAryProcpage[i] = 0;
}

printf("Please input pageserial:");
for(i = 0; i < LPSL; i ++)
scanf("%d", &aryPageserial[i]);

for(i = 0; i < LPSL; i ++)
{
int index;
index = hasPoc(aryPageserial[i], aryProcpage, LMRY);
if(index >= 0)/*若有,则要修改其出现的次数为1*/
{
cntAryProcpage[index] = 1;
prtAry(aryProcpage, LMRY);
printf("\t \n");
}
else/*若没有,则有两种情况*/
{
index = hasNoUsage(cntAryProcpage, LMRY);
if(index >= 0)/*有空闲块没有使用,其实只在最前面的LMRY个*/
{
cnt ++;
aryProcpage[index] = aryPageserial[i];
updataCnt(cntAryProcpage, index);
cntAryProcpage[index] = 1;
prtAry(aryProcpage, LMRY);
printf("\t*\n");
}
else /*按LRU换块*/
{
int tmp;
cnt ++;
index = findLRU(cntAryProcpage, LMRY);
tmp = aryProcpage[index]; /*被淘汰的序列号*/
aryProcpage[index] = aryPageserial[i];
updataCnt(cntAryProcpage, LMRY);
cntAryProcpage[index] = 1;
prtAry(aryProcpage, LMRY);
printf("\t*\t%d\n", tmp);
}
}
} /*for*/

printf("\t---------%f-------\n", (float)cnt/LPSL);
}
/*************运行结果**********************************
Please input pageserial:1 2 3 4 1 2 5 1 2 3 4 5
1 0 0 *
1 2 0 *
1 2 3 *
4 2 3 * 1
4 1 3 * 2
4 1 2 * 3
5 1 2 * 4
5 1 2
5 1 2
3 1 2 * 5
3 4 2 * 1
3 4 5 * 2
---------0.833333-------
**********************************************************/

1 12 123 423 413 412 512 512 512 312 423 453
不知道是不是这样的了,有点忘了。呵呵,我只是随便作作,很可能是错的啊。

天啊 我搬个板凳来看高手解决

太深了

天文啊,偶不知道!