#include<stdafx.h>
#include<stdlib.h>
#include<stdio.h>
#define n 64//实验中假定主存的长度
#define m 4//实验中假定每个作业分得主存块块数
int p[m]//定义页
int head=0
struct
{
short int lnumber//页号
short int flag//表示该页是肆漏否在主存,"1"表示在主存,"0"表示不在主存
short int pnumber//该页所在主存块的块号
short int write//该页是否被修改过,"1"表示修改过,"0"表示没有修改过
short int dnumber//该页存放在磁盘上的位置,即磁盘块号
short int times//被访问的次数,用于LRU算法
}page[n]//定义页表
//各个函数的实现如下:
void computer()
{
int i
for(i=0i<兆雹灶ni++)
{
page[i].lnumber = i
page[i].flag = 0
page[i].pnumber = 10000//用10000表示为空
page[i].write = 0
page[i].dnumber = i
page[i].times = 0
}//初始化页表
for(i=0i<mi++)
{
page[i].pnumber = i
}
for(i=0i<mi++)
{
p[i] = i
page[i].flag = 1
}//初始化页
}
void showpagelist()
{
int i
printf("\n页号\t是否在主存中\t块 号\t是否被修改过\t磁盘块号\t访问次数\n")
for(i=0i<ni++)
{
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",page[i].lnumber,page[i].flag,page[i].pnumber,page[i].write,page[i].dnumber,page[i].times)
}
}
void showpage()
{
int i
for(i=0i<mi++)
{
printf("\t%d\n",p[i])
}
}
void transformation() //缺页中断处理
{
unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber
int i, fail = 0
int method,temppage=0
short int times = 10000
printf("请输入一个逻辑地址(四位十六进制数):")
scanf("%x",&logicAddress)//读入逻辑地址
logicNumber = logicAddress >>10//得到页号
printf("页号为:%ld\n",logicNumber)
innerAddress = logicAddress &0x03ff//得到页内地址
printf("页内地址为:%ld\n",innerAddress)
for(i=0i<ni++)
{
if(logicNumber==(unsigned)page[i].lnumber)
{
if(page[i].flag == 1)
{
printf("请求的页面在主族扮存中!\n")
page[i].times++
physicsNumber = page[i].pnumber//由页号得到块号
printf("请求的主存块号为:%ld\n",physicsNumber)
physicsAddress = physicsNumber <<10 |innerAddress//得到物理地址
printf("请求的物理地址为:%ld",physicsAddress)//输出物理地址
break
}
else
{
printf("请求的页面不在主存中! 将进行缺页中断处理!\n请选择算法!\n")
printf("1.先进先出\n2.最近最少用\n请选择置换算法:")
scanf("%d",&method)
if(method == 1) //采用先进先出算法
{
printf("采用先进先出算法!\n")
fail = p[head]
printf("第%d页将被替换!\n",fail)
p[head] = logicNumber
head = (head+1) % m
if(page[fail].write == 1)
printf("第%d页曾被修改过!\n",fail)
page[fail].flag = 0
page[logicNumber].flag = 1
page[logicNumber].write = 0
page[logicNumber].pnumber = page[fail].pnumber
page[fail].pnumber = 10000
page[logicNumber].times++
break
}
else if(method == 2) //采用最近最少用算法
{
printf("采用最近最少用算法!\n")
for(i=0i<ni++)
{
if(page[i].flag == 1)
{
if(page[i].times<times)
{
times = page[i].times
temppage = page[i].lnumber
}
}
}
printf("第%d页将被替换!\n",temppage)
for(i=0i<mi++)
{
if(p[i] == temppage)
{
p[i] = logicNumber
}
}
if(page[temppage].write == 1)
printf("第%d页曾被修改过!\n",temppage)
page[temppage].flag = 0
page[logicNumber].flag = 1
page[logicNumber].write = 0
page[logicNumber].pnumber = page[temppage].pnumber
page[temppage].pnumber = 10000
page[logicNumber].times++
break
}
else
{
printf("你输入有误,即将退出!")
exit(1)
}
}
}
}
}
void main()
{
char c,d,flag='y'
printf("页表正在初始化中...,3秒钟后为你显示页和页表!\n")
computer()
showpage()
showpagelist()
while(flag == 'y' || flag == 'Y')
{
transformation()
printf("是否显示页和页表?(Y/N)")
c = getchar()
c = getchar()
if(c=='Y'||c=='y')
{
showpage()
showpagelist()
}
else
{
while(c=='N'||c=='n')
{
printf("\n是否继续进行请求分页?(Y/N)")
d = getchar()
d = getchar()
if(d=='Y'||d=='y')
{
transformation()
printf("\n是否显示页和页表?(Y/N)")
c = getchar()
c = getchar()
if(c=='Y'||c=='y')
{
showpage()
showpagelist()
}
}
else if (d=='N'||d=='n')
exit(1)
else
printf("输入错误!\n")
}
}
printf("\n是否继续进行请求分页?(Y/N)")
flag = getchar()
flag = getchar()
}
}
逻辑地址转换渣胡为物理地址#include<stdio.h>
main()
{int p,d,la,pa,ps,a[100],n,i/*pa为物理地址,la为物理地址,ps为页面大小,a[100]存放页表中对应主存的页号,n为页面数*/
printf("请输入逻辑地址la=")/兄梁悔*输入逻辑地址*/
scanf("%d",&la)
printf("请输入页面大小ps=")/*输入页面大小*/
scanf("%d",&ps)
printf("请输入页面数n=")/*输入页面数*/
scanf("%d",&n)
for(i=0i<ni++)
{
printf("输入页表中第%d页项羡正中主存页号=",i)
scanf("%d",&a[i])
}/*输入页表中主存的页号*/
p=la/psd=la-p*ps/*p为页表项的页号,d为页内位移*/
pa=a[p]*ps+d
printf("逻辑地址为%d的物理地址为%d",la,pa)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)