用c语言分页式存储管理的地址转换过程实现

用c语言分页式存储管理的地址转换过程实现,第1张

逻辑地址转换为物理地址

#include

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

评论

0

0

0

加载更多

http://hi.baidu.com/ryw12403/blog/item/a67b963e45de843a71cf6c2f.html

运行结果图,用的是TC。

VC 的话要做些修改.while((page[i++]=getche())!='\r')

#include <stdio.h>

#define N 40

int printend(){

char page[5],i

printf("\n\山裤樱nESC->exit n->nextpage l->lastpage e->endpage s->startpage jumppage >:")

i=0

while((page[i++]=getche())!='\r')

page[i]='\0'

if(isdigit(page[0]))

return atoi(page)

else

return page[0]

}

main(){

int a,i,k

for(i=1i<=Ni++){

printf("\n%2d**********************",i)

if(i%10==0){

a=printend()

k=i

switch(a){

case 'p':

case 'P':

if(i>逗丛10)

i-=20

else

i=0

break

case 'n':

case 'N':

if(i>=N)

i=N-10

break

case 's':

case 'S':

i=0

break

case 'e':

case 'E':

i=N-10

break

case 27:

exit(0)

default:

i=a*10-10

if(i>N){

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

}

}


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

原文地址: https://outofmemory.cn/yw/12345740.html

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

发表评论

登录后才能评论

评论列表(0条)

保存