请求分页存储管理(虚拟存储)

合集下载

存储管理

存储管理

内存管理练习试卷共有7大题,100小题,总计158分一、是非题(共23小题,共计23分)是非题得分:判断正确得计分,判断错误不得分。

1、(1分)请求分页存储管理中,为进程分配固定大小的内存的方式可以和调页时页面的全局置换方式结合使用。

2、(1分)虚拟存储器不需要在外存中设置一个对换区。

3、(1分)工作集指的是在一小段时间内,进程所访问的不同页面的集合。

4、(1分)在虚拟存储管理中,一般而言,在运行时,进程程序只有一部分被装入进内存。

5、(1分)段页式存储管理中,每个进程有一张段表和一张页表。

6、(1分)分段式存储管理中,段表中的内容是内存存储块的块号。

7、(1分)分段式存储管理中,如果用了快表,可以不要段表。

8、(1分)分页存储中,快表中存放的是页表的部分内容。

9、(1分)分页管理中,如果使用快表,快表的命中率一般达不到100%。

10、(1分)分页管理中,如果使用快表,快表必须和页表一样大小。

11、(1分)页表中的项数可以和进程程序分配到的页面数不一致12、(1分)页表或者段表是作为进程程序的一部分在内存中存放的。

13、(1分)分段存储管理中,每个进程有一张段表。

14、(1分)分页存储管理中,每个进程有一张页表。

15、(1分)内存管理中,动态地址重定位的一个好处是便于离散内存分配。

16、(1分)引入虚拟存储器的目的是为了在逻辑上扩充内存。

17、(1分)在分页存储管理中,使用联想寄存器或快表不改变访问页表的次数。

18、(1分)虚拟存储器是由操作系统提供的一个假想的特大存储器,它并不是实际的内存,其大小可比内存空间大得多。

19、(1分)段页式存储管理汲取了页式管理和段式管理的长处,其实现原理结合了页式和段式管理的基本思想,即用分段方法来分配和管理用户地址空间,用分页方法来管理物理存储空间。

20、(1分)在分页存储管理中,页表用来将物理块号转换成逻辑页号。

21、(1分)引入虚拟存储器的目的是为了在物理上扩充内存。

16存储管理5请求页式管理请求段式管理2

16存储管理5请求页式管理请求段式管理2

7
0
采用最佳置换算法,只发生了6次页面 置换,发生了9次缺页中断。缺页率=9/21
17
2、先进先出页面置换算法(FIFO) 这是最早出现的置换算法,这种算 法总是淘汰最先进入内存的页面,选 择在内存中驻留时间最久的页面予以淘 汰。
18
采用FIFO算法进行页面置换时的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 1 7 0 1 7 7 0 7 2× 2 2 4× 4 4 0× 0 0 7× 7 7 0 0 3× 3 3 2× 2 2 1× 1 1 0× 0 1 1 1 0× 0 0 3× 3 3 2× 2 2 1× 3 4 5 6 7 8 9 10 11-13 14 15-18 19 20 21
次数减少;不同的计算机系统,有不同页面大小;
11
(3)程序的编制方法
例:程序要把128×128的数组初值置“0”,数组 中每一个元素为一个字,假定页面大小为128个字, 数组中的每一行元素存放一页,能供该程序使用 的主存块只有1块。初始时第一页在内存; 程序编制方法1: 程序编制方法2: For j:=1 to 128 For i:=1 to 128 For i:=1 to 128 For j:=1 to 128 A[i][j]:=0; A[i][j]:=0; 按列:缺页中断次数: 按行:缺页中断次数 128-1 128×128-1
21
D A D A C D B C + +
B B A D +
E E B A +
A B C D E E E C D D B B E C C A A B E E + +

《计算机操作系统》虚拟存储管理

