c语言分页显示?

c语言分页显示?,第1张

hi./ryw12403/blog/item/a67b963e45de843a71cf6c2f运行结果图,用的是TC。VC 的话要做些修改.while((page[i++]=getche())!='\r')include stdio.hdefine N 40int printend(){char page[5],iprintf(\n\nESC-exit n-nextpage l-lastpage e-endpage s-startpage jumppage :) i=0while((page[i++]=getche())!='\r')page[i]='\0'if(isdigit(page[0])) return atoi(page)else return page[0]}main(){int a,i,kfor(i=1i=Ni++){printf(\n%2d**********************,i)if(i%10==0){ a=printend() k=i switch(a){case 'p':case 'P'铅没槐:if(i10) i-=20 else i=0 break case 'n': case 'N': if(i=N) i=N-10 break case 's': case 'S'槐友: i=0break case 'e'察伏: case 'E': i=N-10 breakcase 27: exit(0) default:i=a*10-10 if(iN){printf(\nError ,max page is %d.,N/10) printf(Press anykey to continue.) getch() i=N-10 }break }clrscr() }} getchar() }

这个程序我做过,现在给你!!写了很久的!!

#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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12347082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存