请求分页存储管理

合集下载

存储管理

存储管理

内存管理练习试卷共有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 + +

操作系统原理试题题库含答案1

操作系统原理试题题库含答案1

操作系统原理(1)1、现有三个同时到达的作业J1,J2和J3,它们的执行时间分别是T1,T2和T3,且T1A、 T1+T2+T3B、 (3T1+2T2+T3)/3C、 (T1+2T2+3T3)/3D、 (T1+T2+T3)/3正确答案: B2、我们如果为每一个作业只建立一个进程,为照顾紧急作业的用户,应采用( )。

A、 FCFS调度算法B、基于优先权的剥夺调度算法C、时间片轮转法D、多级反馈队列调度算法正确答案: B3、用于控制生产流水线,进行工业处理控制的操作系统是( ).A、分时系统B、网络操作系统C、实时系统D、批处理系统正确答案: C4、进程A在运行中被高优先级进程B抢占,进程A的状态变化是( )。

A、就绪→运行B、阻塞→运行C、运行→就绪D、运行→阻塞正确答案: C5、用V操作唤醒一个等待进程时,被唤醒进程的状态变为( )。

A、等待B、就绪C、运行D、完成正确答案: B6、哪个属于抢占式调度___A、时间片轮转法;B、短作业优先调度;C、先来先服务;D、高响应比优先调度;正确答案: A7、进程的基本属性是( )。

A、进程是动态的、多个进程可以含有相同的程序和多个进程可以并发运行B、进程是动态的、多个进程对应的程序必须是不同的和多个进程可以并发运行C、进程是动态的、多个进程可以含有相同的程序和多个进程不能并发运行D、进程是静态的、多个进程可以含有相同的程序和多个进程可以并发运行正确答案: A8、某文件中共有3个记录。

每个记录占用一个磁盘块,在一次读文件的操作中,为了读出最后一个记录,不得不读出了其他的2个记录。

根据这个情况,可知这个文件所采用的存储结构是____。

A、隐式链接结构B、顺序文件结构C、显式链接结构D、索引结构正确答案: A9、进程从阻塞状态变为就绪状态的原因是___________。

A、进程运行条件满足B、修改了进程的优先级C、进程运行条件不够D、时间片到正确答案: A10、下面六个系统中,必须是实时操作系统的有____个。

计算机操作系统习题(存储器管理)

计算机操作系统习题(存储器管理)

19、请求分页存储管理中,若把页面尺寸增加一 倍,在程序顺序执行时,则一般缺页中断次数会 ( B )。 A.增加 B.减少 C.不变 D.可能增加 也可能减少 20、碎片是指( D )。 A、存储分配完后所剩的空闲区 B、没有被使用的存储区 C、不能被使用的存储区 D、未被使用,而又暂时不能使用的存储区
E、利用交换技术扩充内存时,设计时必须考虑的 问题是:如何减少信息交换量、降低交换所用的时 间; F、在现代操作系统中,不允许用户干预内存的分 配; G、采用动态重定位技术的系统,目标程序可以不 经任何改动,而装入物理内存; H、页式存储管理中,一个作业可以占用不连续的 内存空间,而段式存储管理,一个作业则是占用连 续的内存空间。
11、 文件的存储器是分成大小相等的 物理块 ,并以它为单位交换信息。 12、 从资源分配的角度看,可以把设备分为独 占设备和共享设备。打印机属于 独占 设备,而磁 盘属于 共享 设备。 13、 虚拟设备是通过 SPOOLing 技术 把 独占 设备变成能为若干用户 共享 的设备。 14、 通道是一个独立于 cpu 的专管 的处理机,它控制 与内存之间的信息交换。
空闲区表项按( A.地址从大到小 )进行排列。 B.地址从小到大
C.尺寸从大到小
主要受( )的限制。
D.尺寸从小到大
32.在提供虚拟存储的系统中,用户的逻辑地址空间 A.内存空闲块的大小 B.外存的大小 C.计算机编址 范围 D.页表大小
33.在页式管理中,页表的始址存放在(D )
A.内存中 B.存储页面表中 C.联想存储器中 D.寄存器中 34.在段页式存储管理中,其虚拟地址空间是( ) A.一维 B.二维 C.三维 D.层次
3. 在存储器管理中,页面是信息的________单 位,分段是信息的________单位。页面大小由 _________确定,分段大小由_________确定。 5、从用户的源程序进入系统到相应程序的机器上 运行,所经历的主要处理阶段有____________, ____________,____________, ____________和____________。