《计算机操作系统》虚拟存储管理
♦ 虚拟扩充。虚拟性是指能够从逻辑上扩充内存容量,使用户所感到的内存容 量远大于实际内存容量。这是虚拟存储器所表现出来的最重要的特征,也是 实现虚拟存储器的最重要的目标。
7.2 请求分页存储管理
7.2.1 工作原理 7.2.2 驻留集管理 7.2.3 调页策略 7.2.4 页面置换算法
7.2.1工作原理
♦ 若内存中没有可用的物理块,则还需根据页面置 换算法淘汰一些页,若淘汰的页曾做过改动,还 需将此页重写回外存,最后将缺页调入内存指定 的物理块。
开始
根据页表记录的外 存始址找到缺页
内存有可用 Y 物理块吗?
N 由页面置换算法选
择一页换出 Y
N 该页被改动 过吗? Y
将该页写回外存
启动磁盘I/O,从外 存读入缺页
►显然,一方面,内存中存在一些不用或暂时不用的程序占据了大量的内存 空间;另一方面,一些需要运行的程序因没有足够的内存空间而无法装入 内存运行。
►人们不禁考虑,“一次性”和“驻留性”在程序运行时是否是必要的?
7.1.1 引入背景
2.局部性原理
►程序在执行时,在一段时间内,CPU总是集中地访问程序中的某一个部分 而不是随机地对程序所有部分具有平均访问概率,这种现象称为局部性原 理。局部性表现在下述两个方面:
7.2.3 调页策略
►调页策略用于确定何时将进程所需的页调入内存。常用的调页策略有: ♦ 预调页策略 ● 系统预测进程接下来要访问的页,将一个或多个页提前调入内存。 ● 常用的预测原理是局部性原理,即每次调页时,将相邻的若干个页 一并调入内存。 ♦ 请求调页策略 ● 发生缺页时,再将其调入内存的方法。 ● 实现简单,增加磁盘I/O开销。
♦ 状态位:用于表示该页是否已调入内存。若没有调入内存,则产生一个 缺页中断。

20wh

20wh
4.5 虚拟存储管理
4.5.1 虚拟存储管理的概念 4.5.2 请求分页虚拟存储管理 4.5.3 请求分段虚拟存储管理 4.5.4 请求段页式虚拟存储管理
4.5.1 虚拟存储管理的概念
• 为什么要引入虚拟存储器? • 实现虚拟存储器的基本思路。 • 虚拟存储器的定义: 在具有层次结构存储器的计算机系 统中,采用自动实现部分装入和部 分对换功能,为用户提供一个比物 理主存容量大得多的,可寻址的一 种“主存储器”。
缺页率σ =15/20=75%
3)最近最少用页面替换算法
• 算法淘汰的页面是在最近一段 时间里较久未被访问的那页。 • 根据程序局部性原理,那些刚 被使用过的页面,可能马上还 要被使用,而在较长时间里未 被使用的页面,可能不会马上 使用到。
LRU算法实现:页面淘汰队列(1)
• 队列中存放当前在主存中的页号, 每当访问一页时就调整一次,使 队列尾总指向最近访问的页,队 列头就是最近最少用的页。 • 发生缺页中断时总淘汰队列头所 指示的页;执行一次页面访问后, 需要从队列中把该页调整到队列 尾。
辅存
主存(系统区 )运行进程页 表
ቤተ መጻሕፍቲ ባይዱ
访 问
⑨装入
、改表 ⑧调页 缺页中断处理
请求分页虚存地址转换过程(2)
逻辑地址 查快表 在辅存 查页表 发缺页中断 登记入快表 在主存 形成绝对地址 继续执行指令 硬件 无登记 有登记
保护现场 无 主存有空闲块 有 装入所需页面 调整页表和 主存分配表 恢复现场 重新执行 被中断指令
操作系统
选择调出页面 未修改 该页是否修改 已修改 把该页写回 辅存相应位置
请求页式虚拟存储系统优缺点
• 优点:作业的程序和数据可按页分散
存放在主存中,减少移动开销,有效 解决了碎片问题;既有利于改进主存利 用率,又有利于多道程序运行。 •缺点:要有硬件支持,要进行缺页中 断处理,机器成本增加,系统开销加 大。

虚拟存储器的基本概念

虚拟存储器的基本概念
11
虚拟存储器是为扩大主存而采用 的一种设计技巧,它的容量与主存大 小无直接关系,而受限于计算机的地 址结构及可用的辅助存储器的容量。
12
4. 虚拟存储器的容量
• 1一个虚拟存储器的最大容量是由计算机 的 地 址 结 构 确 定 的 。 如 : 若 CPU 的 有 效 地址长度为32位,则程序可以寻址范围 是0~(2^32)-1 ,即虚存容量为 4GB。
9
第三,很少出现连续的过程调用,相反, 程序中过程调用的深度限制在小范围 内,一段时间内,指令引用被局限在 很少几个过程中。
第四,对于连续访问数组之类的数据结 构,往往是对存储区域中相邻位置的 数据的操作。
第五,程序中有些部分是彼此互斥的, 不是每次运行时都用到的,如出错处 理程序。
10
3.虚拟存储器的定义: 在具有层次结构存储器的计算机系统中, 具有请求调入功能和置换功能,能从逻辑 上对内存容量进行扩充的存储器系统, 为用户提供一个比物理主存容量大得多 的,可寻址的一种“主存储器”。
7
5. 局部性原理
• 程序局部性原理 在一段时间内一个程序的执行往往呈现出 高度的局部性,表现在时间与空间两方面
• 时间局部性: 一条指令被执行了,则在不久的将来它可 能再被执行
• 空间局部性: 若某一存储单元被使用,则在一定时间
内,与该存储单元相邻的单元可能被使用
8
第一,程序中只有少量分支和过程调用, 大都是顺序执行的指令。 第二,程序包含若干循环,是由相对 较少的指令组成,在循环过程中,计 算被限制在程序中很小的相邻部分中。
• 2虚拟存储器的容量与主存的实际大小没 有直接的关系,而是由主存与辅存的容量 之和所确定。
13
虚拟存储管理主要采用以下技 术实现:

