C语言怎么实现模拟请求段式存储管理-NRU?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言怎么实现模拟请求段式存储管理-NRU?相关的知识,希望对你有一定的参考价值。

参考技术A #include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define N 4
#define size 320

typedef struct Page
int page_num;
int flag_A; //访问位
int flag_M; //修改位
int read_or_write; //0表示不被修改,1表示被修改
PAGE;

typedef struct Block
int block_num; //块号
PAGE page; //所装页的信息
struct Block *next;
BLOCK,*BLOCKLIST;

typedef struct instruct //指令数据结构
int address; //指令地址
PAGE page; //对应页的信息
INSTRUCTION,*INSTRUCTIONLIST;

INSTRUCTION instructions[size];//定义320个指令
BLOCKLIST block_head; //块的头指针
int diseffect=0; //缺页次数
int blockSize=0;

void Init_Instructions()

int i,k;
for(i=0;i<320;i++)
instructions[i].address=rand()%320;
for(k=0;k<320;k++)
instructions[k].page.page_num=(int)instructions[k].address/10;
instructions[k].page.flag_A=0;
instructions[k].page.read_or_write=rand()%2;
if(instructions[k].page.read_or_write==0)
instructions[k].page.flag_M=0;
else
instructions[k].page.flag_M=1;



BLOCKLIST Init_block()

BLOCKLIST head=(BLOCKLIST)malloc(sizeof(BLOCK)) ;
BLOCKLIST p;
int i;
for(i=1;i<=N;i++)
if(i==1)
p=head;
else
p->next=(BLOCKLIST)malloc(sizeof(BLOCK));
p=p->next;

p->block_num=i;
p->page.page_num=-1;
p->page.flag_A=0;
p->page.flag_M=0;

p->next=head;
return head;


void display(INSTRUCTION instructions)

BLOCKLIST p=block_head;
printf("The new page: (page_num==%d), (flag_M==%d), (address==%d)\n",
instructions.page.page_num,instructions.page.flag_M,instructions.address);
printf("block_num,page_num,flag_A,flag_M\n");
do
printf(" %2d %10d%9d%8d\n",p->block_num,p->page.page_num,p->page.flag_A,p->page.flag_M);
p=p->next;
while(p!=block_head);


void show_physical_address(BLOCKLIST p,INSTRUCTION instructions)

int address;
printf("physical address:");
address=p->block_num*1024+instructions.address%10;//页面大小为1k
printf("%d\n\n",address);


//查找四个块中是否有此页面
int Find_page_in_block(INSTRUCTION instructions,BLOCKLIST p)

p=block_head;
do
if(p->page.page_num==instructions.page.page_num)
p->page.flag_A=1;
if(p->page.flag_M==0)
p->page.flag_M=instructions.page.flag_M;
return 1;

p=p->next;
while(p!=block_head);
return 0;


//先将四个块中装满
void loadpage(PAGE page)

BLOCKLIST p;
p=block_head;
while(p->page.page_num!=-1)
p=p->next;
p->page.page_num=page.page_num;
p->page.flag_A=1;
p->page.flag_M=page.flag_M;
blockSize++;


//第一次循环扫描 A=0 M=0
int cscanf1(BLOCKLIST p)

p=block_head;
do
if(p->page.flag_A==0 && p->page.flag_M==0)
return 1;
p=p->next;
while(p!=block_head);
return 0;


//第二次循环扫描 A=0 M=1
int cscanf2(BLOCKLIST p)

p=block_head;
do //把扫面过后的A=1,M=0 或A=1,M=1中的A置0
if(p->page.flag_A==1 && (p->page.flag_M==0 || p->page.flag_M==1))
p->page.flag_A=0;
p=p->next;
continue;

if(p->page.flag_A==0 && p->page.flag_M==1)
return 1;
p=p->next;
while(p!=block_head);
return 0;

//第三次扫描将所有的A置为0
int cscanf3(BLOCKLIST p)

p=block_head;
do
p->page.flag_A=0;
p=p->next;
while(p!=block_head);
return 1;

//用于换进页面
void assignment(BLOCKLIST p,INSTRUCTION instructions)

p->page.page_num=instructions.page.page_num;
p->page.flag_A=1;
p->page.flag_M=instructions.page.flag_M;

//NRU页面替换算法
void replace_page(INSTRUCTION instructions,BLOCKLIST p)

if(cscanf1(p))
assignment(p,instructions);

else if(cscanf2(p))
assignment(p,instructions);

else if(cscanf3(p))
if(cscanf1(p))
assignment(p,instructions);
else
cscanf2(p);
assignment(p,instructions);




void main()

int i;
BLOCKLIST p=NULL;
Init_Instructions();
block_head=Init_block();
for(i=0;i<size;i++)
if(Find_page_in_block(instructions[i],p))
display(instructions[i]);
show_physical_address(p,instructions[i]);
getchar();
continue;

else if(blockSize<N)
diseffect++;
loadpage(instructions[i].page);

else
diseffect++;
replace_page(instructions[i],p);

display(instructions[i]);

if(diseffect>4)

show_physical_address(p,instructions[i]);
printf("##############################");

getchar();
// printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");

printf("NRU %d\n",diseffect/size);
getchar();
getchar();
getchar();

请求分页管理模拟实现的C语言源代码

本大侠虽然对游戏方面知道的不少 但是对操作系统和C语言的了解却不多 由于课程设计需要 求高手帮我编写下请求分页管理模拟实现C语言的源代码 最好能是自己编写并在VISUAL C++上运行没有问题的源代码 包括1/3左右重要地方的注释 不胜感激
当然是操作系统的课设 请仔细看问题

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

#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=0;i<n;i++)

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=0;i<m;i++)

page[i].pnumber = i;


for(i=0;i<m;i++)

p[i] = i;
page[i].flag = 1;
//初始化页

void showpagelist()

int i;
printf("\n页号\t是否在主存中\t块 号\t是否被修改过\t磁盘块号\t访问次数\n");
for(i=0;i<n;i++)

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=0;i<m;i++)

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=0;i<n;i++)

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=0;i<n;i++)

if(page[i].flag == 1)

if(page[i].times<times)

times = page[i].times;
temppage = page[i].lnumber;



printf("第%d页将被替换!\n",temppage);
for(i=0;i<m;i++)

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


参考技术A 余数为页内偏移量。
然后根据段号和段内页号获得物理块号。把物理块号乘以页的大小(2的12次)+页内偏移量。即物理地址。

资料:http://cs.sjzri.edu.cn/2005os/lesson4.2-3.htm
参考技术B 去这里面下:
http://download.csdn.net/source/378303

模拟代码
参考技术C 去这里面下:
http://download.csdn.net/source/378303

模拟代码
参考技术D 哪门课程的课程设计呢?操作系统?

以上是关于C语言怎么实现模拟请求段式存储管理-NRU?的主要内容,如果未能解决你的问题,请参考以下文章

操作系统——请求调页存储管理方式的各种模拟

《Linux源码情景分析》--2.2地址映射的全过程

请求分页管理模拟实现的C语言源代码

操作系统课程设计

操作系统——内存基本分段式存储管理

Linux下C程序的存储空间布局