简述请求分页存储管理方式

简述请求分页存储管理方式

简述请求分页存储管理方式请求分页存储管理方式是一种非常实用的存储管理方式,它可以将大量数据分成多页存储,从而增加系统的可扩展性和可维护性。

本文将分步骤阐述请求分页存储管理方式的实现过程。

1. 设计数据库表结构首先,我们需要设计出适合分页存储的数据库表结构。

通常,我们需要将数据表按照某种规则分成多个页面,每个页面中包含相同数量的数据。

例如,如果需要将1000条数据分成10页,那么每个页面应该包含100条数据。

2. 编写查询语句在设计好数据库结构之后,我们需要编写查询语句来查询数据并将其分页。

我们可以使用LIMIT关键字来限制查询结果的数量,并使用OFFSET关键字来指定从哪个位置开始查询。

例如,如果需要查询第2页的数据,那么我们可以使用以下SQL语句:SELECT * FROM table_name LIMIT 100 OFFSET 100;这将返回第101到第200条数据。

3. 编写分页控件分页控件是实现分页存储的重要组成部分。

它通常包含一个页面选择器和一个数据显示区域。

我们可以使用JavaScript和CSS来创建翻页效果和样式。

例如,我们可以使用以下代码创建一个简单的页面选择器:```<div class="pagination"><a href="#">1</a><a href="#">2</a><a href="#">3</a><a href="#">4</a><a href="#">5</a></div>```4. 实现异步加载异步加载是将页面动态加载到用户界面中的一种技术。

它可以大大提高页面加载速度和用户体验。

我们可以使用AJAX等技术来实现异步加载。

计算机操作系统(习题集)第四章 答案

计算机操作系统(习题集)第四章 答案

第四章存储器管理一、单项选择题1、存储管理的目的是(C )。

A.方便用户B.提高内存利用率C.方便用户和提高内存利用率D.增加内存实际容量2、在( A)中,不可能产生系统抖动的现象。

A.固定分区管理B.请求页式管理C.段式管理D.机器中不存在病毒时3、当程序经过编译或者汇编以后,形成了一种由机器指令组成的集合,被称为(B )。

A.源程序B.目标程序C.可执行程序D.非执行程序4、可由CPU调用执行的程序所对应的地址空间为(D )。

A.符号名空间B.虚拟地址空间C.相对地址空间D.物理地址空间5、存储分配解决多道作业[1C]划分问题。

为了实现静态和动态存储分配,需采用地址重定位,即把[2C]变成[3D],静态重定位由[4D]实现,动态重定位由[5A]实现。

供选择的答案:[1]:A 地址空间 B 符号名空间 C 主存空间 D 虚存空间[2]、[3]: A 页面地址 B 段地址 C 逻辑地址 D 物理地址 E 外存地址 F 设备地址[4]、[5]: A 硬件地址变换机构 B 执行程序 C 汇编程序D 连接装入程序E 调试程序F 编译程序G 解释程序6、分区管理要求对每一个作业都分配(A )的内存单元。

A.地址连续B.若干地址不连续C.若干连续的帧D.若干不连续的帧7、(C )存储管理支持多道程序设计,算法简单,但存储碎片多。

A.段式B.页式C.固定分区D.段页式8、处理器有32位地址,则它的虚拟地址空间为( B)字节。

A.2GBB.4GBC.100KBD.640KB9、虚拟存储技术是( A)。

A.补充内存物理空间的技术B.补充相对地址空间的技术C.扩充外存空间的技术D.扩充输入输出缓冲区的技术10、虚拟内存的容量只受( D)的限制。

A.物理内存的大小B.磁盘空间的大小C.数据存放的实际地址D.计算机地址字长11、虚拟存储技术与(A )不能配合使用。

A.分区管理B.动态分页管理C.段式管理D.段页式管理12、(B )是指将作业不需要或暂时不需要的部分移到外存,让出内存空间以调入其他所需数据。

