页式存储管理模拟
1. 请求调页存储管理方式的模拟
整个流程挺清晰的,不过写成代码挺长的
2. 跪求模拟页式存储管理FIFO的源代码,具体要求如下 1、 编程组织对内存管理 a) 页面大小为1K; b) 内存分配
#include"stdio.h"
#include"malloc.h"
#include"conio.h"
#define N 16
#define num 5 /*进程分配物理块数目*/
int A[N]={1,2,3,4,5,6,7,8,5,2,3,2,7,8,1,4}; /*页表映像*/
typedef struct page
{ int address; /*页面地址*/
struct page *next;
}page;
struct page *head,*run,*rear;
void jccreat() /*进程分配物理块*/
{ int i=1;
page *p,*q;
head=(page *)malloc(sizeof(page)); p=head;
for(i=1;i<=num;i++) { q=(page *)malloc(sizeof(page));
p->next=q; q->address=0; q->next=NULL; p=q; }
rear=p;}int search(int n){
page *p;
int i=0;
p=head;
while(p->next)
{
if(p->next->address==n)
{
printf("Get it at the page %d\n",i+1);
run=p;
return 1;}
p=p->next;
i++;
}
return 0;
}
void changeOPT(int n,int position)
{
int i;
int total=0;
int flag=1;
int distance[num];
int MAX;
int order=0;
page *p,*q;
p=head->next;
q=head->next;
for(i=0;i<num;i++)
distance[i]=100;
i=0;
while(p)
{
if(p->address==0)
{flag=0;
break;}
p=p->next;
i++;
}
if(!flag)
{p->address=n;
printf("Change the page %d\n",i+1);
}
else
{
while(q)
{
for(i=position;i<N;i++)
{if(q->address==A[i])
distance[total]=i-position;}
total++;
q=q->next;
}
MAX=distance[0];
for(i=0;i<num;i++)
{
if(distance[i]>MAX)
{
MAX=distance[i];
order=i;
}
}
printf("Change the page %d\n",order+1);
i=0;
while(p)
{
if(i==order)
p->address=n;
i++;
p=p->next;
}
}
}
void changeLRU(int n)
{
int i=0;
int flag=1;
page *p,*delect;
p=head->next;
while(p)
{
if(p->address==0)
{flag=0;
p->address=n;
printf("Change the page %d\n",i+1);
break;}
p=p->next;
i++;
}
if(flag)
{
delect=head->next;
head->next=delect->next;
printf("Delect from the head, and add new to the end.\n");
delect->address=n;
rear->next=delect;
rear=delect;
rear->next=NULL;
}
}
float OPT()
{
int i;
int lose=0;
float losef;
float percent;
for(i=0;i<N;i++)
{
if(search(A[i])==0)
{
lose++;
changeOPT(A[i],i);
}
}
losef=lose;
percent=1-(losef/N);
return percent;
}
float LRU()
{
int i;
int lose=0;
float losef;
float percent;
page *p;
for(i=0;i<N;i++)
{
if(search(A[i])==0)
{
lose++;
changeLRU(A[i]);
}
else
{
p=run->next;
run->next=p->next;
rear->next=p;
rear=p;
rear->next=NULL;
printf("Move it to end of queue.\n");
}
}
losef=lose;
percent=1-(losef/N);
return percent;
}
main() /*主函数部分*/
{float percent;
int choice;
printf("Select the arithmetic:\n(1)OPT\n(2)LRU\nyour choice is:");
scanf("%d",&choice);/*选择页面置换算法*/
jccreat(); /*创建进程*/
if(choice==1) /*采用OPT算法置换*/
{percent=OPT();/*计算OPT时的缺页率*/
printf("The percent of OPT is %f",percent);}
else if(choice==2)/*采用LRU算法置换*/
{percent=LRU();/*计算LRU时的缺页率*/
printf("The percent of OPT is %f",percent);}
else printf("Your choice is invalid.");
getch();
}
3. 设计一个请求页式存储管理方案,并编写模拟程序实现之。
#include "utility.h"
#include "lk_queue.h"
//定义页表结构
struct table
{
int no; //页号
int state; //状态位(1 表示在内存,0 表示不在内存)
int block_no; //块号
};
void main()
{
int loc[10]; //直接用的是十进制的逻辑地址
int i,j,e;
table page_table[64];
LinkQueue <int> bno;
//随机逻辑地址并显示出来
cout<<"十进制的逻辑地址:";
for( i=0;i<10;i++)
{
loc[i]=rand()%640000;
cout<<loc[i]<<" ";
}
cout<<endl<<endl;
//初始化页表
for( i=0;i<64;i++)
{
page_table[i].no=i;
page_table[i].state=0;
page_table[i].block_no=-1;
}
int a[2];
for( i=0;i<10;i++)
{
a[0]=loc[i]/1024; //计算出的页号
a[1]=loc[i]%1024; //计算出的页内偏移量
//找到页表中的该页
for( j=0;j<64;j++)
{
if(page_table[j].no==a[0]) break;
}
//该页在内存
if(page_table[j].state==1)
{
bno.Traverse(Write); // 输出队列里的页面
cout<<endl;
cout<<page_table[j].no<<' '<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl; // 输出页表信息
}
//该页不在内存,FIFO算法
if(page_table[j].state==0)
{
//内存有空闲
if(bno.Length()<5)
{
page_table[j].state=1;
page_table[j].block_no=i+10;
bno.InQueue(page_table[j].no);
bno.Traverse(Write);
cout<<endl;
cout<<page_table[j].no<<' '<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl;
}
//内存没有空闲
else if(bno.Length()==5)
{
bno.OutQueue(e);
page_table[e].state=0;
page_table[j].state=1;
page_table[j].block_no=page_table[e].block_no;
bno.InQueue(page_table[j].no);
bno.Traverse(Write);
cout<<endl;
cout<<page_table[j].no<<’'<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl;
}
}
}
}
4. 为什么说请求页式管理可以实现虚拟存储器
请求分页式存储管理的基本思想是:操作系统按照存储块的尺寸,把用户作业地址空间划分成页,全部存放在磁盘上。作业运行时,只先装入若干页。运行过程中遇到不在内存的页时,操作系统就把它从磁盘调入内存。这样一来,用户的作业地址空间无需顾及内存的大小。这与虚拟存储器的思想是完全吻合的。所以,请求分页式存储管理能够向用户提供虚拟存储器。
5. 操作系统:请求页式存储管理中页面置换算法的模拟设计
srand()——获取运算随机数(数据类型:double);
getpid()——获取当前进程识别码(long);
srand(10*getpid())就是产生一个10陪的随机数。该随机函数的种子参数是getpid(),少了10意义就不一样了,所以不行
s=(float)319*rand()/32767/32767/2+1,是一个算术式,rand()函数是产生随机数的一个随机函数,float是一种数据类型,为浮点数,S就是一个随机数乘以319除以32767/32767/2+1的值,32767是2的(16-1)次方,为什么要减1,因为是从0开始,0到15,2的0次方是1,一直算下去,2的(16-1)次方是32767,把(float)319*rand()/32767/32767/2+1所得的值存储在S变量里
希望采纳
6. 模拟分页式存储管理 怎么做
http://www.happycampus.com.cn/pages/2004/11/10/D153924.html
http://desktop.nju.e.cn/czxt/Courseware/Upload_Book/N18/200407121823/OSPPT/OSMemory/OS4page.ppt
看下以上网址
7. 请求调页存储管理方式的模拟,谢谢,急 啊 !
这可是hen宝贵的啊
#include <iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#define Bsize 4
typedef struct BLOCK//声明一种新类型——物理块类型
{
int pagenum;//页号
int accessed;//访问字段,其值表示多久未被访问
}BLOCK;
int pc;//程序计数器,用来记录指令的序号
int n;//缺页计数器,用来记录缺页的次数
static int temp[320];//用来存储320条随机数
BLOCK block[Bsize]; //定义一大小为4的物理块数组
//*************************************************************
void init( ); //程序初始化函数
int findExist(int curpage);//查找物理块中是否有该页面
int findSpace( );//查找是否有空闲物理块
int findReplace( );//查找应予置换的页面
void display ( );//显示
void suijishu( );//产生320条随机数,显示并存储到temp[320]
void pagestring( );//显示调用的页面队列
void OPT( );//OPT算法
void LRU( );// LRU算法
void FIFO( );//FIFO算法
//*************************************************************
void init( )
{
for(int i=0;i<Bsize;i++)
{
block[i].pagenum=-1;
block[i].accessed=0;
pc=n=0;
}
}
//-------------------------------------------------------------
int findExist(int curpage)
{
for(int i=0; i<Bsize; i++)
{
if(block[i].pagenum == curpage )
return i;//检测到内存中有该页面,返回block中的位置
}
return -1;
}
//-------------------------------------------------------------
int findSpace( )
{
for(int i=0; i<Bsize; i++)
{
if(block[i].pagenum == -1)
return i;//找到空闲的block,返回block中的位置
}
return -1;
}
//-------------------------------------------------------------
int findReplace( )
{
int pos = 0;
for(int i=0; i<Bsize; i++)
{
if(block[i].accessed >block[pos].accessed)
pos = i;//找到应予置换页面,返回BLOCK中位置
}
return pos;
}
//-------------------------------------------------------------
void display( )
{
for(int i=0; i<Bsize; i++)
{
if(block[i].pagenum != -1)
{ printf(" %02d",block[i].pagenum);}
}
cout<<endl;
}
//-------------------------------------------------------------
void suijishu( )
{ int flag=0;
cin>>pc;
cout<<"******按照要求产生的320个随机数:*******"<<endl;
for(int i=0;i<320;i++)
{
temp[i]=pc;
if(flag%2==0) pc=++pc%320;
if(flag==1) pc=rand( )% (pc-1);
if(flag==3) pc=pc+1+(rand( )%(320-(pc+1)));
flag=++flag%4;
printf(" %03d",temp[i]);
if((i+1)%10==0) cout<<endl;
}
}
//-------------------------------------------------------------
void pagestring( )
{
for(int i=0;i<320;i++)
{
printf(" %02d",temp[i]/10);
if((i+1)%10==0) cout<<endl;
}
}
//-------------------------------------------------------------
void OPT( )
{
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
{
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;
exist = findExist(curpage);
if(exist==-1)
{
space = findSpace ( );
if(space != -1)
{
block[space].pagenum = curpage;
display( );
n=n+1;
}
else
{
for(int k=0;k<Bsize;k++)
{
for(int j=i;j<320;j++)
{
if(block[k].pagenum!= temp[j]/10)
{
block[k].accessed = 1000;
}//将来不会用,设置为一个很大数
else
{
block[k].accessed = j;
break;
}
}
}
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;
}
}
}
cout<<"缺页次数:"<<n<<endl;
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl;
}
//-------------------------------------------------------------
void LRU( )
{
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
{
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;
exist = findExist(curpage);
if(exist==-1)
{
space = findSpace( );
if(space != -1)
{
block[space].pagenum = curpage;
display( );
n=n+1;
}
else
{
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;
}
}
else block[exist].accessed = -1;//恢复存在的并刚访问过的BLOCK中页面accessed为-1
for(int j=0; j<4; j++)
{block[j].accessed++;}
}
cout<<"缺页次数:"<<n<<endl;
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl;
}
//-------------------------------------------------------------
void FIFO( )
{
int exist,space,position ;
int curpage;
for(int i=0;i<320;i++)
{
if(i%100==0) getch( );
pc=temp[i];
curpage=pc/10;
exist = findExist(curpage);
if(exist==-1)
{
space = findSpace( );
if(space != -1)
{
block[space].pagenum = curpage;
display( );
n=n+1;
}
else
{
position = findReplace( );
block[position].pagenum = curpage;
display( );
n++;
block[position].accessed--;
}
}
for(int j=0; j<Bsize; j++)
block[j].accessed++;
}
cout<<"缺页次数:"<<n<<endl;
cout<<"缺页率:"<<(n/320.0)*100<<"%"<<endl;
}
//*************************************************************
void main( )
{
int select;
cout<<"请输入第一条指令号(0~320):";
suijishu( );
cout<<"*****对应的调用页面队列*******"<<endl;
pagestring( );
do
{
cout<<"****************************************"<<endl;
cout<<"------1:OPT 2:LRU 3:FIFO 4:退出-----"<<endl;
cout<<"****************************************"<<endl;
cout<<" 请选择一种页面置换算法:";
cin>>select;
cout<<"****************************************"<<endl;
init( );
switch(select)
{
case 1:cout<<"最佳置换算法OPT:"<<endl;
cout<<"*****************"<<endl;
OPT( );
break;
case 2:cout<<"最近最久未使用置换算法LRU:"<<endl;
cout<<"**************************"<<endl;
LRU( );
break;
case 3:cout<<"先进先出置换算法FIFO:"<<endl;
cout<<"*********************"<<endl;
FIFO( );
break;
default: ;
}
}while(select!=4);
}
你试试可以不,应该没问题的
要注意这是用C++编写的,你改一下就可以用了