当前位置:首页 » 操作系统 » 请求分页算法

请求分页算法

发布时间: 2023-11-25 19:19:41

① 什么是虚拟存储

虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。

功能:基本分页 + “请求调页”和“页面置换”功能。

换入和换出基本单位都是长度固定的页面。请求分页技术的基本思想是:当一个进程的部分页面在内存时就可调度它运行;在运行过程中若用到的页面尚未在内存,则把它们动态换入内存。这样,就减少了对换时间和所需内存数量,允许增加程序的道数。

请求分页技术是在简单分页技术基础上发展起来的,两者根本区别是:请求分页提供虚拟存储器,而简单分页系统并未提供虚拟存储器。

(1)请求分页算法扩展阅读

虚拟存储器地址变换基本上有3种形虚拟存储器工作过程式:全联想变换、直接变换和组联想变换。替换规则用来确定替换主存中哪一部分,以便腾空部分主存,存放来自辅存要调入的那部分内容。常见的替换算法有4种:

①随机算法:用软件或硬件随机数产生器确定替换的页面。

②先进先出:先调入主存的页面先替换。

③近期最少使用算法(LRU,Least Recently Used):替换最长时间不用的页面。

④最优算法:替换最长时间以后才使用的页面。这是理想化的算法,只能作为衡量其他各种算法优劣的标准。

虚拟存储器的效率是系统性能评价的重要内容,它与主存容量、页面大小、命中率,程序局部性和替换算法等因素有关。

② 操作系统:请求分页存储管理模拟实现