计算机操作系统习题4

计算机操作系统习题4
1)按FIFO调度算法将产生多少次缺页中断,依次淘汰的 页号为什么,缺页中断率为多少? 2)按LRU调度算法将产生多少次缺页中断,依次淘汰的页 号为什么,缺页中断率为多少?
6.已知某系统页面长为4KB,页表项4B,采用多层分页策略 映射64位虚拟地址空间。若限定最高层页表占1页,问它可 以采用几层分页策略? 7.在一个采用页式虚拟存储管理的系统中,某进程依次要 访问的字地址序列是:115,228,128,88,446,102, 321,432,260,167,若该作业的第0页已经装入主存, 现分配给该作业的主存共300字,页的大小为100字,请回 答下列问题:
8.某虚拟存储器系统采用页式内存管理,使用LRU页面替 换算法,考虑下面的页面访问地址流(每次访问在一个 时间单位内完成): 1、8、1、7、8、2、7、2、1、8、3、8、 2、1、3、1、7、1、3、7 假定内存容量为4个页面,开始时是空的,则页面置换 次数是()。 A、4 B、5 C、6 D、7

26.设内存的分配情况如图所示。若要申请一块40K字节的内 存空间,若采用最佳适应算法,则所得到的分区首址为()。 A.100K B.190K
0K 100K 180K 190K 280K 330K 390K 410K 512K
C.330K
D.410K
占用 占用 占用
占用
27.在下列存储管理方案中,能实现虚存的有(
)。
A. 每个作业或进程的一张段表,两张页表
B.每个作业或进程的每个段一张段表,一张页表 C.每个作业或进程一张段表,每个段一张页表 D.每个作业一张页表,每个段一张段表
15.在虚拟页式存储管理方案中,完成将页面调入内存的 工作的是( )。
A.缺页中断处理 C.工作集模型应用 B.页面淘汰过程 D.紧缩技术利用

14存储管理3分段段页式管理

14存储管理3分段段页式管理

段号 状态 页表大小 页表始址 0 1 1 1 2 1 3 0 4 1 段表
页表 主存
图4-22 利用段表和页表实现地址映射
2.地址变换过程


在段页式系统中,为了便于实现地址变换,须配 置一个段表寄存器,其中存放段表始址和段表长TL。 进行地址变换时,首先利用段号S,将它与段表长TL进 行比较。若S<TL,表示未越界,于是利用段表始址和 段号来求出该段所对应的段表项在段表中的位置,从 中得到该段的页表始址,并利用逻辑地址中的段内页 号P来获得对应页的页表项位置,从中读出该页所在的 物理块号b,再利用块号b和页内地址来构成物理地址。 图4-23示出了段页式系统中的地址变换机构。
2.页表




列出了作业的逻辑地址与其在主存中的 物理地址间的对应关系。 一个页表中包含若干个表目,表目的自 然序号对应于用户程序中的页号,表目 中的块号是该页对应的物理块号。 页表的每一个表目除了包含指向页框的 指针外,还包括一个存取控制字段。 表目也称为页描述子。
分页管理中页与页框的对应 关系示意图
段表寄存器 段表始址 + 段表 0 1 2 3 页表长度 + 0 1 2 3 b 块号 b 块内地址 页表 段表长度 > 段超长 段号S 页号P 页内地址
页表始址
图4-23
段页式系统中的地址变换机构


在段页式系统中,为了获得一条指令或数据,须 三次访问内存。第一次访问是访问内存中的段表,从 中取得页表始址;第二次访问是访问内存中的页表, 从中取出该页所在的物理块号,并将该块号与页内地 址一起形成指令或数据的物理地址;第三次访问才是 真正从第二次访问所得的地址中,取出指令或数据。 显然,这使访问内存的次数增加了近两倍。为了 提高执行速度,在地址变换机构中增设一个高速缓冲 寄存器。每次访问它时,都须同时利用段号和页号去 检索高速缓存,若找到匹配的表项,便可从中得到相 应页的物理块号,用来与页内地址一起形成物理地址; 若未找到匹配表项,则仍须再三次访问内存。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验3 请求分页存储管理实验目的(1)熟悉主存的分配与回收;(2)了解虚拟存储技术的特点;(3)掌握请求页式存储管理的页面置换算法;实验内容与步骤1、实验准备知识(1) 通过随机数产生一个指令序列(2) 将指令序列变换成为页地址流设:(3) 计算并输出下述各种算法在不同内存容量下的命中率a) 先进先出的算法(FIFO);b) 最近最少使用算法(LRU);c) 最佳淘汰算法(OPT);(4)所涉及的算法1)FIFO算法定义变量ptr。