操作系统习题及答案

操作系统习题及答案

CH4 应用题参考答案1 在一个请求分页虚拟存储管理系统中,一个程序运行的页面走向是:1 、2 、3 、4 、2 、1 、5 、6 、2 、1 、2 、3 、7 、6 、3 、2 、1 、2 、3 、6 。

分别用FIFO 、OPT 和LRU 算法,对分配给程序3 个页框、4 个页框、5 个页框和6 个页框的情况下,分别求出缺页中断次数和缺页中断率。

答:只要把表中缺页中断次数除以20,便得到缺页中断率。

2 在一个请求分页虚拟存储管理系统中,一个作业共有5 页,执行时其访问页面次序为:( 1 ) 1 、4 、3 、1 、2 、5 、1 、4 、2 、1 、4 、5( 2 ) 3 、2 、1 、4 、4 、5 、5 、3 、4、3、2、1、5若分配给该作业三个页框,分别采用FIFO和LRU 面替换算法,求出各自的缺页中断次数和缺页中断率。

答:( 1 )采用FIFO 为9 次,9 / 12 = 75 %。

采用LRU 为8 次,8 / 12 = 67 %。

( 2 )采用FIFO 和LRU 均为9 次,9 / 13 = 69 %。

3 一个页式存储管理系统使用FIFO 、OPT 和LRU 页面替换算法,如果一个作业的页面走向为:( l ) 2 、3 、2 、l 、5 、2 、4 、5 、3 、2 、5 、2 。

( 2 ) 4 、3 、2 、l 、4 、3 、5 、4 、3 、2 、l 、5 。

( 3 ) 1 、2 、3 、4 、1 、2 、5 、l 、2 、3 、4 、5 。

当分配给该作业的物理块数分别为3 和4 时,试计算访问过程中发生的缺页中断次数和缺页中断率。

答:( l )作业的物理块数为3 块,使用FIFO 为9 次,9 / 12 = 75 %。

使用LRU 为7 次,7 / 12 = 58 %。

使用OPT 为6 次,6 / 12 = = 50 %。

作业的物理块数为4 块,使用FIFO 为6 次,6 / 12 = 50 %。

Optimal、FIFO、LRU调度算法

Optimal、FIFO、LRU调度算法

