分页式存储管理代码
‘壹’ 设计一个请求页式存储管理方案,并编写模拟程序实现之。
#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;
}
}
}
}
‘贰’ (操作系统) 编写代码对存储管理部件的工作过程进行模拟
采用分页存储器允许把一个作业存放到若干不相邻的分区中,既可免去移动信息的工作,又可尽量减少主存的碎片。分页式存储管理的基本原理如下:
1、 页框:物理地址分成大小相等的许多区,每个区称为一块;
2、址分成大小相等的区,区的大小与块的大小相等,每个称一个页面。
3、 逻辑地址形式:与此对应,分页存储器的逻辑地址由两部分组成,页号和单元号。逻辑地址格式为 页号 单元号(页内地址) 采用分页式存储管理时,逻辑地址是连续的。所以,用户在编制程序时仍只须使用顺序的地址,而不必考虑如何去分页。
4、页表和地址转换:如何保证程序正确执行呢?
采用的办法是动态重定位技术,让程序的指令执行时作地址变换,由于程序段以页为单位,所以,我们给每个页设立一个重定位寄存器,这些重定位寄存器的集合便称页表。页表是操作系统为每个用户作业建立的,用来记录程序页面和主存对应页框的对照表,页表中的每一栏指明了程序中的一个页面和分得的页框的对应关系。绝对地址=块号*块长+单元号 以上从拓扑结构角度分析了对称式与非对称式虚拟存储方案的异同,实际从虚拟化存储的实现原理来讲也有两种方式;即数据块虚拟与虚拟文件系统. 数据块虚拟存储方案着重解决数据传输过程中的冲突和延时问题.在多交换机组成的大型Fabric结构的SAN中,由于多台主机通过多个交换机端口访问存储设备,延时和数据块冲突问题非常严重.数据块虚拟存储方案利用虚拟的多端口并行技术,为多台客户机提供了极高的带宽,最大限度上减少了延时与冲突的发生,在实际应用中,数据块虚拟存储方案以对称式拓扑结构为表现形式. 虚拟文件系统存储方案着重解决大规模网络中文件共享的安全机制问题.通过对不同的站点指定不同的访问权限,保证网络文件的安全.在实际应用中,虚拟文件系统存储方案以非对称式拓扑结构为表现形式. 虚拟存储技术,实际上是虚拟存储技术的一个方面,特指以CPU时间和外存空间换取昂贵内存空间的操作系统中的资源转换技术 基本思想:程序,数据,堆栈的大小可以超过内存的大小,操作系统把程序当前使用的部分保留在内存,而把其他部分保存在磁盘上,并在需要时在内存和磁盘之间动态交换,虚拟存储器支持多道程序设计技术 目的:提高内存利用率 管理方式
A 请求式分页存储管理 在进程开始运行之前,不是装入全部页面,而是装入一个或零个页面,之后根据进程运行的需要,动态装入其他页面;当内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以便装入新的页面
B 请求式分段存储管理 为了能实现虚拟存储,段式逻辑地址空间中的程序段在运行时并不全部装入内存,而是如同请求式分页存储管理,首先调入一个或若干个程序段运行,在运行过程中调用到哪段时,就根据该段长度在内存分配一个连续的分区给它使用.若内存中没有足够大的空闲分区,则考虑进行段的紧凑或将某段或某些段淘汰出去,这种存储管理技术称为请求式分段存储管理
你好,希望采纳!
‘叁’ 在一个分页式虚拟存储管理系统中,一个程序的页面走向为在一个分页式虚拟存储管理系统中,一个程序的页面
摘要 1)缺页7次 缺页6次
‘肆’ 跪求模拟页式存储管理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();
}
‘伍’ 计算机系操作系统分页存储
105, 217, 567, 1120都可以转换
因为页大小是64字节, 代码段是11页, 即0x2c0,即八进制的1600
小于1600的,都可以访问
‘陆’ 用c语言分页式存储管理的地址转换过程实现
逻辑地址转换为物理地址
#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=0;i<n;i++)
{
printf("输入页表中第%d页项中主存页号=",i);
scanf("%d",&a[i]);
}/*输入页表中主存的页号*/
p=la/ps;d=la-p*ps;/*p为页表项的页号,d为页内位移*/
pa=a[p]*ps+d;
printf("逻辑地址为%d的物理地址为%d",la,pa);
}
‘柒’ 分页式存储管理
进程有3页, 那就是3* 64/16=12 K,
0块 1块 2块 3块 4块 5块 6块 7块
0 4K-1 4K 8K-1 8K --12k_1 12K 16K-1 16K -- 20K-1 20K 24K 28K----32K-1
逻辑地址=块号 + 块内地址,5276 ,应该是在第5块的276字节处, 20*1024+276 应该是物理地址
‘捌’ 叙述分页式存储管理(带有快表)的遇辑地址到物理地址的映射过程叙述分页式存储管理(带有快表)的遇辑地
摘要 (1)这种分配方法能够提高处理器(CPU)的利用率。