一开始先预调页填满内存。

在这一部分,ptr指向下一个要存放的位置。

之后继续执行剩下的指令。

此时,ptr表示队列最前面的位置,即最先进来的位置,也就是下一个要被替换的位置。

ptr用循环加,即模拟循环队列。

2)LRU算法定义数组ltu[],即last_time_use来记录该页最近被使用的时间。

定义变量ti模拟时间的变化,每执行一次加一。

这个算法,我没有预调页,而是直接执行所有指令。

若当前需要的页没在内存里,就寻找最近最少使用的页,也就是ltu[]最小的页,即最近一次使用时间离现在最久的页,然后替换掉它。

或者在内存还未满时,直接写入,这个我以初始化内存里所有页为-1来实现。

若已经在内存里了,则只遍历内存内的页,把当前页的最近使用时间改一下即可。

3)OPT算法定义数组ntu[], 即next_time_use来记录下一次被使用的时间,即将来最快使用时间。

初始化为-1.开始时预调页填满内存里的页。

同样利用变量ptr来表示下一个要存放的位置从而控制预调页的过程。

接着初始化ntu数组为-1。

然后求出每一页下一次被使用的指令号,以此代替使用时间。

如果所有剩下的序列都没有用该页时,则还是-1.这种值为-1的页显然是最佳替换对象。

然后执行所有剩下的指令。

当该页不在内存里时,遍历ntu数组,遇到-1的直接使用该页,没有则用ntu[]值最大的,也就是最晚使用的。

无论该页在不在内存里,因为这一次已经被使用了,所以都应该更新这个页的ntu[],只需往前看要执行的页流,记录下第一个遇到的该页即可。

如果没有找到同样添-1即可。