#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include"windows.h"
#include"os.h"
#define n 64//实验中假定主存的长度
#define m 4//实验中假定每个作业分得主存块块数
int p[m];//定义页
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];//定义页表
//各个函数的实现如下:
computer::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 computer::showpagelist()
{
int i;
cout<<"页号"<<"\t"<<"是否在主存中"<<"\t"<<"块 号"<<"\t"<<"是否被修改过"<<"\t"<<"磁盘块号"<<"\t"<<"访问次数"<<endl;
for(i=0;i<n;i++)
{
cout<<page[i].lnumber<<"\t"<<page[i].flag<<" "<<page[i].pnumber<<"\t"<<page[i].write<<" "<<page[i].dnumber<<" \t"<<page[i].times<<endl;
}
}
void computer::showpage()
{
int i;
for(i=0;i<m;i++)
{
cout<<"\t"<<p[i];
}
cout<<endl;
}
void computer::transformation()
{
unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;
int i,head=0,fail = 0;
int method,temppage=0;
short int times = 10000;
cout<<"请输入一个逻辑地址(四位十六进制数):";
cin>>hex>>logicAddress;//读入逻辑地址
logicNumber = logicAddress >> 10;//得到页号
cout<<"页号为:"<<logicNumber<<endl;
innerAddress = logicAddress & 0x03ff;//得到页内地址
cout<<"页内地址为:"<<innerAddress<<endl;
for(i=0;i<n;i++)
{
if(logicNumber==(unsigned)page[i].lnumber)
{
if(page[i].flag == 1)
{
cout<<"请求的页面在主存中!"<<endl;
page[i].times++;
physicsNumber = page[i].pnumber;//由页号得到块号
cout<<"请求的主存块号为:"<<physicsNumber<<endl;
physicsAddress = physicsNumber << 10 |innerAddress;//得到物理地址
cout<<"请求的物理地址为:"<<physicsAddress<<endl;//输出物理地址
break;
}
else
{

cout<<"请求的页面不在主存中! 将进行缺页中断处理!"<<endl<<"请选择算法!"<<endl;
cout<<"1.先进先出"<<endl<<"2.最近最少用"<<endl<<"请选择置换算法:";
cin>>method;
if(method == 1) //采用先进先出算法
{
cout<<"采用先进先出算法!"<<endl;
fail = p[head];
cout<<"第"<<fail<<"页将被替换!"<<endl;
p[head] = logicNumber;
head = (head+1) % m;
if(page[fail].write == 1)
cout<<"第"<<fail<<"页曾被修改过!"<<endl;
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) //采用最近最少用算法
{
cout<<"采用最近最少用算法!"<<endl;
for(i=0;i<n;i++)
{
if(page[i].flag == 1)
{
if(page[i].times<times)
{
times = page[i].times;
temppage = page[i].lnumber;
}
}
}
cout<<"第"<<temppage<<"页将被替换!"<<endl;
for(i=0;i<m;i++)
{
if(p[i] == temppage)
{
p[i] = logicNumber;
}
}
if(page[temppage].write == 1)
cout<<"第"<<temppage<<"页曾被修改过!"<<endl;
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
{ cout<<"你输入有误,即将退出!";
exit(1);
}
}
}
}
}
void main()
{
char c,d;
computer os;
cout<<"页表正在初始化中...,3秒钟后为你显示页和页表!"<<endl;
Sleep(3000);
os.showpage();
os.showpagelist();
T:
os.transformation();
cout<<"是否显示页和页表?(Y/N)";
cin>>c;
switch(c)
{
case 'y':
os.showpage();
os.showpagelist();
case 'n':
cout<<"是否继续进行请求分页?(Y/N)";
cin>>d;
if (d=='Y'||d=='y')
goto T;
else if (d=='N'||d=='n')
exit(1);
else
cout<<"输入错误!"<<endl;
default:cout<<"输入错误!"<<endl;
}

}

③ 操作系统请求分页存储方式的基本原理是什么谢谢

3.请求分页系统(1)请求分页对页表的扩充
在请求分页系统中所使用的主要数据结构仍然是页表。它对页式系统中的页表机制进行了扩充但其基本作用是实现由用户地址空间到物理内存空间的映射。由于只将应用程序的一部分装入内存,还有一部分仍在磁盘上,故需在页表中增加若干项,供操作系统实现虚拟存储器功能时参考。常见的系统中,一般对页表的表项进行如下扩充:除了页号对应的物理块号,还增加了状态位、修改位、外存地址和访问字段等。
·状态位,用于指示该页是否已经调入了内存。该位一般由操作系统软件来管理,每当操作系统把一页调人物理内存中时,置位。相反,当操作系统把该页从物理内存调出时,复位。CPU对内存进行引用时,根据该位判断要访问的页是否在内存中,若不在内存之中,则产生缺页中断。
·修改位,表示该页调入内存后是否被修改过。当CPU以写的方式访问页面时,对该页表项中的修改位置位。该位也可由操作系统软件来修改,例如,当操作系统将修改过页面保存在磁盘上后,可将该位复位。
·外存地址,用于指出该页在外存上的地址,供调人该页时使用。
·访问宇段,用于记录本页在一定时间内被访问的次数,或最近已经有多长时间未被访问。提供给相应的置换算法在选择换出页面时参考。
(2)对缺页中断的支持
在请求分页系统中,CPU硬件一定要提供对缺页中断的支持,根据页表项中的状态位判断是否产生缺页中断。缺页中断是一个比较特殊的中断,这主要体现在如下两点:
·在指令的执行期间产生和处理缺页信号。通常的CPU外部中断,是在每条指令执行完毕后检查是否有中断请求到达。而缺页中断,是在一条指令的执行期间,发现要访问的指令和数据不在内存时产生和处理的。
·一条指令可以产生多个缺页中断。例如,一条双操作数的指令,每个操作数都不在内存中,这条指令执行时,将产生两个中断。CPU提供的硬件支持,还要体现在当从中断处理程序返回时,能够正确执行产生缺页中断的指令。
(3)页面调度策略
虚拟存储器系统通常定义三种策略来规定如何(或何时)进行页面调度:调入策略、置页策略和置换策略。
(4)置换算法(replacementalgorithm)决定在需要调入页面时,选择内存中哪个物理页面被置换。置换算法的出发点应该是,把未来不再使用的或短期内较少使用的页面调出。而未来的实际情况是不确定的,通常只能在局部性原理指导下依据过去的统计数据进行预测。常用的算法有以下几种:
·最佳算法(optimal,OPT)。选择“未来不再使用的”或“在离当前最远位置上出现的”页面被置换。这是一种理想情况,是实际执行中无法预知的,因而不能实现,只能用作性能评价的依据。
·最近最久未使用算法(LeastRecentlyUsed,LRU)。选择内存中最久未使用的页面被置换,这是局部性原理的合理近似,性能接近最佳算法。但由于需要记录页面使用时间的先后关系,硬件开销太大。LRU可用如下的硬件机构帮助实现:
一个特殊的栈:把被访问的页面移到栈顶,于是栈底的是最久未使用页面。每个页面设立移位寄存器:被访问时左边最高位置1,定期右移并且最高位补0,于是寄存器数值最小的是最久未使用页面。
·先进先出算法(FIFO)。选择装入最早的页面置换。可以通过链表来表示各页的装入时间先后。FIFO的性能较差,因为较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出,并且有Belady现象。所谓Belady现象是指:采用FIFO算法时,如果对—个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。Belady现象可形式化地描述为:一个进程户要访问M个页,OS分配舻个内存页面给进程P;对一个访问序列S,发生缺页次数为PE(占,N)。当N增大时,PE(S,N)时而增大时而减小。Belady现象的原因是FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,即被置换的页面并不是进程不会访问的。
·时钟(clock)算法。也称最近未使用算法(NotRecentlyUsed,NRU),它是LRU和FIFO的折中。每页有一个使用标志位(usebit),若该页被访问则置userbit=l,这是由CPU的硬件自动完成的。置换时采用一个指针,从当前指针位置开始按地址先后检查各页,寻找usebit=0的面作为被置换页。指针经过的userbit=l的页都修改userbit=O,这个修改的过程是操作系统完成的,最后指针停留在被置换页的下一个页。
·最不常用算法(LeastFrequentlyUsed,LFU)。选择到当前时间为止被访问次数最少的页面被置换。每页设置访问计数器,每当页面被访问时,该页面的访问计数器加1。发生缺页中断时,淘汰计数值最小的页面,并将所有计数清零。
·页面缓冲算法(pagebuffering)。它是对FIFO算法的发展,通过建立置换页面的缓冲,这样就有机会找回刚被置换的页面,从而减少系统I/0的开销。页面缓冲算法用FIFO算法选择被置换页,把被置换的页面放人两个链表之一。即是如果页面未被修改,就将其归人到空闲页面链表的末尾,否则将其归人到已修改页面链表。空闲页面和已修改页面,仍停留在内存中一段时间,如果这些页面被再次访问,只需较小开销,被访问的页面就可以返还作为进程的内存页。需要调入新的物理页面时,将新页面内容读人到空闲页面链表的第一项所指的页面,然后将第一项删除。当已修改页面达到一定数目后,再将它们一起调出到外存,然后将它们归人空闲页面链表。这样能大大减少I/O操作的次数。

④ 在请求分页系统中,常采用哪几种页面置换算法

理想页面置换算法、先进先出页面置换算法、最近最少使用页面置换算法。

⑤ 操作系统 实现请求分页系统中页面置换算法

用链表实现,当页面命中时就把页面提到列表最前面,未命中时把页面插入到列表最前面并移除链表最后一个节点。
#include"stdlib.h"
#include"stdio.h"
#defineSEC_NUM4//cachesize
#definePAGE_NUM12//pagenumber

typedefstructNode{
charpage;
structNode*next;
}Node;
typedefstructNode*linkList;

//showcurrentstatusofcache
voidshow(Node*cache){
Node*tmp=cache;
inti;
printf("Cachestatus:");
for(i=0;i<SEC_NUM;i++){
printf("%c",tmp->page);
tmp=tmp->next;
}
printf(" ");
}

//
Node*isIncluded(Node*head,charpage){
Node*tmp=head,*flag=NULL;
inti;
for(i=0;i<SEC_NUM;i++){
if(tmp->next->page==page)
flag=tmp;
tmp=tmp->next;
}
returnflag;
}

intmain()
{
inti=0,index=-1;
charpages[]={'4','3','2','1','4','3','5','4','3','2','1','5'};
Node*head,*cache,*tmp,*tmp2;
intmiss_num=0;
floatmiss_ratio=0;
//initializethelist
if((head=(linkList)malloc(sizeof(Node)))==NULL){
printf("Cannotallocatememory.");
return1;
}
head->page='0';
head->next=NULL;
cache=head;

//assignvaluestocache
for(i=0;i<SEC_NUM;i++){
if((tmp=((linkList)malloc(sizeof(Node))))==NULL){
printf("Cannotallocatememory.");
return1;
}
cache->next=tmp;
tmp->page='0';
tmp->next=NULL;
cache=tmp;
}
show(head->next);
for(i=0;i<PAGE_NUM;i++){
//thepageisalreadyincache
//movethepagetothefirstposition(rightafterhead)
if((tmp=isIncluded(head,pages[i]))!=NULL){
tmp2=head->next;
head->next=tmp->next;
tmp->next=tmp->next->next;
head->next->next=tmp2;
}
//thepageisnotincache
//,andremovethelastnode
else{
miss_num++;
tmp2=head->next;
if((head->next=(linkList)malloc(sizeof(Node)))==NULL){
printf("Cannotallocatememory.");
return1;
}
head->next->page=pages[i];
head->next->next=tmp2;
head->next->next->next->next->next=NULL;//assignNULLtothe*nextofthefourthnod(removethelastnode)
}
show(head->next);
}
miss_ratio=(float)miss_num/PAGE_NUM;
printf("Numberofmissesis%d,andmissratiois%f ",miss_num,miss_ratio);
return0;
}

⑥ 在请求分页存储管理中,若采用FIFO页面淘汰算法,则当可供分配的页桢树增加时,缺页中断次数怎样麻

理论上是减少的,但如果是FIFO算法

在分页式虚拟存储器管理中,发生缺页时的置换算法采用FIFO(先进先出)算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。称为belady现象。
答案是可能增加也可能减少

热点内容
sql127001 发布:2025-01-21 18:31:50 浏览:112
服务器ip是什么格式 发布:2025-01-21 18:13:13 浏览:706
oa和邮箱的初始密码在哪里改 发布:2025-01-21 18:08:46 浏览:52
如何去除pdf的加密 发布:2025-01-21 18:08:46 浏览:565
云端的服务器怎么设置ip 发布:2025-01-21 17:48:52 浏览:186
会议脚本 发布:2025-01-21 17:41:29 浏览:23
android的toast 发布:2025-01-21 17:41:28 浏览:9
linux默认安装的mysql 发布:2025-01-21 17:40:08 浏览:912
java输出数据库 发布:2025-01-21 17:35:38 浏览:963
帧缓存的精度 发布:2025-01-21 17:35:02 浏览:657