public void replacePage(Page NewPage) { if (VM.getCurrentEmptyIndex() != erPagesCount) { VM.getUserPages()[VM.getCurrentEmptyIndex()]=NewPage; VM.setCurrentEmptyIndex(VM.getCurrentEmptyIndex() + 1); } else { VM.getUserPages()[findUnusedPage(VM.getUserPages(), NewPage.getVisitTime())] = NewPage; } } private int findUnusedPage(Page[] Pages, int CurrentInstruction) { int[] Pos = new int[Pages.length]; Page page; for (int m = 0; m < Pages.length; m++) { Pos[m] = 0; page = Pages[m]; for (int n = CurrentInstruction; n < seq.getList().size(); n++) { if (page == VM.getPages()[Integer.parseInt(seq.getList().get(n).getName()) / Page.PAGE_SIZE]) { Pos[m]=n; break; } } }
2.指令序列变换成页地址流
设:页面大小为 1K; 用户虚存容量为 32K。 在用户虚存中,按每 1K 存放 10 条指令排列虚存地址,即 320 条指令在虚存中的存放方式为: 第 0 条—第 9 条指令为第 0 页(对应虚存地址为[0,9]) ; 第 10 条—第 19 条指令为第 1 页(对应虚存地址为[10,19]) ; 310 条—第 319 条指令为第 31 页(对应虚存地址为[310,319]) ; 按以上方式,用户指令可组成 32 页。

存储管理实验报告_6

存储管理实验报告_6

昆明理工大学信息工程与自动化学院学生实验报告(2012 —2013 学年第二学期)一、实验目的存储管理的主要功能之一是合理地分配空间。

请求页式管理是一种常用的虚拟存储管理技术。

通过本次实验, 要求学生通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解, 通过请求页式存储管理中页面置换算法模拟设计, 了解虚拟存储技术的特点, 掌握请求页式存储管理的页面置换算法。

二、实验原理及基本技术路线图(方框原理图)用C或C++语言模拟实现请求式分页管理。

要求实现: 页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。

int subareaSize[num]={8,12,16,32,24,16,64,128,40,64};//分区大小Process *pro=NULL;//保持进程信息int ProcessNum=0;//进程数目int applyProcessNum=0;//每次申请进程数目int maxApplyNum=0;//最大可申请数目int *applyIndex=NULL;//申请进程队列int totalApplyNum=0;//申请总数int *assignPointer=NULL;//已分配内存的进程队列int assignFlag=0;//分配索引, 表示已申请队列已分配的进程数int exeIndex;//执行的进程号Node *subareaNode=new Node[3];//分区回收时, 进程所在分区及其前, 后分区信息LinkList createLinkList(int n );//建立空闲分区链Node firstFit(LinkList &head,Process pro);//首次适应算法Node nestFit(LinkList &head,Process pro,Node flag);//循环适应算法Node bestFit(LinkList &head,Process pro);//最佳适应算法Node worstFit(LinkList &head,Process pro);//最坏适应算法Node assign(LinkList &head,int orderIndex,int index,Node flagNode);//一次分区分配int assignMemory(LinkList &head);//内存分配void insertNode(LinkList &head,Node q,int index);//插入节点Node deleteNode(LinkList &head,int index);//删除节点int display(LinkList &head);//打印分区分配情况int lowAttemper(int *excursionPointer);//低级调度int findSubarea(LinkList &head,int index);//回收内存int creatProcess();//创建进程Process* randomCreatPro(int n);//随机产生进程下面是各种方法简述:(1) 最优替换算法, 即OPT算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任务四、请求分页存储管理(虚拟存储)一、实验目的通过请求分页存储管理的设计,让学生了解虚拟存储器的概念和实现方法。

进行运行时不需要将所有的页面都调入内存,只需将部分调入内存,即可运行,在运行的过程中若要访问的页面不在内存时,则需求有请求调入的功能将其调入。

假如此时若内存没有空白物理块,则通过页面置换的功能将一个老的不用的页面淘汰出来,其中淘汰的算法有多种。

二、实验内容模拟仿真请求分页调度算法,其中淘汰的算法可选下列其一1、先进先出算法2、最近最久算法3、CLOCK算法三、实验代码#include<iostream>#include<vector>using namespace std;int n;typedef struct Queue{int time;int data;struct Queue *next;}Queue,*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;//fifo=======================================void InitQueue(LinkQueue &Q);void FiFoEnQueueRear(LinkQueue &Q,int e,vector<int> &v);void FiFoDeQueueFront(LinkQueue &Q);inline void PrintQueue(LinkQueue &Q);void FiFoFiFoDoQueueEarly(LinkQueue &Q,int a,vector<int> &v);void FiFoDoQueue(LinkQueue &Q,int a,vector<int> &v);inline int PanDuan(LinkQueue &Q,int a);inline int YeMianCount(LinkQueue &Q);void fifo();//lru=============================================void InitQueue(LinkQueue &Q);void EnQueueMid(LinkQueue &Q,int e,QueuePtr p,vector<int> &v);void EnQueueTheFist(LinkQueue &Q,int e);void PrintQueue(LinkQueue &Q);//void ZhiZhenInit(int n);void DoQueueEarly(LinkQueue &Q,int e,vector<int> &v);void EnQueueRear(LinkQueue &Q,int e,QueuePtr p,vector<int> &v);//void DeQueueFront(LinkQueue &Q);QueuePtr ZhiZhen(LinkQueue &Q,int e);void EnQueue(LinkQueue &Q,int e,vector<int> &v);//void DeQueue(LinkQueue &Q,QueuePtr p);int PanDuan(LinkQueue &Q,int a);int YeMianCount(LinkQueue &Q);void lru();QueuePtr OptimalZhiZhen(LinkQueue &Q,int e);//求出需要置换的页面的上一个页面的位置void EnQueue(LinkQueue &Q,int e,vector<int> &v,int i,vector<int> &vc);inline int YeMianCount(LinkQueue &Q);//使用内敛函数,提高性能inline int Destance(vector<int> &v,int i);inline void SubbDestance(LinkQueue &Q);//=================================================int main(){int k;for(;;){cout<<"请选择!"<<endl;cout<<"1——FiFo算法"<<endl;cout<<"2——LRU算法"<<endl;cout<<"0——退出"<<endl;cin>>k;if(k==0)break;else{switch(k){case 1:fifo();break;case 2:lru();break;default:cout<<" 请从以上的选择中选择一个选项!!"<<endl;}}}}//fifo========================================void InitQueue(LinkQueue &Q){Q.front=Q.rear=(QueuePtr)malloc(sizeof(Queue));if(!Q.front)cout<<"initqueue worng!"<<endl;Q.front->next=NULL;//return OK;}void FiFoEnQueueRear(LinkQueue &Q,int e,vector<int> &v){ QueuePtr p;p=(QueuePtr)malloc(sizeof(Queue));if(!p)cout<<"cannot malloc EnQueue of the p"<<endl;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;v.push_back(e);//cout<<p->data;//return OK;}void FiFoDeQueueFront(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)cout<<"the Queue is empty,cannot delete !!"<<endl;p=Q.front->next;Q.front->next=p->next;free(p);if(Q.rear==p)Q.rear=Q.front;//return OK}void PrintQueue(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)cout<<"the Queue is empty,cannot print!"<<endl;p=Q.front;for(p=Q.front;p->next!=NULL;p=p->next){cout<<p->next->data<<" ";}cout<<endl;//retrun OK;}void FiFoFiFoDoQueueEarly(LinkQueue &Q,int a,vector<int> &v){ QueuePtr p;int count=0;//设置标志位,记录重复的个数。

假如COUNT为0,表示没有重复int b,c;b=a;c=PanDuan(Q,b);//p=Q.front;if(c==1){FiFoEnQueueRear(Q,b,v);PrintQueue(Q);if(v[v.size()-1]!=a)v.push_back(a);}else{cout<<endl;};//v.push_back(a);//cout<<a<<""<<endl;}void FiFoDoQueue(LinkQueue &Q,int a,vector<int> &v){ QueuePtr p;int count=1;//p=Q.front;int b,c;b=a;c=PanDuan(Q,b);//p=Q.front;if(c==1){FiFoEnQueueRear(Q,b,v);FiFoDeQueueFront(Q);PrintQueue(Q);}else{cout<<endl;};//return OK;}int PanDuan(LinkQueue &Q,int a){QueuePtr p;for(p=Q.front;p->next!=Q.rear->next;p=p->next){if(p->next->data!=a){}elsereturn 0;}return 1;}int YeMianCount(LinkQueue &Q){QueuePtr p;int count=0;for(p=Q.front;p->next!=Q.rear->next;p=p->next) count+=1;return count;}void fifo(){vector<int> a;vector<int> v;LinkQueue Q;int m,n,b,c;InitQueue(Q);m=n=b=c=0;cout<<"请输入页块数"<<endl;cin>>n;cout<<"请输入序列的个数"<<endl;cin>>m;cout<<"请输入序列"<<endl;for(int i=0;i<m;++i){cin>>c;a.push_back(c);//cout<<a[i]<<" ";}cout<<"开始页面置换"<<endl;b=a[0];//cout<<b;FiFoEnQueueRear(Q,b,v);PrintQueue(Q);//cout<<"#"<<endl;for(i=1;i<n;i++){b=a[i];//cout<<b<<endl;FiFoFiFoDoQueueEarly(Q,b,v);//PrintQueue(Q);//cout<<endl;}for(i=n;i<m;++i){b=a[i];c=YeMianCount(Q);if(c<n){FiFoFiFoDoQueueEarly(Q,b,v);//PrintQueue(Q);}else{FiFoDoQueue(Q,b,v)//PrintQueue(Q);}//cout<<endl;}cout<<"缺叶顺序为:"<<endl;for(i=0;i<m;++i)cout<<v[i]<<" ";cout<<endl;cout<<"缺叶率为:"<<float(v.size())/float(a.size())<<endl; }//lru=============================================== QueuePtr ZhiZhen(LinkQueue &Q,int e){QueuePtr p,q;//int a;q=Q.front;for(p=Q.front;p->next!=Q.rear->next;p=p->next){if(q->next->time<p->next->time)q=p;else{};}return q;//返回的是需要调换的上一个页面节点}void DoQueueEarly(LinkQueue &Q,int e,vector<int> &v){ QueuePtr q;int b;b=PanDuan(Q,e);if(b==1){EnQueueTheFist(Q,e);v.push_back(e);//PrintQueue(Q);else{q=ZhiZhen(Q,e);if(Q.front->next==Q.rear){EnQueueRear(Q,e,q,v);v.push_back(e);//PrintQueue(Q);}else{EnQueueMid(Q,e,q,v);v.push_back(e);//PrintQueue(Q); }}}void EnQueueMid(LinkQueue &Q,int e,QueuePtr p,vector<int> &v){ QueuePtr q;QueuePtr newq;int a;q=p;//================//a=PanDuan(Q,e);newq=(QueuePtr)malloc(sizeof(Queue));if(!newq)cout<<" connot malloc newq in the EnQueueMid"<<endl;//if(a==1)//没有次页面存在,进行页面置换//{if(q!=Q.front){QueuePtr q1=q->next;newq->data=e;newq->next=q->next->next;q->next=newq;q->next->time=0;free(q1);}Elseif(q==Q.front){QueuePtr q1=q->next;newq->data=e;newq->next=q->next->next;q->next=newq;Q.front->next=newq;q->next->time=0;free(q1);}//v.push_back(e);//else//{};for(p=Q.front;p->next!=Q.rear->next;p=p->next)p->next->time+=1;}void EnQueueRear(LinkQueue &Q,int e,QueuePtr p,vector<int> &v){ QueuePtr q;QueuePtr newq;int a;q=p;//===================a=PanDuan(Q,e);newq=(QueuePtr)malloc(sizeof(Queue));//if(a==1)//没有次页面存在,进行页面置换//{newq->data=e;Q.rear=newq;q->next=newq;Q.rear->next=NULL;q->next->time=0;//v.push_back(e);//}//else//{};for(p=Q.front;p->next!=Q.rear->next;p=p->next)p->next->time+=1;}void EnQueue(LinkQueue &Q,int e,vector<int> &v){QueuePtr p;int a;a=PanDuan(Q,e);if(a==1){ p=ZhiZhen(Q,e);if(p->next!=Q.rear)EnQueueMid(Q,e,p,v);//PrintQueue(Q);v.push_back(e);}else{ EnQueueRear(Q,e,p,v); //PrintQueue(Q);v.push_back(e);}}else{cout<<"不置换"<<endl;};}void EnQueueTheFist(LinkQueue &Q,int e){QueuePtr p;p=(QueuePtr)malloc(sizeof(Queue));if(!p)cout<<"cannot malloc EnQueue of the p"<<endl;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;p->time=0;for(p=Q.front;p->next!=Q.rear->next;p=p->next)p->next->time+=1;//for(p=Q.front;p->next!=Q.rear->next;p=p->next)//cout<<p->next->time<<" the frist time "<<endl;//cout<<"===================================="<<endl; }void lru(){vector<int> a;vector<int> v;LinkQueue Q;int m,n,b,c;InitQueue(Q);m=n=b=c=0;cout<<"请输入页块数"<<endl;cin>>n;cout<<"请输入序列的个数"<<endl;cin>>m;cout<<"请输入序列"<<endl;for(int i=0;i<m;++i){cin>>c;a.push_back(c);}cout<<"你输入的序列号是: "<<endl;for(i=0;i<m;++i)cout<<a[i]<<" ";cout<<"开始页面置换"<<endl;i=0;b=a[i];EnQueueTheFist(Q,b);v.push_back(a[i]);PrintQueue(Q);for(i=1;i<n;++i){b=a[i];DoQueueEarly(Q,b,v);PrintQueue(Q);/*if(v[v.size()-1]!=a[i])PrintQueue(Q);else{cout<<"不置换"<<endl;}//*/}for(i=n;i<m;++i){ c=YeMianCount(Q);if(c<n){b=a[i];DoQueueEarly(Q,b,v);PrintQueue(Q);}elseb=a[i];EnQueue(Q,b,v);PrintQueue(Q);}}cout<<"页面置换的顺序为:"<<endl;for(i=0;i<v.size();++i)cout<<v[i]<<" ";cout<<endl;cout<<"页面置换率为:"<<float(v.size())/float(a.size())<<endl;//* }图4-1 先进先出算法图4-2 最近最久算法。

相关文档
最新文档