页面调度算法
黑工程操作系统复习题
1. LRU 页面调度算法总是选择在主存驻留时间最长的页面被淘汰。
()2. 磁盘是共享设备,所以每一时刻可有若干个进程同时与它交换信息。
()3. 分时系统中,时间片设置得越小,则平均响应时间越短。
()4. 多个进程可以对应于同一个程序,且一个进程也可能会执行多个程序。
()5. 设备独立性是指系统具有使用不同设备的能力。
()6. 进程A、B共享变量x,需要互斥执行;进程B C共享变量y, B、C也需要互斥执行,因此,进程A、C必须互斥执行。
()7. 为了提高系统资源的利用率,在作业调度的优先级算法中应该规定,计算型作业的优先级较高,I/O 型作业的优先级较低。
()8.I/0 交通管理程序的主要功能是管理主存控制器和通道。
()9. 引入缓冲区能使CPU和I/O设备之间速度不匹配的情况得到改善,但并不能减少设备中断CPU的次数。
()10. 由于设备驱动程序与硬件紧密相关,因此,系统中配备多少个设备就必须配置同样数量的设备驱动程序。
()11. 可以将操作系统看作是一个资源分配器,用来控制I/O 设备和用户的程序。
()12. 死锁的形成只与资源分配策略有关,而与并发进程的执行速度无关。
()13. 在引入线程的操作系统中,线程是资源分配和调度的基本单位。
()14. 分页存储管理方案易于实现用户使用内存空间的动态扩充。
()15. 对临界资源应采取互斥访问方式来实现共享。
()1. 错,原因: 是选择最长时间没有被用的页面被淘汰。
2. 错,原因: 每一时刻只有一个进程与它交换信息。
3. 错,原因:平均响应时间不但与时间片的大小有关,还与其他因素有关。
4. 对5. 错,原因:设备独立性,可使应用程序独立于具体的物理设备和独立于设备的类型6. 错,原因:不传递。
7. 错,原因:I/O 型作业的优先级高。
8. 错,原因:I/O 交通管理程序的主要功能是管理设备、控制器和通道。
9. 错,减少设备中断CPU的次数。
10. 错,一类一种。
opt页面调度算法
opt页面调度算法调度算法是操作系统中的一个重要概念,它指的是如何合理地安排和管理进程的执行顺序,以提高系统的效率和公平性。
在操作系统中,OPT算法是一种常用的页面调度算法,用于解决内存分页管理中的页面置换问题。
页面置换问题是指当物理内存不足以容纳所有需要运行的进程时,操作系统需要将内存中的一些页面置换出去,以便为新的页面腾出空间。
OPT算法就是一种基于最佳置换策略的页面调度算法,它的思想是选择合适时机将最长时间内没有被访问的页面置换出去。
OPT算法的核心思想是基于未来的页面访问情况进行决策,即它会根据对未来页面访问情况的最优预测来置换页面。
具体来说,OPT算法会根据进程访问页面的历史记录,预测未来一段时间内可能会访问的页面,然后选择最长时间内没有被访问的页面进行置换。
OPT算法的实现步骤如下:1.首先,根据进程的页面访问历史记录,预测未来一段时间内可能会被访问的页面。
可以使用一些算法或者统计方法来进行预测,如最大似然估计、贝叶斯网络等。
2.然后,根据对未来页面访问情况的预测,计算出每个页面在未来一段时间内被访问的时间间隔。
3.接下来,选择最长时间内没有被访问的页面进行置换。
即选择在未来一段时间内最长时间没有被访问的页面进行置换。
4.最后,将选择的页面从物理内存中置换出去,为新的页面腾出空间。
OPT算法的优点是可以最大程度上减少页面置换的次数,提高系统的性能。
因为它基于最佳置换策略,能够合理地预测未来页面的访问情况,选择最长时间没有被访问的页面进行置换,从而减少了页面置换的频率。
然而,OPT算法也存在一些问题。
首先,它需要准确地预测未来页面的访问情况,这对于实际应用来说是非常困难的,因为页面访问情况往往是不确定的,会受到各种因素的影响。
其次,OPT算法的实现依赖于进程的页面访问历史记录,而获取和存储进程的页面访问历史记录是一项耗费资源的任务。
综上所述,OPT算法是一种常用的页面调度算法,它通过基于最佳置换策略来进行页面置换,从而减少页面置换的次数,提高系统性能。
页面调度问题
一、问题描述假设有n个页面驻留在内存中,且有一个能容纳k个页面的高速缓存。
现有依次访问内存中m个页面的请求序列I=I1,I2,…,I i,…,I m,其中m>k。
我们必须确定任何时刻哪k个页面放在高速缓存中。
对某个访问请求I i,若该页面在高速缓存中,则可很快完成访问。
否则发生一次缺页,必须将其调入高速缓存。
这时,若高速缓存未满,则直接将其调入,否则必须确定将高速缓存中哪个页面置换出来以便为I i腾出空间。
高速缓存调度问题是指如何调度页面使得缺页的总数尽可能少。
二、算法分析页面调度策略可以分为两类:一类是基于进程驻留集大小不变的策略;另一类基于进程驻留集可变策略。
在本问题中,驻留集大小是固定的,所以只能采用进程驻留集大小不变的策略。
由于页面调度根程序的执行有关,所以没有最优解,只能得到一般的结论。
在本题中,我采用的是多种贪心策略,不同的贪心策略得到的结果不同,不同的输入对结果也有较大的影响。
驻留集不变的策略中共同的是驻留集大小不变。
若设k为驻留集的大小,(+t s为时刻t的驻留集,)(t)1r为时刻t访问的页号(t是以访问串的每一项为单位的时间),如访问串为1,4,5,即时刻1访问第1页,时刻2访问第4页,时刻3访问第5页,则记为1=r)2(=r。
驻留集大小)1(=)3(,4r,5=)0(s固定的替换策略有如下控制过程。
空集⎪⎩⎪⎨⎧-++++=+}{)}1({)()}1({)()()1(y t r t s t r t s t s t s )1(,|)(|),1()1(|)(|),1()1()1()1(+∈=+∉+<+∉++∈+t s y m t s t s t r m t s t s t r t s t r式中y 为被替换页。
根据不同的选择y 的方法可形成不同策略。
我在做本题过程中,每个算法都是先将页面访问的前几个页面填入驻留集中,接下来再看其他的页是否需要替换。
没有计算空驻留集情况下的页面调度的缺页情况。
页面调度实验报告
一、实验内容(1)页面调度算法目前有许多页面调度算法,本实验主要涉及先进先出调度算法、最近最少调度算法、最近最不常用调度算法。
本实验使用页面调度算法时作如下假设,进程在创建时由操作系统为之分配一个固定数目物理页,执行过程中物理页的数目和位置不会改变。
也即进程进行页面调度时只能在分到的几个物理页中进行。
下面对各调度算法的思想作一介绍。
<1> 先进先出调度算法先进先出调度算法根据页面进入内存的时间先后选择淘汰页面,先进入内存的页面先淘汰,后进入内存的后淘汰。
本算法实现时需要将页面按进入内存的时间先后组成一个队列,每次调度队首页面予以淘汰。
<2>最近最少调度算法先进先出调度算法没有考虑页面的使用情况,大多数情况下性能不佳。
根据程序执行的局部性特点,程序一旦访问了某些代码和数据,则在一段时间内会经常访问他们,因此最近最少用调度在选择淘汰页面时会考虑页面最近的使用,总是选择在最近一段时间以来最少使用的页面予以淘汰。
算法实现时需要为每个页面设置数据结构记录页面自上次访问以来所经历的时间。
<3>最近最不常用调度算法由于程序设计中经常使用循环结构,根据程序执行的局部性特点,可以设想在一段时间内经常被访问的代码和数据在将来也会经常被访问,显然这样的页面不应该被淘汰。
最近最不常用调度算法总是根据一段时间内页面的访问次数来选择淘汰页面,每次淘汰访问次数最少的页面。
算法实现时需要为每个页面设置计数器,记录访问次数。
计数器由硬件或操作系统自动定时清零。
(2)缺页调度次数和缺页中断率、缺页置换率计算缺页中断次数是缺页时发出缺页中断的次数。
缺页中断率=缺页中断次数/总的页面引用次数*100%缺页调度次数是调入新页时需要进行页面调度的次数缺页置换率=缺页调度次数/总的页面引用次数*100%二、总体设计1、算法的原理说明FIFO 先进先出调度算法:当页面框满时,最早进来的页面调出;LRU 最近最少使用调度算法:当页面框满时,最近最少使用的页面调出LFU 最近最不常用调度算法:当页面框满时,最近最不常用的页面调出SECOND 二次机会调度算法:当页面框满时,页面调入时R=0,当被访问时R = 1。
常用的页面调度算法
常用的页面调度算法一、引言在计算机科学中,页面调度算法是操作系统中的一种重要机制,用于管理计算机内存中的页面。
页面调度算法的目标是尽可能地提高内存的利用率,减少页面置换的次数,从而提高系统的性能和响应速度。
常用的页面调度算法有先进先出(FIFO)、最近最久未使用(LRU)和时钟(Clock)算法等。
本文将介绍这些常用的页面调度算法,并分析它们的优缺点及适用场景。
二、先进先出(FIFO)算法先进先出算法是最简单的页面调度算法之一。
它的原理是将最早进入内存的页面置换出去,即先进先出。
当内存空间不足时,操作系统将最早进入内存的页面替换出去,腾出空间给新的页面。
这种算法简单易实现,但是它没有考虑页面的使用频率和重要性,可能导致常用的页面被频繁替换,影响系统的性能。
三、最近最久未使用(LRU)算法最近最久未使用算法是一种常用的页面调度算法。
它的原理是根据页面的使用情况来进行页面置换。
当需要替换页面时,操作系统选择最近最久未使用的页面进行置换。
这种算法考虑了页面的使用频率,可以有效地提高内存的利用率。
然而,LRU算法的实现比较复杂,需要维护一个页面访问的时间戳列表,当页面被访问时,需要更新时间戳列表,这会带来额外的开销。
四、时钟(Clock)算法时钟算法是一种简化的页面调度算法,它是基于LRU算法的改进。
时钟算法使用一个循环链表来保存内存中的页面,并维护一个指针指向当前页面。
当需要替换页面时,时钟算法从当前页面开始顺时针扫描链表,找到一个未被访问的页面进行置换。
如果当前页面已被访问,则将访问位清零,并将指针指向下一个页面。
这种算法简化了LRU算法的实现,并且可以在O(1)的时间内完成页面置换操作。
五、比较和总结先进先出算法简单易实现,但没有考虑页面的使用频率和重要性;最近最久未使用算法考虑了页面的使用频率,可以提高内存的利用率,但实现较复杂;时钟算法是一种简化的LRU算法,可以在O(1)的时间内完成页面置换操作。
操作系统填空、名词解释、简答题题库完整
填空题1.操作系统的特征是(并发),(共享)和(异步性)还有(虚拟).2.按照用户界面的使用环境和功能特征的不同,一般可以把操作系统分为三种基本类型,即:(批处理系统),(分时系统)和实时系统.3. 软件系统分为系统软件,(支撑软件)和(应用软件).4.多数计算机系统将处理器的工作状态划分为(管态)和目态.后者一般指用户程序运行时的状态,又称为普通态或(用户态).5. 存储器一般分成高速缓冲器,(内存)和(外存)三个层次,其中高速缓冲器是造价最高,存取速度最快.6.文件的物理结构有:顺序结构,(链接结构)和(索引结构).8. 在单CPU系统中有n(n>1)个进程,在任一时刻处于就绪的进程最多是(n-1)个,最少是(0)个.9. 系统为每一台设备确定一个编号,以便区分和识别,这个确定的编号称为设备的(绝对)号.由用户在程序中定义的设备编号称为设备的(相对)号.10. 一个作业可划分成若干个(相对独立)的部分,每个部分称为一个(作业步).11. 在批处理兼分时的系统中,往往由分时系统控制的作业称为(前台)作业,而由批处理系统控制的作业称为(后台)作业.12. 操作系统为用户提供两种类型的使用接口,它们是(操作员)接口和(程序员) 接口.13. 操作系统中,进程可以分为(系统)进程和(用户)进程两类.15. 除了新建状态与撤销状态,进程的基本状态有(运行)、(就绪)、(阻塞)。
16. 在响应比最高者优先的作业调度算法中,当各个作业等待时间相同时,(计算时间短)分母的作业将得到优先调度;当各个作业要求运行的时间相同时, (等待时间长)分子的作业得到优先调度.17. 当一个进程独占处理器顺序执行时,具有两个特性: (封闭)性和(可再现性).18. Linux的shell有两层含义,一是指由(shell命令)组成的Shell 命令语言;二是指(该命令的解释)程序.19. 操作系统的主要设计目标是(方便用户使用)和(资源利用率高).20. 当一个进程完成了特定的任务后,系统收回这个进程所占的(资源)和取消该进程的(进程控制块PCB),就撤消了该进程.21. 每个索引文件都必须有一张(索引)表,其中每个登记项用来指出一个逻辑记录的(存放位置或指针或首地址).22. 实现SPOOL系统时必须在磁盘上辟出称为(输入#)和(输出#)的专门区域,以存放作业信息和作业执行结果.23. 一个理想的作业调度算法应该是既能(提高系统效率)又能使进入系统的作业(周转时间短).24. 死锁的四个必要条件是(互斥使用资源),(占用并等待资源),不可抢夺资源和循环等待资源.25. 操作系统一般为用户提供了三种界面,它们是(命令界面),(图形界面)和系统调用界面.26. 进程间相互合作的关系是(同步)关系,而对资源争用的关系是(互斥)关系.若干进程使用同一临界资源时必须互斥执行.27. 处理机调度可分为三级,它们是作业调度,(进程调度)和CPU交换调度;在一般操作系统中,必须具备的调度是(进程调度).28. 一般说来,用户程序中所使用的地址是逻辑地址,而内存中各存储单元的地址是(物理地址或绝对地址);将前者转变为后者的过程称作(重定位).29. 在段页式存储管理系统中,面向(用户)的地址空间是段式划分,面向(物理实现)的地址空间是页式划分.30. 在Linux系统中,基本的文件类型分为(普通)文件,目录文件和文件, 所有的I/O设备按其物理特性分为(字符)设备和块设备.33. 操作系统的设备管理应具备的主要功能是(监视设备状态),(进行设备分配),完成I/O操作和缓冲管理与地址转换.34. 对信号量S每执行一次P操作,则信号量S的值就减1.当S的值小于0时,执行P操作的进程的状态就置为阻塞态,把相应的PCB连入该信号量队列的(末尾),并且该进程放弃处理机,由(进程调度程序)调度合适进程.35. 把逻辑地址转变为内存的物理地址的过程称作重定位,它分为(静态重定位)和(动态重定位)两种形式,在现代操作系统中都采用动态重定位形式来实现这种地址转换.37. SPOOLing的中文含义为(同时外围联机操作)或(假脱机操作)。
用先进先出(FIFO)页面调度算法处理缺页中断
//页面调度算法(FIFO)#include<stdio.h>#define TRUE 1#define FALSE 0#define MAX 7 // 页的最大数#define IN 4 // 在主存中的页数#define count 13 // 指令数量int P[IN]; // 表示已在主存中的页面int k; // 表示P数组中最先进入内存的页的位置typedef struct{int num; // 页号bool pre; // 标志int random; // 主存块号bool revise; // 修改标志int location; // 在磁盘上的位置}Page_Item;Page_Item Page_Record[MAX];// 指令数据结构typedef struct{char oper; // 操作符int Page_Num; // 页号int Unit_Num; // 单元号}Instruction;Instruction IC[count];// 初始化指令和页表void Init(){k=0; // 指向最先进入内存的页// 初始化页表Page_Record[0].num=0;Page_Record[0].pre=TRUE;Page_Record[0].random=5;Page_Record[0].revise=FALSE;Page_Record[0].location=011;Page_Record[1].num=1;Page_Record[1].pre=TRUE;Page_Record[1].random=8;Page_Record[1].revise=FALSE;Page_Record[1].location=012; Page_Record[2].num=2;Page_Record[2].pre=TRUE; Page_Record[2].random=9; Page_Record[2].revise=FALSE; Page_Record[2].location=013;Page_Record[3].num=3;Page_Record[3].pre=TRUE; Page_Record[3].random=1; Page_Record[3].revise=FALSE; Page_Record[3].location=021;Page_Record[4].num=4;Page_Record[4].pre=FALSE; Page_Record[4].random=0; Page_Record[4].revise=FALSE; Page_Record[4].location=022;Page_Record[5].num=5;Page_Record[5].pre=FALSE; Page_Record[5].random=0; Page_Record[5].revise=FALSE; Page_Record[5].location=023;Page_Record[6].num=6;Page_Record[6].pre=FALSE; Page_Record[6].random=0; Page_Record[6].revise=FALSE; Page_Record[6].location=121;// 初始化指令序列IC[0].oper='+';IC[0].Page_Num=0;IC[0].Unit_Num=70;IC[1].oper='+';IC[1].Page_Num=1;IC[1].Unit_Num=50;IC[2].oper='*';IC[2].Page_Num=2;IC[2].Unit_Num=15;IC[3].oper='w';IC[3].Page_Num=3;IC[3].Unit_Num=21;IC[4].oper='r';IC[4].Page_Num=0;IC[4].Unit_Num=56;IC[5].oper='-';IC[5].Page_Num=6;IC[5].Unit_Num=40;IC[6].oper='>';IC[6].Page_Num=4;IC[6].Unit_Num=53;IC[7].oper='+';IC[7].Page_Num=5;IC[7].Unit_Num=23;IC[8].oper='w';IC[8].Page_Num=1;IC[8].Unit_Num=37;IC[9].oper='r';IC[9].Page_Num=2;IC[9].Unit_Num=78;IC[10].oper='+';IC[10].Page_Num=4;IC[10].Unit_Num=1;IC[11].oper='r';IC[11].Page_Num=6;IC[11].Unit_Num=84;IC[12].oper='#';IC[12].Page_Num=0;IC[12].Unit_Num=0;}// 根据FIFO算法替换页,所需要的参数是被调入页的页结构体void replace(Page_Item page){// 被替换的页已经修改了if(TRUE==Page_Record[P[k]].revise){// 修改被调出页的存在标志Page_Record[P[k]].pre=FALSE;// 修改被调出页的修改标志Page_Record[P[k]].revise=FALSE;printf("调出%d页\n",P[k]);}// 将调入页的存在标志修改为TRUEpage.pre=TRUE;// 将被调出页的主存块号赋给调入页的主存块号page.random=Page_Record[P[k]].random;// 将调入页的页号赋给P[k]P[k]=page.num;printf("调入%d页\n",page.num);// 修改k指针k=(k+1)%IN;}// 指令执行过程void excute(){int i=0; // 指向当前正在执行的指令while('#'!=IC[i].oper){printf("执行%c指令,需%d页\n",IC[i].oper,IC[i].Page_Num);// 若正在执行的指令所需的页不在内存中if(FALSE==Page_Record[IC[i].Page_Num].pre){printf("该页不在内存中,请求调入.........\n");// 调用替换函数,调入所需的页replace(Page_Record[IC[i].Page_Num]);}// 修改指令对该页的操作if('+'==IC[i].oper||'*'==IC[i].oper||'-'==IC[i].oper||'>'==IC[i].oper){printf("%c指令修改了%d页\n",IC[i].oper,IC[i].Page_Num);// 修改该页的修改标志Page_Record[IC[i].Page_Num].revise=TRUE;}i++; // 指向下一条指令}for(i=0;i<IN;i++){if(TRUE==Page_Record[P[i]].revise){printf("%d页写回外存!\n",P[i]);}}}void main(){Init();excute();}。
LRU页面调度算法实现
LRU页面调度算法实现学院计算机科学与技术专业计算机科学与技术学号学生姓名指导教师姓名2014年3月16 日目录1.实验要求 (2)2.实验目的 (2)3.实验内容 (2)4.相关知识 (2)5.实验原理 (3)6.流程图 (4)7.源代码 (5)8.运行结果 (9)9.实验心得 (10)10.参考文献 (11)LRU页调度算法实现一实验要求:1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。
对程序其它部分也进行必要的注释。
2.对系统进行功能模块分析、画出总流程图和各模块流程图。
3.用户界面要求使用方便、简洁明了、美观大方、格式统一。
所有功能可以反复使用,最好使用菜单。
4.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。
5.所有程序需调试通过。
二实验目的:将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
进一步巩固和复习操作系统的基础知识。
培养学生结构化程序、模块化程序设计的方法和能力。
提高学生调试程序的技巧和软件设计的能力。
提高学生分析问题、解决问题以及综合利用C 语言进行程序设计的能力。
三实验内容:程序应模拟实现LRU 算法思想,对n个页面实现模拟调度。
四相关知识:1.虚拟存储器的引入:局部性原理:程序在执行时在一较短时间内仅限于某个部分;相应的,它所访问的存储空间也局限于某个区域,它主要表现在以下两个方面:时间局限性和空间局限性。
2.虚拟存储器的定义:虚拟存储器是只具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。
3.虚拟存储器的实现方式:分页请求系统,它是在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页面形式虚拟存储系统。
请求分段系统,它是在分段系统的基础上,增加了请求调段及分段置换功能后,所形成的段式虚拟存储系统。
五.实验原理:目前有许多页面调度算法,本实验主要涉及最近最久未使用调度算法。
操作系统页面调度算法程序实验报告
操作系统页面调度算法程序实验报告一、实验背景操作系统是计算机系统中最重要的组成部分之一,它负责管理计算机的资源、协调各个程序的运行和提供用户与计算机之间的接口。
而页面调度算法则是操作系统中非常重要的一个部分,它主要用于管理内存中的页面,以提高计算机系统的性能和效率。
二、实验目的本次实验旨在通过编写一个页面调度算法程序,深入理解操作系统中页面调度算法的原理和实现方法,并掌握如何使用C语言进行程序设计和开发。
三、实验原理1. 页面调度算法概述在操作系统中,为了提高内存利用率和进程执行效率,通常会将进程所需的数据或指令分割成多个大小相等的块(即“页面”),并将这些页面存储到内存中。
当进程需要访问某个页面时,如果该页面已经在内存中,则直接访问即可;如果该页面不在内存中,则需要进行“缺页处理”,将其从磁盘读入内存,并将其中一个已经在内存中但未被访问过一段时间的页面替换出去。
而为了确定应该替换哪个页面,就需要使用一种称为“页面调度算法”的技术来进行决策。
常见的页面调度算法有FIFO、LRU、LFU等。
2. FIFO算法FIFO(First In First Out)算法是最简单的页面调度算法之一,它的原理是将最先进入内存的页面替换出去。
具体来说,当一个新页面需要进入内存时,如果内存已经满了,则将最先进入内存的页面替换出去,并将新页面插入到队列末尾。
3. LRU算法LRU(Least Recently Used)算法是一种比较常用的页面调度算法,它的原理是根据页面最近被访问的时间来进行决策。
具体来说,当一个新页面需要进入内存时,如果内存已经满了,则将最近访问时间最早且未被修改过的页面替换出去,并将新页面插入到队列末尾。
4. LFU算法LFU(Least Frequently Used)算法是一种根据页面使用频率来进行决策的调度算法。
具体来说,当一个新页面需要进入内存时,如果内存已经满了,则将使用频率最低的那个页面替换出去,并将新页面插入到队列末尾。
黑工程操作系统复习题
1.LRU页面调度算法总是选择在主存驻留时间最长的页面被淘汰。
()2.磁盘是共享设备,所以每一时刻可有若干个进程同时与它交换信息。
()3.分时系统中,时间片设置得越小,则平均响应时间越短。
()4.多个进程可以对应于同一个程序,且一个进程也可能会执行多个程序。
()5.设备独立性是指系统具有使用不同设备的能力。
()6.进程A、B共享变量x,需要互斥执行;进程B、C共享变量y,B、C也需要互斥执行,因此,进程A、C必须互斥执行。
()7.为了提高系统资源的利用率,在作业调度的优先级算法中应该规定,计算型作业的优先级较高,I/O型作业的优先级较低。
()8.I/0交通管理程序的主要功能是管理主存控制器和通道。
()9.引入缓冲区能使CPU和I/O设备之间速度不匹配的情况得到改善,但并不能减少设备中断CPU的次数。
()10.由于设备驱动程序与硬件紧密相关,因此,系统中配备多少个设备就必须配置同样数量的设备驱动程序。
()11.可以将操作系统看作是一个资源分配器,用来控制I/O设备和用户的程序。
()12.死锁的形成只与资源分配策略有关,而与并发进程的执行速度无关。
()13.在引入线程的操作系统中,线程是资源分配和调度的基本单位。
()14.分页存储管理方案易于实现用户使用内存空间的动态扩充。
()15.对临界资源应采取互斥访问方式来实现共享。
()1.错,原因:是选择最长时间没有被用的页面被淘汰。
2.错,原因:每一时刻只有一个进程与它交换信息。
3.错,原因:平均响应时间不但与时间片的大小有关,还与其他因素有关。
4.对5.错,原因:设备独立性,可使应用程序独立于具体的物理设备和独立于设备的类型6.错,原因:不传递。
7.错,原因:I/O型作业的优先级高。
8.错,原因:I/O交通管理程序的主要功能是管理设备、控制器和通道。
9.错,减少设备中断CPU的次数。
10.错,一类一种。
11.对12.错,原因:与进程执行速度有关。
13.错,线程是调度的基本单位,进程是资源分配的基本单位14.错,原因:分段存储管理易于实现用户使用内存空间的动态扩充。
opt页面调度算法
opt页面调度算法OPT(最佳置换)页面调度算法是一种页面置换算法,目标是使发生页面缺失的次数最小化。
在OPT算法中,每次发生页面缺失时,选择未来最长时间内不再使用的页面进行置换。
OPT算法的思想是通过预测未来的页面访问情况来优化页面置换。
具体实现步骤如下:1.首先记录页面访问序列。
这可以通过检测进程的访存指令或者通过日志记录来获取。
2.创建一个空的页面表,用于存储当前内存中的页面。
3.依次扫描页面访问序列,对于每个页面访问请求:a.如果该页面已经在页面表中,说明页面已经在内存中,不需要做任何操作。
b.如果页面不在页面表中,说明该页面发生了页面缺失。
c.在页面表中查找空闲的页面框。
如果有空闲页面框,则将页面调入该页面框,更新页面表。
d.如果没有空闲页面框,需要进行页面置换操作。
遍历页面表中的页面框,对于每个页面框,找出未来最长时间内不再使用的页面进行置换。
4.继续处理下一个页面请求,直到所有的页面请求都被处理完毕。
OPT算法的优点是通过最优的置换策略,可以达到最小化页面缺失的目标。
然而,这种算法在实际应用中有一定的局限性:1.预测未来页面访问情况是不可能完全准确的,因此无法实现真正的最佳置换策略。
2.OPT算法需要事先获得完整的页面访问序列,这在实际中是很难实现的。
3.对于具有大量页面的系统,遍历页面表来寻找未来最长时间内不再使用的页面是非常耗时的操作,会导致算法的效率较低。
4.由于OPT算法需要对未来的页面访问进行预测,因此它的实现难度相对较高。
在实际应用中,OPT算法很少直接使用,主要是用作参考和比较其他页面调度算法的性能。
常用的页面调度算法包括FIFO(先进先出)、LRU (最近最少使用)和LFU(最近最少使用)等。
总之,OPT页面调度算法通过预测未来的页面访问情况来优化页面置换策略,以达到最小化页面缺失的目标。
然而,由于预测的不准确性和实现的难度,OPT算法在实际应用中有一定的局限性。
什么是OPT(Optimal)页面调度算法
什么是OPT(Optimal)页面调度算法
OPT(Optimal)页面调度算法是一种理论上的最佳页面调度算法,它基于未来的页面访问序列,选择在未来最长时间内不会被访问的页面进行置换。
其基本思想是找到最佳的置换策略,以最小化页面缺页率。
1. 预测未来页面访问序列:OPT算法需要预测未来的页面访问序列,这是实现OPT算法的难点之一。
通常可以通过统计历史访问序列的频率、利用机器学习算法或者模拟预测等方法来估计未来的页面访问情况。
2. 选择最佳置换页面:根据预测的未来页面访问序列,对于当前需要置换的页面,选择在未来最长时间内不会被访问的页面进行置换。
即选择离当前时间最远的未来访问页面进行置换。
3. 更新页面访问信息:在进行页面置换后,更新页面访问信息,包括页面的访问时间戳、访问频率等信息,以便下一次页面置换时使用。
OPT算法的优点是能够达到最佳的页面置换效果,最小化页面缺页率。
但是,由于需要准确预测未来的页面访问序列,实际中很难完全实现OPT算法。
因此,OPT算法主要用作理论分析的基准,实际系统中常采用近似算法如FIFO、LRU等来进行页面置换。
[整理]操作系统的三大调度机制及算法
[整理]操作系统的三⼤调度机制及算法⽬录操作系统的三⼤调度机制,分别是「进程调度/页⾯置换/磁盘调度算法」。
进程调度算法进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。
当 CPU 空闲时,操作系统就选择内存中的某个「就绪状态」的进程,并给其分配 CPU。
什么时候会发⽣ CPU 调度呢?通常有以下情况:1. 当进程从运⾏状态转到等待状态;2. 当进程从运⾏状态转到就绪状态;3. 当进程从等待状态转到就绪状态;4. 当进程从运⾏状态转到终⽌状态;其中发⽣在 1 和 4 两种情况下的调度称为「⾮抢占式调度」,2 和 3 两种情况下发⽣的调度称为「抢占式调度」。
⾮抢占式的意思就是,当进程正在运⾏时,它就会⼀直运⾏,直到该进程完成或发⽣某个事件⽽被阻塞时,才会把 CPU 让给其他进程。
⽽抢占式调度,顾名思义就是进程正在运⾏的时,可以被打断,使其把 CPU 让给其他进程。
那抢占的原则⼀般有三种,分别是:时间⽚原则、优先权原则、短作业优先原则。
你可能会好奇为什么第 3 种情况也会发⽣ CPU 调度呢?假设有⼀个进程是处于等待状态的,但是它的优先级⽐较⾼,如果该进程等待的事件发⽣了,它就会转到就绪状态,⼀旦它转到就绪状态,如果我们的调度算法是以优先级来进⾏调度的,那么它就会⽴马抢占正在运⾏的进程,所以这个时候就会发⽣ CPU 调度。
那第 2 种状态通常是时间⽚到的情况,因为时间⽚到了就会发⽣中断,于是就会抢占正在运⾏的进程,从⽽占⽤ CPU。
调度算法影响的是等待时间(进程在就绪队列中等待调度的时间总和),⽽不能影响进程真在使⽤ CPU 的时间和 I/O 时间。
接下来,说说常见的调度算法:1. 先来先服务调度算法2. 最短作业优先调度算法3. ⾼响应⽐优先调度算法4. 时间⽚轮转调度算法5. 最⾼优先级调度算法6. 多级反馈队列调度算法先来先服务调度算法最简单的⼀个调度算法,就是⾮抢占式的先来先服务(First Come First Severd, FCFS)算法了。
FIFO页面调度算法处理缺页中断.
计算机科学与技术系实验报告专业名称网络工程课程名称操作系统原理项目名称FIFO页面调度算法处理缺页中断班级 12网络工程(1)班学号 1204031030姓名方彬同组人员朱佳宝、王卫、凌含涛、胡星瑞实验日期 2014.12.02一、实验目的与要求:(1)熟悉、掌握先进先出FIFO算法,并实现用先进先出FIFO算法页面调度算法处理缺页中断.(2)理解基于先进先出FIFO的内存管理调度算法,更好的掌握算法的思想,结合实验理解算法更直观,深刻具体。
通过对先进先出FIFO的调度算法的模拟实验可以清楚的了解内存管理是如何调度的,以及加深对内存管理的了解。
二、实验内容1)任务分析:以无歧义的陈述说明实验任务,并明确规定:(a)输入的形式和输入值的范围;在输入文本框中输入,输入值的范围在0~6之间(b) 输出的形式;输出为缺页序列的表格(c) 程序所能达到的功能;输入页号,输出缺页序列,实现先进先出算法的模拟(d) 测试数据:包括正确的输入及其输出结果和错误的输入及其输出结果。
①输入值为空:②输入值越界:③正确的输入值:2)概要设计:说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
本程序中定义了一个数组int[] mainstore = {3,2,1,0 };用于模拟主存存放页;此外还定义了一个数组int[] flag = {0,0,0,0,0,0,0 };用于表明页号的修改标志位,便于之后的操作。
该程序的只要流程如下:3)详细设计:实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。
using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using lru;using change;namespace 操作系统{public partial class Form1 : Form{public Form1(){InitializeComponent();}//定义一个窗口类,在类里面定义一个窗口int[] mainstore = {3,2,1,0 };//定义数组用于存放页int[] flag = {0,0,0,0,0,0,0 };//定义修改标志位的数组int blo = 0;//用来控制在表格的哪一列输出页号序列private void button1_Click(object sender, EventArgs e)//定义一个事件响应,即对输入进行操作{if (string.IsNullOrEmpty(txt.Text))MessageBox.Show("请输入页号!");else if (int.Parse(txt.Text) > 6 || int.Parse(txt.Text) < 0)MessageBox.Show("输入页号不合法,请重新输入!");//判断输入是否合法else{int page = int.Parse(txt.Text);int i=0;if (page != mainstore[0] && page != mainstore[1] && page != mainstore[2] && page != mainstore[3])//插入页内存中不存在,进行FIFO算法{int lll;lll = mainstore[0];if (flag[mainstore[0]] == 0)//修改标志位为0,直接覆盖{mainstore[0] = page;flag[lll] = 1;}Else//修改标志位为1,数组执行FIFO{for (i = 0; i < 3; i++)mainstore[i] = mainstore[i + 1];mainstore[3] = page;}MessageBox.Show("当前调走页号"+lll.ToString ()+"\n存入页号为"+page.ToString ());l0.Text = "0";l1.Text = "0";l2.Text = "0";l3.Text = "0";l4.Text = "0";l5.Text = "0";l6.Text = "0";//标志位初始化;for (int j = 0; j < 4; j++){if (mainstore[j] == 0)l0.Text = "1";if (mainstore[j] == 1)l1.Text = "1";if (mainstore[j] == 2)l2.Text = "1";if (mainstore[j] == 3)l3.Text = "1";if (mainstore[j] == 4)l4.Text = "1";if (mainstore[j] == 5)l5.Text = "1";if (mainstore[j] == 6)l6.Text = "1";}//根据插入页号,将标志位置1for (int k = 0;k < 7; k++){if (lll == 0)ll0.Text = "1";if (lll == 1)ll1.Text = "1";if (lll == 2)ll2.Text = "1";if (lll == 3)ll3.Text = "1";if (lll == 4)ll4.Text = "1";if (lll == 5)ll5.Text = "1";if (lll == 6)ll6.Text = "1";}//根据情况,将修改标志位置1}else{MessageBox.Show("该页已在主存中!" );}blo++;if(blo==1){txt10.Text = mainstore[0].ToString();txt11.Text = mainstore[1].ToString();txt12.Text = mainstore[2].ToString();txt13.Text = mainstore[3].ToString();}else if(blo==2){txt20.Text = mainstore[0].ToString();txt21.Text = mainstore[1].ToString();txt22.Text = mainstore[2].ToString();txt23.Text = mainstore[3].ToString();}else if(blo==3){txt30.Text = mainstore[0].ToString();txt31.Text = mainstore[1].ToString();txt32.Text = mainstore[2].ToString();txt33.Text = mainstore[3].ToString();}else if(blo==4){txt40.Text = mainstore[0].ToString();txt41.Text = mainstore[1].ToString();txt42.Text = mainstore[2].ToString();txt43.Text = mainstore[3].ToString();}else if(blo==5){txt50.Text = mainstore[0].ToString();txt51.Text = mainstore[1].ToString();txt52.Text = mainstore[2].ToString();txt53.Text = mainstore[3].ToString();}else if(blo==6){txt60.Text = mainstore[0].ToString();txt61.Text = mainstore[1].ToString();txt62.Text = mainstore[2].ToString();txt63.Text = mainstore[3].ToString();}else if(blo==7){txt70.Text = mainstore[0].ToString();txt71.Text = mainstore[1].ToString();txt72.Text = mainstore[2].ToString();txt73.Text = mainstore[3].ToString();}else if(blo==8){txt80.Text = mainstore[0].ToString();txt81.Text = mainstore[1].ToString();txt82.Text = mainstore[2].ToString();txt83.Text = mainstore[3].ToString();}//根据插入数量,决定在输出表的指定列输出}}private void 刷新ToolStripMenuItem_Click(object sender, EventArgs e){Form1 the_new = new Form1();the_new.Show();}private void 退出ToolStripMenuItem_Click(object sender, EventArgs e){this.Close();}4)调试分析:(a)调试过程中遇到哪些问题,是如何解决的;Q1:一开始的程序只能输入9个页号序列,超过之后就不能够再显示新的页号序列;(定义了一个变量BLO,用于记录输入页号数量,做求模运算mod 9,这样当超过九个之后又会从第一列开始覆盖)Q2:考虑到程序的用户友好性,增加了序列刷新功能,刷新输出区域;(定义了一个button,点击后将输出区域初始化)Q3:开始没有理解修改标志位的作用,所以功能没有实现;(经过与同学的讨论,定义了一个数组flag[],将页号作为flag[]的下标选择置1或置0)(b) 算法的时空分析:算法的时间复杂度和空间复杂度分析;5)测试结果:包括输入和输出,测试数据应该完整和严格。
2009-2010级计算机科学技术操作系统试题(B卷)答案
2004B一、名词解释(每小题4分,共20分)1. 流式文件答:一种逻辑文件结构,用户对文件内的信息不再划分可独立的单位,整个文件是由依次的一串字符组成,是一个没有结构的字节流2. 虚拟设备答:为了提高独占设备利用率,减少死锁现象发生,操作系统中实现了SPOOLing技术,将输入数据先从输入设备读到磁盘文件中,当进程需要从输入设备读入数据时,只需立即从磁盘文件读入数据。
当进程有信息要输出时,也立即将信息写到磁盘文件,以后再由操作系统依次将输出文件的内容写到输出设备。
即用磁盘文件代替独占I/O设备,在进程看来,当其申请独占操作系统立即给它们分配一个磁盘文件作为独占设备,而在进程看来好像得到了一台独占物理设备,但这个物理设备实际上只是一个文件,所以称为虚拟设备。
3. 分时系统答:一种典型的操作系统类型,在这种系统中,每个用户被安排有一个操作计算机的终端,用于运行自己的作业,操作系统将CPU时间分成很多片断,轮流分配给各个用户作业使用,并使保证每个用户输入完操作命令时,很快可以得到系统的响应。
4. 存储“抖动”现象答:在请求分页式存储管理系统中,由于页面替换算法不合适,或分配给用户进程的物理块太少,可能导致大量的页面刚被换到辅存,又要加载到主存,使CPU的大量时间花费在页面交换上,而实际运行用户进程的时间却很少,这种现象称为存储“抖动”现象。
5. 死锁避免答:先假定将资源分配给申请进程,然后检查系统的资源分配状态,看是否存在一个让所有进程都得到所需资源运行结束的一个资源分配的安全序列。
如果存在,就说明这次资源分配是安全的,把资源分配给申请进程;如果不存在,就说明一定会导致死锁,说明这次资源分配是不安全的,推迟本次资源分配。
这种解决死锁的方法称为死锁避免。
二、填空题(每空1分,共15分)1、用户进程从目态(常态)转换为管态(特权态)的唯一途径是_ 系统调用___2、进程获得CPU而运行是通过____ 处理机调度_得到的3、在虚拟段式存储管理中,若所需页面不在内存则发生_ 缺段___中断.4、_ 最短作业优先___作业调度算法有最短的作业平均周转时间5、内存管理的基本功能是:内存分配、____地址变换_______、存储扩充和_____存储保护______。
opt页面调度算法
Opt页面调度算法1. 简介Opt页面调度算法是一种用于优化页面调度的算法。
页面调度是指操作系统中将内存中的页面(页面是内存中的最小单位)调入或调出物理内存的过程。
Opt算法通过分析页面未来的访问模式,选择最佳的页面替换策略,以提高系统的性能和效率。
2. 页面调度算法的背景在计算机系统中,内存是有限的资源,操作系统需要智能地管理内存,以便为应用程序提供足够的内存空间。
当内存中的页面不足时,操作系统需要选择哪些页面调入内存,哪些页面调出内存。
页面调度算法就是为了解决这个问题而设计的。
3. 页面调度算法的分类页面调度算法可以分为以下几种:3.1 FIFO算法FIFO(First In First Out)算法是最简单的页面调度算法之一。
它的原理是将最早进入内存的页面替换出去。
然而,FIFO算法存在一个问题,即它没有考虑页面的访问模式,可能会导致频繁访问的页面被替换出去,从而降低系统的性能。
3.2 LRU算法LRU(Least Recently Used)算法是一种基于页面访问时间的页面调度算法。
它的原理是将最近最少使用的页面替换出去。
LRU算法考虑了页面的访问模式,相对于FIFO算法,它能够更好地适应应用程序的访问特点,提高系统的性能。
3.3 Opt算法Opt(Optimal)算法是一种理论上最优的页面调度算法。
它的原理是通过分析页面未来的访问模式,选择最佳的页面替换策略。
Opt算法需要预先知道应用程序的访问模式,因此在实际应用中很难实现。
然而,Opt算法可以作为其他页面调度算法的性能参考。
4. Opt算法的实现Opt算法的实现步骤如下:4.1 收集页面访问模式数据为了实现Opt算法,需要预先知道应用程序的访问模式。
可以通过对应用程序的运行进行监测和分析,收集页面访问模式数据。
这些数据可以包括页面的访问频率、访问顺序等信息。
4.2 分析页面访问模式数据通过对页面访问模式数据的分析,可以得出页面的访问规律和趋势。
opt页面调度算法
opt页面调度算法opt页面调度算法是一种常用的页面置换算法,用于解决操作系统中的页面调度问题。
在操作系统中,内存被划分为若干个固定大小的页面,而进程的地址空间也被划分为若干个页面。
当进程需要访问一个页面时,如果该页面已经在内存中,则直接访问;如果该页面不在内存中,则需要将一个页面从内存中换出,然后将需要访问的页面换入内存。
opt页面调度算法的核心思想是根据未来的页面访问情况来进行页面置换。
具体来说,opt算法会预测未来一段时间内每个页面的访问情况,然后选择最长时间内不会被访问的页面进行置换。
这样可以最大程度地减少页面置换的次数,提高系统的性能。
在实际应用中,opt算法需要根据过去的页面访问历史来预测未来的访问情况。
一种常用的方法是通过分析程序的代码和数据结构来预测页面访问模式。
例如,如果一个程序在循环中反复访问同一个页面,那么该页面很可能会在未来的循环中继续被访问。
另外,还可以通过统计页面的访问频率来预测未来的访问情况。
如果一个页面在过去的一段时间内一直没有被访问过,那么它很可能在未来的一段时间内也不会被访问。
然而,opt算法也存在一些问题和局限性。
首先,opt算法需要准确地预测未来的页面访问情况,但是这是一个非常困难的任务。
即使是最先进的预测算法,也无法完全准确地预测未来的访问模式。
其次,opt算法需要维护一个页面访问历史记录,这会占用一定的内存空间。
对于内存有限的系统来说,这可能会导致内存不足的问题。
此外,opt 算法的实现也比较复杂,需要对页面访问历史进行分析和预测,增加了系统的开销。
尽管opt算法存在一些问题,但是在某些特定的场景下,它仍然是一种有效的页面调度算法。
例如,在一些需要高性能和低延迟的应用中,opt算法可以通过减少页面置换的次数来提高系统的响应速度。
此外,opt算法还可以与其他页面调度算法结合使用,以充分发挥各种算法的优势。
总之,opt页面调度算法是一种常用的页面置换算法,通过预测未来的页面访问情况来进行页面置换。
虚拟内存页面调度算法
虚拟内存页面调度算法虚拟内存页面调度算法是操作系统中的重要概念,它决定了虚拟内存中的页面如何被调度和管理,以提高系统的性能和效率。
在本文中,我们将深入探讨虚拟内存页面调度算法的原理、常见算法和应用。
一、引言在现代计算机系统中,由于主存容量有限,很难同时将所有进程的全部页面都保存在内存中。
因此,操作系统引入了虚拟内存的概念,将磁盘上的一部分空间用作辅助存储,以扩展主存的容量。
虚拟内存页面调度算法就是决定哪些页面应该保留在内存中,哪些应该从内存中换出到磁盘上。
二、虚拟内存页面调度算法的原理虚拟内存页面调度算法的目标是尽量减少页面访问的次数和换入换出的次数,以提高系统的性能。
在虚拟内存中,每个进程都有自己的虚拟地址空间,被划分成大小相等的页面。
当程序访问一个虚拟地址时,操作系统会检查该页面是否在内存中,如果不在,则会将页面从磁盘加载到内存中。
如果内存已满,则需要选择一个页面进行替换。
三、常见的虚拟内存页面调度算法1.先进先出(FIFO)算法:最简单的页面调度算法是先进先出算法,即将最早进入内存的页面替换出去。
这种算法的缺点是没有考虑页面的重要性和使用频率,容易导致局部性原理的违背。
2.最近最久未使用(LRU)算法:LRU算法是一种基于页面访问时间的调度算法,它假设最近被访问的页面将来会被再次访问。
因此,LRU算法选择最长时间没有被访问的页面进行替换。
这种算法比FIFO算法更符合局部性原理,但是实现起来需要维护一个页面访问历史的数据结构。
3.最不常用(LFU)算法:LFU算法是一种基于页面访问频率的调度算法,它选择访问频率最低的页面进行替换。
LFU算法适用于具有一定周期性访问模式的应用,但是在实现上需要维护每个页面的访问计数器。
4.时钟(Clock)算法:时钟算法基于一个时钟指针,它遍历内存页面,找到一个未被访问的页面进行替换。
如果指针指向的页面被访问过,则将其标记为未被访问,并继续遍历。
这种算法的优点是简单易实现,缺点是对于一些特殊访问模式的应用可能不够准确。
FIFO操作系统
心得体会
心得体会
此次实验作业的学习,不仅让我体会 到c#语言等此类基础知识的重要性,也让 我体会到团队合作的重要性,同时,最重 要的收获就是对FIFO页面置换算法有了更 直观深刻的认识和了解。在日后的学习中 我会记住此次实验的收获,并付诸于行动 !
实验内容
任务分析
在分页式虚拟存储系统中,当硬件发出“缺页中断”后, 引出操作系统来处理这个中断事件。如果主存中已经没有 空闲块,则可用FIFO页面调度算法把该作业中最先进入主 存的一页调出,存放到磁盘上,然后再把当前要访问的页 装入该块。
概要设计 详细设计
本程序中定义了一个数组int[] mainstore = {3,2,1,0 }; 用于模拟主存存放页; 此外还定义了一个数组 int[] flag = {0,0,0,0,0,0,0 }; 用于表明页号的修改标志位,便于之后的操作。
FIFO页面调度算法处理缺页中断
小组成员:方彬 、朱佳宝 、王 卫、凌含涛、胡星瑞
实验目的
实验内容
FO算法 ,并实现用先进先出FIFO算法页面调 度算法处理缺页中断.
(2)理解基于先进先出FIFO的内存 管理调度算法,更好的掌握算法的思 想,结合实验理解算法更直观,深刻 具体。通过对先进先出FIFO的调度算 法的模拟实验可以清楚的了解内存管 理是如何调度的,以及加深对内存管 理的了解。
这里就不赘述,详细情况见实验报告
调试分析
问题分析
一开始的程序只能输入9个页 号序列,超过之后就不能够再显 示新的页号序列;
考虑到程序的用户友好性, 增加了序列刷新功能,刷新输出 区域; 开始没有理解修改标志位的 作用,所以功能没有实现;
分析小结
本次实验是通过模拟FIFO(先进先出)调度 算法处理缺页中断,主要思想是先把进程调入页面 ,按次序链接成一个队列,并设置指针一直指向相 对最先进入主存的页面。然后将该页面调出,调入 输入的页面。通过对先进先出FIFO算法的模拟实 现,我加深了对内存管理调度的理解,理解了其如 何调度分配内存的过程。实验通过c#语言编写完成 。因为c#语言是以前没学过的,现在用起来比较生 疏,所以在实验的过程中出现了许多错误。面对这 些问题,我们小组成员通过查阅资料、询问同学等 方式解决各个问题,最终我们编写出了正确的 FIFO页面置换算法的模拟程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define null 0#define len sizeof(struct page)struct page{int num;int tag;struct page *next;};struct page *creat(int n){int count=1;struct page *p1,*p2,*head;head=p2=p1=(struct page *)malloc(len);p1->tag=-1;p1->num=-1;while(count<n){count++;p1=(struct page *)malloc(len);p1->tag=-1;p1->num=-1;p2->next=p1;p2=p1;}p2->next=null;return(head);}void FIFO(int array[],int n){int *p;int count=0;struct page *cp,*dp,*head,*newp;head=creat(n);p=array;while(*p!=-1){cp=dp=head;for(;cp->num!=*p&&cp->next!=NULL;)cp=cp->next;if(cp->num==*p) printf(" ! ");else{count++;cp=head;for(;cp->tag!=-1&&cp->next!=NULL;)cp=cp->next;if(cp->tag==-1){cp->num=*p;cp->tag=0;printf(" * ");}else{newp=(struct page*)malloc(len);newp->num=*p;newp->tag=0;newp->next=null;cp->next=newp;head=head->next;printf(" %d ",dp->num);free(dp);}}p++;}printf("\nQueye Zongshu:%d\n",count);}void LRU(int array[],int n){int count=0,*p=array;struct page *head,*cp,*dp,*rp,*newp,*endp;head=creat(n);while(*p!=-1){cp=dp=rp=endp=head;//for(;endp->next!=NULL;) endp=endp->next;//for(;cp->num!=*p&&cp->next!=NULL;){rp=cp;cp->next;}if(cp->num==*p){printf(" ! ");if(cp->next!=null){if(cp!=head)rp->next=cp->next;else head=head->next;}endp->next=cp;cp->next=null;}else{count++;cp=rp=head;//for(;cp->tag!=-1&&cp->next!=null;)cp=cp->next;if(cp->tag==-1){printf(" * ");cp->num=*p;cp->tag=0;}else{newp=(struct page *)malloc(len);newp->num=*p;newp->tag=0;newp->next=null;cp->next=newp;dp=head;head=head->next;printf(" %d ",dp->num);free(dp);}}p++;}printf("\nQueye zongshu : %d \n",count);}void OPT(int array[],int n){int *p,*q,count=0,i;struct page *head,*cp,*dp,*newp;p=array;head=creat(n);while(*p!=-1){cp=head;//for(;cp->num!=*p&&cp->next!=null;)cp=cp->next;if(cp->num!=*p){count++;cp=head;//for(;cp->tag!=-1&&cp->next!=null;)cp=cp->next;if(cp->tag==-1){printf("*");cp->num=*p;cp->tag=0;}else{i=1;q=p;q++;cp=head;while(*q!=-1&&i<n){//for(;*q!=cp->num&&cp->next!=null;)cp=cp->next;if(*q==cp->num){cp->tag=1;i++;}q++;cp=head;}if(i==n){//for(;cp->tag!=0;)cp=cp->next;printf("%d",cp->num);cp->num=*p;}else{cp=head;//for(;cp->tag!=0;) cp=cp->next;if(cp==head){newp=(struct page *)malloc(len);newp->num=*p;newp->tag=0;newp->next=null;cp->next=newp;dp=head;head=head->next;printf("%d",dp->num);free(dp);}else{printf("%d",dp->num);cp->num=*p;}}cp=head;//for(;cp->next!=null;){cp->tag=0;cp=cp->next;}cp->tag=0;}}else printf("!");p++;}printf("\nQueye Zongshu:%d\n",count);}void main(){FILE *fp;char pt;char str[10];int i,j=0;int page[50],space=0;for(i=0;i<50;i++)page[i]=-1;fp=fopen("page.txt","r+");if(fp==NULL){printf("Can not open the file\n");exit(0);}i=0;while((pt=fgetc(fp))!=EOF){if(pt>='0'&&pt<='9'){str[i]=pt;i++;space=0;}else{if(pt==' '||pt=='\n'){if(space==1) break;else{str[i]='\0';page[j]=atoi(str);if(pt=='\n') break;else{space=1;j++;i=0;}}}}}if(pt==EOF){str[i]='\0';page[j]=atoi(str);}i=0;while(page[i]!=-1){printf(" %d ",page[i],i++);}fclose(fp);printf("\n !: mean no moved \n *: mean have free space \n\n");printf("FIFO ");FIFO(page,3);printf("\nLRU ");LRU(page,3);printf("\nOPT ");OPT(page,3);}。