2、实验步骤(1)首先,初始化数据(2)测试地址转换机构参考代码如下:private void AddressTransform(string functionName){//该数组用来存储调用页面号的序列int[] numbers = _pageNumbers;//调用页面列表的副本,用于循环调用列表时的操作List<PageTableEntry> copyInvokeTable = new List<PageTableEntry>();//初始化调用页表和快表for (int i = 0; i < numbers.Length; i++){var entry = new PageTableEntry { PageNumber = numbers[i], BlockNumber = numbers[i] + 1 };//形成页面部分在快表的情况,规定:页面号为偶数的在快表中有记录if (i % 2 == 0){entry.IsInMemory = true;fastTable.Add(new FastTable { PageNumber = entry.PageNumber, BlockNumber = entry.BlockNumber });}else{entry.IsInMemory = false;}entry.VisitTimes = 0;entry.IsModified = false;entry.DiskPosition = _minBlockNumber;invokePage.Add(entry);copyInvokeTable.Add(entry);}//输出TextBoxSwitchTxtToShow(functionName, "当前内存最小物理块数为:" +_minBlockNumber.ToString() + ",可用物理块数为:" + _minBlockNumber.ToString() + "\r\n开始进行页面调度:");//进行地址变换流程,从调用列表第一个页面开始调度,循环的是copyInvokeTable,每循环一次对invokePage 原本进行移除操作foreach (var item in copyInvokeTable){//判断functionName对应的算法是否执行过了,如果有执行过,则mark>0,跳出循环结束页面调度if (_mark > 0){break;}SwitchTxtToShow(functionName, "\r\n当前调度的页面号为:" +item.PageNumber.ToString());//页号>页表长度?if (item.PageNumber > _pageTable.Length){SwitchTxtToShow(functionName, "越界中断");}else{//查询快表for (int i = 0; i < fastTable.Count; i++){//页表项在快表中?if (fastTable[i].PageNumber == item.PageNumber &&fastTable[i].BlockNumber == item.BlockNumber){SwitchTxtToShow(functionName, "\r\n当前页面存在快表中,修改访问位和修改位");//修改访问位和修改位item.IsModified = false;item.VisitTimes += 1;//形成物理地址,在本程序中无太大作用,故不作编写//判断内存是否满if (_isMemoryFull >= _memoryPages.Length){SwitchTxtToShow(functionName, "\r\n内存已满,选择" + functionName + "算法进行页面调度和置换");//选择一页换出,置换算法switch (functionName){case"Optimal":Optimal(invokePage);break;case"FIFO":FIFO(invokePage);break;case"LRU":List<int> pn = numbers.ToList();LRU(invokePage, pn);break;}}else{SwitchTxtToShow(functionName, "\r\n内存未满,将该页调入内存");for (int m = 0; m < _memoryPages.Length; m++){if (_memoryPages[m] == null){_isMemoryFull++;_memoryPages[m] = new PageTableEntry{ PageNumber = item.PageNumber, BlockNumber = item.BlockNumber };break;}}//将该页调入内存后,调用的页表减一if (invokePage != null){//操作invokePage-1,因为在foreach中如果循环的是invokePage本体,则在这里修改了invokePage的值之后,下一次循环无法调用,会出现异常,所以定义了一个copyInvokePage副本专门用来循环invokePage.Remove(item);SwitchTxtToShow(functionName, "\r\n当前内存页面为:");ShowMemory(functionName);}break;}}else{SwitchTxtToShow(functionName, "\r\n该调度页面不在快表中,查询页表");//访问页表for (int p = 0; p < _pageTable.Length; p++){if (item.PageNumber == _pageTable[p].PageNumber){//页在内存?if (_pageTable[p].IsInMemory){SwitchTxtToShow(functionName, "\r\n修改快表");//修改块表fastTable.RemoveAt(fastTable.Count - 1);fastTable.Add(new FastTable{PageNumber = _pageTable[p].PageNumber,BlockNumber = _pageTable[p].BlockNumber});//修改访问位和修改位item.IsModified = false;item.VisitTimes += 1;//判断内存是否满if (_isMemoryFull >= _memoryPages.Length){SwitchTxtToShow(functionName, "\r\n内存已满,选择" + functionName + "算法进行页面调度和置换");//选择一页换出,置换算法switch (functionName){case"Optimal":Optimal(invokePage);break;case"FIFO":FIFO(invokePage);break;case"LRU":List<int> pn = numbers.ToList();LRU(invokePage, pn);break;}}else{SwitchTxtToShow(functionName, "\r\n内存未满,将该页调入内存");for (int m = 0; m < _memoryPages.Length; m++) {if (_memoryPages[m] == null){_isMemoryFull++;_memoryPages[m] = new PageTableEntry { PageNumber = item.PageNumber, BlockNumber = item.BlockNumber };break;}}//调用的页表减一if (invokePage != null){invokePage.Remove(item);SwitchTxtToShow(functionName, "\r\n当前内存页为:");ShowMemory(functionName);}}}//页不在内存中,产生缺页中断,请求调页else{SwitchTxtToShow(functionName, "\r\n该页不在内存中,产生缺页中断,请求调页");//在外存中找到缺页PageTableEntry p1 = _pageTable[p];//内存满否?if (_isMemoryFull >= _memoryPages.Length){SwitchTxtToShow(functionName, "\r\n内存已满,选择" + functionName + "算法进行页面调度和置换");//选择一页换出,置换算法switch (functionName){case"Optimal":Optimal(invokePage);break;case"FIFO":FIFO(invokePage);break;case"LRU":List<int> pn = numbers.ToList();LRU(invokePage, pn);break;}}else{//换入内存,修改页表p1.IsInMemory = true;_pageTable[p] = p1;if (_isMemoryFull >= _memoryPages.Length){SwitchTxtToShow(functionName, "\r\n内存已满,选择" + functionName + "算法进行页面调度和置换");//选择一页换出,置换算法switch (functionName){case"Optimal":Optimal(invokePage);break;case"FIFO":FIFO(invokePage);break;case"LRU":List<int> pn = numbers.ToList(); LRU(invokePage, pn);break;}}else{SwitchTxtToShow(functionName, "\r\n内存未满,调入该页,当前内存页面为:");for (int m = 0; m < _memoryPages.Length; m++){if (_memoryPages[m] == null) {_isMemoryFull++;_memoryPages[m] = p1;break;}}//调用的页表减一if (invokePage != null){invokePage.Remove(item);ShowMemory(functionName);}}}}break;}}break;}}}}}(3)测试先进先出算法 FIFO,并计算缺页率,参考代码如下:private void FIFO(List<PageTableEntry> invokePageFifo){//标志位,只要这个算法有被执行,mark自增一次_mark++;//内存页面的下标,从0开始,从第一个开始替换int memoryNumber = 0;//统计当前调用页面和内存中各个页面的不相等数int unEquar = 0;//开始循环调用页面列表for (int i = 0; i < invokePageFifo.Count; i++){txtFIFOShow.Text += "\r\n调入页面" + invokePageFifo[i].PageNumber.ToString();//循环判断内存总的页面和该调用页面是否相等foreach (var item in _memoryPages){if (item.PageNumber != invokePageFifo[i].PageNumber){unEquar++;}}//只要内存中有一个页面和该调用页面不相等if (unEquar >= _minBlockNumber){//进行页面置换invokePageFifo[i].IsInMemory = true;_memoryPages[memoryNumber] = invokePageFifo[i];//内存下标自增,表示下一次将要置换的页面的下标memoryNumber++;if (memoryNumber >= _minBlockNumber){memoryNumber = 0;}//统计的变量自增_replaceTimes++;_lacePageNumber++;//显示当前内存信息txtFIFOShow.Text += "\r\n当前内存页面为:";ShowMemory("FIFO");}else{txtFIFOShow.Text += "\r\n当前内存页面为:";ShowMemory("FIFO");}unEquar = 0;}txtFIFOShow.Text += "\r\n调度结束";//将一些数据恢复默认_lacePageChance = _lacePageNumber / 20.00;_isMemoryFull = 0;_pageNumbers = new int[20] { 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 };ShowResult("FIFO");}(4)测试最佳置换算法 Optimal,参考代码如下:private void Optimal(List<PageTableEntry> invokePageOptimal){_mark++;int unEquar = 0;//记录内存中页面在页号数组中出现的最大的下标,也就是该下标就是调用页表中最晚才会被用到的页面,是要替换出去的页面//该集合中存储的是未被调用的页面号,已经被调用的页面号不作存储var numbers = new List<int>();//初始化页号数组for (int i = 0; i < invokePageOptimal.Count; i++){numbers.Add(invokePageOptimal[i].PageNumber);}//循环置换页面for (int i = 0; i < invokePageOptimal.Count; i++){int location = 0;//记录某个内存页面和页号数组对比时的不相等数int isFullError = 0;//当某个内存页面不存在页号数组中时,记录该内存页面的下标int fullErrorLocation = 0;txtOptimalShow.Text += "\r\n调入页面" + invokePageOptimal[i].PageNumber.ToString();foreach (var item in _memoryPages){if (item.PageNumber != invokePageOptimal[i].PageNumber){unEquar++;}}//如果内存中的页面和调用的页面号都不相等,则进行页面置换if (unEquar >= _minBlockNumber){//循环页号数组,判断内存中的页面号是否和页号数组中的页号是否相等for (int a = 0; a < _memoryPages.Length; a++){//循环内存中的页面,页号数组和内存页面的页面号作对比for (int n = 0; n < numbers.Count; n++){//如果内存中页面号等于页号数组则记录下该页号的下标,并与上一个页号下标作比较,将比较大的值存入locationif (_memoryPages[a].PageNumber == numbers[n]){if (n >= location){location = n;}break;}//如果内存中的该页面在页号数组中没有找到,isFullError自增 else{isFullError++;}//当isFullError大于或者等于页号数组的数量时,说明该内存页面在页号数组中不存在,记录该内存页面的下标,准备将其置换出if (isFullError >= numbers.Count){fullErrorLocation = a;break;}}if (isFullError >= numbers.Count){break;}else{isFullError = 0;}}//location表示内存页面中,谁在调用页表中最靠后的位置的下标//拿到内存中要置换出去的页面号if (isFullError >= numbers.Count){_memoryPages[fullErrorLocation] = invokePageOptimal[i]; _replaceTimes++;_lacePageNumber++;txtOptimalShow.Text += "\r\n当前内存页面为:";ShowMemory("Optimal");}else{int pageNum = numbers[location];//将该内存页面换出txtOptimalShow.Text += "\r\n当前内存页面为:";for (int p = 0; p < _memoryPages.Length; p++){if (_memoryPages[p].PageNumber == pageNum){_memoryPages[p] = invokePageOptimal[i];_replaceTimes++;_lacePageNumber++;break;}}ShowMemory("Optimal");}//将已经调用完的页面号从页号数组中移除numbers.RemoveAt(0);}//跳出本循环,将页号列表的第一个数移除else{txtOptimalShow.Text += "\r\n当前内存页面为:";ShowMemory("Optimal");numbers.RemoveAt(0);}unEquar = 0;}txtOptimalShow.Text += "\r\n调度结束";_lacePageChance = _lacePageNumber / 20.00;_isMemoryFull = 0;_pageNumbers = new int[20] { 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 };ShowResult("Optimal");}(5)测试最近最久未使用算法 LRU,参考代码如下:private void LRU(List<PageTableEntry> invokePageLru, List<int> pageNumbersLru){_mark++;int unEquar = 0;//初始化前部调用页表号的数组,已经调用的页号才被存储List<int> partPageNumbers = new List<int>();for (int i = 0; i < _minBlockNumber; i++){partPageNumbers.Add(pageNumbersLru[i]);}//循环调用页表for (int i = 0; i < invokePageLru.Count; i++){//判断内存中的页面和该调用列表是否都不相等foreach (var item in _memoryPages){if (item.PageNumber != invokePageLru[i].PageNumber){unEquar++;}}//如果都不相等,进行置换,否则调用下一个需要调度的页面if (unEquar >= _minBlockNumber){txtLRUShow.Text += "\r\n调入页面" + invokePageLru[i].PageNumber.ToString();//计算内存中每个页面在前部页表数组中最后出现的位置int l = 0;//位置标识//循环前部调用页表数组for (int m = 0; m < _memoryPages.Length; m++){//判断内存中每个页面在该数组中出现的位置,并与上一个位置比较,将比较小的存储for (int p = 0; p < partPageNumbers.Count; p++){if (_memoryPages[m].PageNumber == partPageNumbers[p]){if (p > l){l = p;}//用VisitTimes记录下该内存页面在前部页号数组中的位置_memoryPages[m].VisitTimes = p;}}}//得到的内存页表中,每一个页面在前部页表数组中中最后出现的位置都已经记录好//循环内存中的页面,找出在前部页表数组中第一个出现的一个并将其替换//默认替换的页面时内存中的第一个页面PageTableEntry lastPage = _memoryPages[0];for (int j = 1; j < _memoryPages.Length; j++){//比较出现的位置,将比较靠前的记录在lastPage中if (lastPage.VisitTimes > _memoryPages[j].VisitTimes){lastPage = _memoryPages[j];}}//得到最后出现的页面后,将其置换for (int j = 0; j < _memoryPages.Length; j++){if (_memoryPages[j].PageNumber == lastPage.PageNumber){_memoryPages[j] = invokePageLru[i];_replaceTimes++;_lacePageNumber++;partPageNumbers.Add(invokePage[i].PageNumber);txtLRUShow.Text += "\r\n当前内存页面为:";ShowMemory("LRU");break;}}}else{txtLRUShow.Text += "\r\n调用页面" + invokePageLru[i].PageNumber.ToString();txtLRUShow.Text += "\r\n当前内存页面为:";ShowMemory("LRU");//将已经调用完的页面号加入前部页面数组中partPageNumbers.Add(invokePageLru[i].PageNumber);}unEquar = 0;}txtLRUShow.Text += "\r\n调度结束";_lacePageChance = _lacePageNumber / 20.00;_isMemoryFull = 0;_pageNumbers = new int[20] { 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 };ShowResult("LRU");}。

相关文档
最新文档