模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断
【摘】综合题-大题
第二章进程管理1、四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。
但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。
为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:(1)如何定义信号量及初值;(2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作:进程A 进程B 进程C 进程D… … … …[1];[3];[5];[7];read F;read F;read F;read F;[2];[4];[6];[8];… … … …解:(1)定义二个信号量S1、S2,初值均为1,即:S1=1,S2=1(共2分)(2)从[1]到[8]分别为:P(S1),V(S1),P(S2),V(S2),P(S1) ,V(S1) ,P(S2) ,V(S2)2、设有一台计算机,有两条I/O通道,分别接一台卡片输入机和一台打印机。
卡片机把一叠卡片逐一输入到缓冲区B1中,加工处理后再搬到缓冲区B2中,并在打印机上打印,问:①系统要设几个进程来完成这个任务?各自的工作是什么?②这些进程间有什么样的相互制约关系?③用P、V操作写出这些进程的同步算法。
解:①系统可设三个进程来完成这个任务:R进程负责从卡片输入机上读入卡片信息,输入到缓冲区B1中;C进程负责从缓冲区B1中取出信息,进行加工处理,之后将结果送到缓冲区B2中;P进程负责从缓冲区B2中取出信息,并在打印机上印出。
②R进程受C进程影响,B1放满信息后R进程要等待——等C进程将其中信息全部取走,才能继续读入信息;C进程受R进程和P进程的约束:B1中信息放满后C进程才可从中取出它们,且B2被取空后C进程才可将加工结果送入其中;P进程受C进程的约束:B2中信息放满后P进程才可从中取出它们,进行打印。
③信号量含义及初值:B1full——缓冲区B1满,初值为0;B1empty——缓冲区B1空,初值为0;B2full——缓冲区B2满,初值为0;B2empty——缓冲区B2空,初值为0;R 进程 C 进程 P 进程3、某分时系统的进程出现如下图所示的状态变化。
实验四页式虚拟存储管理中地址转换和页式中断FIFOLRUOPTC++版本
实验四页式虚拟存储管理中地址转换和页式中断FIFO一、实验目的深入了解页式存储管理如何实现地址转换;进一步认识页式虚拟存储管理中如何处理缺页中断以及页面置换算法。
二、实验主要内容编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。
实验具体内容包括:首先对给定的地址进行转换工作,若发现缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
假定主存64KB,每个主存块1024字节,作业最大支持到64KB,系统中每个作业分得主存块4块。
三、实验原理1)地址转换过程:首先从逻辑地址中的高位取得页号,然后根据页号查页表,得到块号;然后从逻辑地址中的低位取得页内地址,将块号和页内地址合并即得到物理地址。
2)缺页中断处理根据页号查找页表,判断该页是否在主存储器中,若该页标志位“0”,形成缺页中断。
操作系统让调出中断处理程序处理中断。
四、实验方法与步骤实现地址转换与缺页中断处理,主要考虑三个问题:第一,设计页式虚拟存储管理方式中页表的数据结构;第二,地址转换算法的实现;第三,缺页中断处理算法的实现。
1)设计页表的数据结构页式虚拟存储管理方式中页表除了页号和该页对应的主存块号外,至少还要包括存在标志(该页是否在主存),磁盘位置(该页的副本在磁盘上的位置)和修改标志(该页是否修改过)。
在实验中页表用数组模拟,其数据结构定义如下:struct{int lnumber; //页号int flag; //表示页是否在主存中,“1”表示在,“0”表示不在int pnumber; // 该页所在主存块的块号int write; //该页是否被修改过,“1”表示修改过,“0“表示没有修改过int dnumber; //该页存放在磁盘上的位置,即磁盘块号}page[n]; //页表定义2)地址转换算法的实现地址转换是由硬件完成的,实验中使用软件程序模拟地址转换过程。
在实验中,每个主存块1024字节,则块内地址占10位;主存64KB,则主存共64块,即块号占6位;物理地址共占16位;作业最大64KB,则作业最大占64块,即页号占6位,逻辑地址共占16位。
页式虚拟存储管理FIFO、LRU和OPT页面置换算法
目录1 需求分析 (2)1.1 目的和要求 (2)1.2 研究内容 (2)2 概要设计 (2)2.1 FIFO算法 (3)2.2 LRU算法 (3)2.3 OPT算法 (3)2.4 输入新的页面引用串 (3)3 详细设计 (4)3.1 FIFO(先进先出)页面置换算法: (4)3.2 LRU(最近最久未使用)置换算法: (4)3.3 OPT(最优页)置换算法 (4)4 测试 (5)5 运行结果 (5)6 课程设计总结 (9)7 参考文献 (10)8 附录:源程序清单 (10)1 需求分析1.1 目的和要求在熟练掌握计算机虚拟存储技术的原理的基础上,利用一种程序设计语言模拟实现几种置换算法,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。
1.2 研究内容模拟实现页式虚拟存储管理的三种页面置换算法(FIFO(先进先出)、LRU (最近最久未使用)和OPT(最长时间不使用)),并通过比较性能得出结论。
前提:(1)页面分配采用固定分配局部置换。
(2)作业的页面走向和分得的物理块数预先指定。
可以从键盘输入也可以从文件读入。
(3)置换算法的置换过程输出可以在显示器上也可以存放在文件中,但必须清晰可读,便于检验。
2 概要设计本程序主要划分为4个功能模块,分别是应用FIFO算法、应用LRU算法、应用OPT算法和页面引用串的插入。
1.1各模块之间的结构图2.1 FIFO 算法该模块的主要功能是对相应页面引用串进行处理,输出经过FIFO 算法处理之后的结果。
2.2 LRU 算法该模块的主要功功能是对相应的页面引用串进行处理,输出经过LRU 算法处理之后的结果。
2.3 OPT 算法该模块的主要功功能是对相应的页面引用串进行处理,输出经过OPT 算法处理之后的结果。
2.4 输入新的页面引用串该模块的主要功能是用户自己输入新的页面引用串,系统默认的字符串是0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,用户可以自定义全新的20个数字页面引用串。
模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断
实验报告课程名称操作系统原理实验名称虚拟页式管理姓名学号专业班级网络实验日期成绩指导教师赵安科(①实验目的②实验原理③主要仪器设备④实验内容与步骤⑤实验数据记录与处理⑥实验结果与分析⑦问题建议)实验二模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断1.内容:模拟请求页式存储管理中硬件的地址转换和缺页中断处理2.思想:装入新页置换旧页时,若旧页在执行中没有被修改过,则不必将该页重写磁盘。
因此,页表中增加是否修改过的标志,执行“存”指令和“写”指令时将对应的修改标志置成“1”3.要求及方法:①设计一个地址转换程序来模拟硬件的地址转换和缺页中断。
当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可以输出转换后的绝对地址来表示一条指令已执行完成。
当访问的页不在主存中时,则输出“*页号”来表示硬件产生了一次缺页中断。
模拟地址转换流程见图1。
②编制一个FIFO页面调度程序;FIFO页面调度算法总是先调出作业中最先进入主存中的哪一页。
因此可以用一个数组来表示(或构成)页号队列。
数组中每个元素是该作业已在主存中的页面号,假定分配给作业的页架数为m,且该作业开始的m页已装入主存,则数组可由m个元素构成。
P[0],P[1],P[2],…,P[m-1]它们的初值为P[0]:=0,P[1]:=1,P[2]:=2,…,P[m-1]:=m-1用一指针K指示当要调入新页时应调出的页在数组中的位置,K的初值为“0”,当产生缺页中断后,操作系统总是选择P[K]所指出的页面调出,然后执行:P[K]:=要装入的新页页号 K :=(k+1)mod m在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT 调出的页号”和“IN 要装入的新页页号”来模拟一次调出和装入过程,模拟程序的流程图见附图1。
按流程控制过程如下:提示:输入指令的页号和页内偏移和是否存指令⎩⎨⎧0 1非存指令存指令,若d 为-1则结束,否则进入流程控制过程,得P 1和d ,查表在主存时,绝对地址=P 1×1024+d③ 假定主存中页架大小为1024个字节,现有一个共7页的作业,其副本已在磁盘上。
国开电大操作系统形考作业1-3答案
国开电大操作系统形考作业1-3答案形考作业一题目随机,请使用Ctrl+F组合键查找题目题目:按照所起的作用和需要的运行环境,操作系统属于()。
答案:系统软件题目:UNIX操作系统核心层的实现结构设计采用的是()。
答案:层次结构题目:UNIX命令的一般格式是()。
答案:命令名[选项][参数]题目:操作系统的基本职能是()答案:控制和管理系统内各种资源,有效地组织多道程序的运行题目:操作系统对缓冲区的管理属于()的功能。
答案:设备管理题目:操作系统内核与用户程序、应用程序之间的接口是()。
答案:系统调用题目:工业过程控制系统中运行的操作系统最好是()。
答案:实时系统题目:进程从运行状态变为阻塞状态的原因是()。
答案:输入或输出事件发生题目:进程控制块是描述进程状态和特性的数据结构,一个进程(答案:只能有唯一的进程控制块题目:进程与程序之间有密切联系,但又是不同的概念。
答案:程序是静态概念,进程是动态概念题目:两个进程合作完成一个任务,在并发执行中,一个进程要等待其合作伙伴发来信息,或者建立某个条件后再向前执行,这种关系是进程间的()关系。
答案:同步问题:两个进程争取统一个资源()。
答案:不一定死锁问题:某进程由于需求从磁盘上读入数据而处于阻塞状态。
答案:从阻塞变成就绪问题:批处置惩罚系统的主要缺点是()。
答案:失去了交互性题目:如果信号量S的值是0 ,此时进程A执行P(S)操作,那么,进程A会()。
答案:进入阻塞态,让出CPU 题目:若P、V操作的信号量S初值为2,当前值为-1,则表示有()个等待进程。
答案:1题目:实时操作系统追求的目标是()。
答案:快速响应问题:死锁的四个必要条件中,没法破坏的是()。
答案:互斥条件题目:为了描述进程的动态变化过程,采用了一个与进程相联系的(),根据它而感知进程的存在。
答案:进程控制块题目:为了使系统中所有的用户都能得到及时的响应,该操作系统应该是()。
答案:分时系统题目:为用户分配主存空间,保护主存中的程序和数据不被破坏,提高主存空间的利用率。
操作系统第三章练习题与答案
第三章一、填空1.将作业相对地址空间的相对地址转换成内存中的绝对地址的过程称为地址重定位。
2.使用覆盖与对换技术的主要目的是提高内存的利用率。
3.存储管理中,对存储空间的浪费是以内部碎片和外部碎片两种形式表现出来的。
4.地址重定位可分为静态重定位和动态重定位两种。
5.在可变分区存储管理中采用最佳适应算法时,最好按尺寸法来组织空闲分区链表。
6.在分页式存储管理的页表里,主要应该包含页号和块号两个信息。
7.静态重定位在程序装入时进行,动态重定位在程序执行时进行。
8.在分页式存储管理中,如果页面置换算法选择不当,则会使系统出现抖动现象。
9.在请求分页式存储管理中采用先进先出(FIFO)页面淘汰算法时,增加分配给作业的块数时,缺页中断的次数有可能会增加。
10.在请求分页式存储管理中,页面淘汰是由于缺页引起的。
二、选择1.虚拟存储器的最大容量是由 A 决定的。
A.内、外存容量之和 B.计算机系统的地址结构C.作业的相对地址空间 D.作业的绝对地址空间2.采用先进先出页面淘汰算法的系统中,一进程在内存占3块(开始为空),页面访问序列为1、2、3、4、1、2、5、1、2、3、4、5、6。
运行时会产生 D 次缺页中断。
A.7 B.8 C.9 D.10从图3-8中的“缺页计数”栏里可以看出应该选择D。
图3-8 选择题2配图3.系统出现“抖动”现象的主要原因是由于 A 引起的。
A.置换算法选择不当 B.交换的信息量太大C.内存容量不足 D.采用页式存储管理策略4.实现虚拟存储器的目的是 D 。
A.进行存储保护 B.允许程序浮动C.允许程序移动 D.扩充主存容量5.作业在执行中发生了缺页中断,那么经中断处理后,应返回执行 B 指令。
A.被中断的前一条 B.被中断的那条C.被中断的后一条 D.程序第一条6.在实行分页式存储管理系统中,分页是由 D 完成的。
A.程序员B.用户C.操作员D.系统7.下面的 A 页面淘汰算法有时会产生异常现象。
作业二(存储管理)
作业二姓名学号班级一、单项选择题1.在存储管理方案中,D可与覆盖技术配合。
A.页式管理B.段式管理C.段页式管理D.可变分区管理2.在存储管理中,采用覆盖与交换技术的目的是A。
A.节省主存空间B.物理上扩充主存容量C.提高CPU效率D.实现主存共享3.动态重定位技术依赖于B。
A.重定位装入程序B.重定位寄存器C.地址机构D.目标程序4.虚拟存储器的最大容量B。
A.为内外存容量之和B.由计算机的地址结构决C.是任意的D.由作业的地址空间决定5.在虚拟存储系统中,若进程在内存中占3块(开始时为空),采用先进先出的页面淘汰算法,当执行访问页号序列为1、2、3、4、1、2、5、1、2、3、4、5、6时,将产生D次缺页中断。
A.7 B.8 C.9 D.106.在存储管理中很好地解决了“零头”问题的存储管理方法是D。
A.页式存储管理B.段式存储管理C.多重分区管理D.可变式分区管理7.系统“抖动”现象的发生是由A引起的。
A.置换算法选择不当B.交换的信息量过大C.内存容量不足D.请求页式管理方案8.在可变分区存储管理中使用拼接技术可以 A 。
A.集中空闲区B.增加主存容量C.缩短访问周期D.加速地址转换9.分区管理中采用“最佳适应”分配算法时,适合把空闲区按A次序登记在空闲区表中。
A.长度递增B.长度递减C.地址递增D.地址递减10.在固定分区分配中,每个分区的大小是A。
A.相同B.随作业长度变化C .可以不同但预先固定D .可以不同但根据作业长度固定11.设内存的分配情况如图5.7所示。
若要申请一块40K 字节的内存空间,若采用最佳 适应算法,则所得到的分区首址为 C 。
A 、100KB 、190K C 、330K D 、410K图5.7 内存分配情况12.实现虚拟存储器的目的是 D 。
A .实现存储保护 B .实现程序浮动 C .扩充辅存容量 D .扩充主存容量13.采用段式存储管理的系统中,若地址用24位表示,其中8位表示段号,则允许每段的最大长度是 B 。
操作系统——模拟页面置换算法(FIFO——先入先出、LRU——最近最少使用、LFU——最近。。。
操作系统——模拟页⾯置换算法(FIFO——先⼊先出、LRU——最近最少使⽤、LFU——最近。
操作系统——模拟页⾯置换算法(FIFO——先⼊先出、LRU——最近最少使⽤、LFU——最近最不常使⽤),计算置换率(包含程序框图)导语:1. FIFO页⾯置换算法:最简单的页⾯置换算法。
这种算法的基本思想是:当需要淘汰⼀个页⾯时,总是选择驻留主存时间最长的页⾯进⾏淘汰,即先进⼊主存的页⾯先淘汰。
(看时间)2. LRU页⾯置换算法:最近最少使⽤,简单来说就是将数据块中,每次使⽤过的数据放在数据块的最前端,然后将存在的时间最长的,也就是数据块的末端的数据置换掉。
(看时间)3. LFU页⾯置换算法:近期最少使⽤算法,选择近期最少访问的页⾯作为被替换的页⾯,如果⼀个数据在最近⼀段时间内使⽤次数很少,那么在将来⼀段时间内被使⽤的可能性也很⼩。
(看次数)4. 置换率与与缺页率不同。
置换率⽤置换次数算,缺页率⽤缺页中断次数算。
FIFO页⾯置换算法:Linux效果图(采⽤UOS + VScode + g++)程序框图C++代码(FIFO):#include<iostream>using namespace std;static int mnum;//物理块数static int pnum;//页⾯⾛向static int count=0;//页⾯置换次数static int *analogblock;//模拟物理块static int *block;//物理块static int *process;//随机页⾯访问序列int judge(int a[],int n,int x) //判断数组中是否已有x,若有返回其下标值,没有则返回-1 {int i;for (i=0;i<n;i++)if(x==a[i])return i;return -1;}void replace(int y,int mnum,int x)//⽤于物理块页⾯置换,y是⽤来置换的页⾯,x是被置换的页⾯ {int i;for (i=0;i<mnum;i++)if(x==block[i])block[i]=y;}int main() {int i;int maxanalogblock=-1;//模仿队列的定义int x;cout<<"请输⼊页框⼤⼩物理块数:\n";cin>>mnum;if(mnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}cout<<"⾃动⽣成的内存块需求序列个数:\n";cin>>pnum;if(pnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}analogblock=new int[mnum];block=new int[mnum];process=new int[pnum];for (i=0;i<mnum;i++) analogblock[i]=-1;for (i=0;i<mnum;i++) block[i]=-1;///////////////////////随机产⽣页⾯⾛向序列cout<<"产⽣随机序列如下:\n";srand( (unsigned)time( NULL ) );//以time函数值(即当前时间)作为种⼦数,保证两次产⽣序列的随机性for (i=0; i<pnum; i++) {process[i] = rand()%10;cout<<process[i]<<" ";}cout<<endl;//////////////////////cout<<"先进先出(FIFO)页⾯置换算法,结果: \n\n";//////////////////////for (x=0;x<pnum;x++) //⾃动读数 {//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i]!=-1)cout<<analogblock[i]<<" ";}//////////////////////////maxanalogblock++;//读数后maxanalogblock⾃动+1if(maxanalogblock<mnum) //若在物理块范围内 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {analogblock[maxanalogblock]=process[x];//新元素从尾部插⼊block[maxanalogblock]=process[x];//新元素从尾部插⼊cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断调⼊页⾯"<<process[x]<<endl;} else //若数组中存在待插⼊元素 {maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在直接访问"<<endl;}} else //超过物理块数的元素 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {//队列法插⼊(尾部元素出,新元素从头部⼊)cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断页⾯"<<process[x]<<"置换出页⾯"<<analogblock[0]<<endl; replace(process[x],mnum,analogblock[0]);//置换物理块中页⾯for (i=0;i<mnum-1;i++)LRU 页⾯置换算法:Linux 效果图(采⽤UOS + VScode + g++)程序框图C++代码(LRU): analogblock[i]=analogblock[i+1];analogblock[mnum-1]=process[x];//////////////////maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值count++;} else //若数组中存在待插⼊元素 {maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在 直接访问"<<endl;}}}//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1) cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i]!=-1)cout<<analogblock[i]<<" ";}cout<<endl<<"页⾯换算次数为:"<<count<<endl;cout<<"置换率为:"<<(float)count/pnum<<endl;return 0;}//g++ test71.cpp -o test71 -lpthread&&./test71#include<iostream>using namespace std;static int mnum;//物理块数static int pnum;//页⾯⾛向static int count=0;//页⾯置换次数static int *analogblock;//模拟物理块static int *block;//物理块static int *process;//随机页⾯访问序列int judge(int a[],int n,int x) //判断数组中是否已有x ,若有返回其下标值,没有则返回-1 {int i;for (i=0;i<n;i++)if(x==a[i])return i;return -1;}void replace(int y,int mnum,int x)//⽤于物理块页⾯置换,y是⽤来置换的页⾯,x是被置换的页⾯ { int i;for (i=0;i<mnum;i++)if(x==block[i])block[i]=y;}void move(int a[],int n,int i) //移动下标为i的元素到尾部 {int j;int m=a[i];for (j=i;j<n-1;j++)a[j]=a[j+1];a[n-1]=m;}int main() {int i;int maxanalogblock=-1;//模仿栈的定义int x;cout<<"请输⼊页框⼤⼩物理块数:\n";cin>>mnum;if(mnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}cout<<"⾃动⽣成的内存块需求序列个数:\n";cin>>pnum;if(pnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}analogblock=new int[mnum];block=new int[mnum];process=new int[pnum];for (i=0;i<mnum;i++) analogblock[i]=-1;///////////////////////随机产⽣页⾯⾛向序列cout<<"产⽣随机序列如下:\n";srand( (unsigned)time( NULL ) );//以time函数值(即当前时间)作为种⼦数,保证两次产⽣序列的随机性for (i=0; i<pnum; i++) {process[i] = rand()%10;cout<<process[i]<<" ";}cout<<endl;//////////////////////cout<<"最近最少使⽤(LRU)页⾯置换算法,结果: \n\n";//////////////////////for (x=0;x<pnum;x++) //⾃动读数 {//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i]!=-1)cout<<analogblock[i]<<" ";}//////////////////////////maxanalogblock++;//读数后maxanalogblock⾃动+1LFU 页⾯置换算法:Linux 效果图(采⽤UOS + VScode + g++)程序框图 if(maxanalogblock<mnum) //若在物理块范围内 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {analogblock[maxanalogblock]=process[x];//新元素从尾部插⼊block[maxanalogblock]=process[x];//新元素从尾部插⼊cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断 调⼊页⾯"<<process[x]<<endl;} else //若数组中存在待插⼊元素 {move(analogblock,maxanalogblock,judge(analogblock,mnum,process[x]));//移动下标为i 的元素到尾部maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在 直接访问"<<endl;}} else //超过物理块数的元素 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {//栈法插⼊(第⼀个元素出,后⾯元素前移,新元素从尾部⼊)cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断 页⾯"<<process[x]<<"置换出页⾯"<<analogblock[0]<<endl; replace(process[x],mnum,analogblock[0]);//物理块中页⾯置换for (i=0;i<mnum-1;i++)analogblock[i]=analogblock[i+1];analogblock[mnum-1]=process[x];//////////////////maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值count++;} else //若数组中存在待插⼊元素 {move(analogblock,mnum,judge(analogblock,mnum,process[x]));//移动下标为i 的元素到尾部maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock 值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在 直接访问"<<endl;}}}//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i]!=-1)cout<<analogblock[i]<<" ";}cout<<endl<<"页⾯换算次数为:"<<count<<endl;cout<<"置换率为:"<<(float)count/pnum<<endl;return 0;}//g++ test72.cpp -o test72 -lpthread&&./test72C++代码(LFU):#include<iostream>using namespace std;static int mnum;//物理块数static int pnum;//页⾯⾛向static int count=0;//页⾯置换次数static int **analogblock;//模拟物理块static int *block;//物理块static int *process;//随机页⾯访问序列int judge(int *a[],int n,int x) //判断数组中是否已有x,若有返回其下标值,没有则返回-1 {int i;for (i=0;i<n;i++)if(x==a[i][0])return i;return -1;}void replace(int y,int mnum,int x)//⽤于物理块页⾯置换,y是⽤来置换的页⾯,x是被置换的页⾯ { int i;for (i=0;i<mnum;i++)if(x==block[i])block[i]=y;}void move(int *a[],int n,int i) //移动下标为i的元素,⽐较访问次数次多少进⾏前进 {int j;int m=a[i][0];int m2=a[i][1];for (j=i;j<n-1;j++) {if(m2>=a[j+1][1]) {a[j][0]=a[j+1][0];a[j][1]=a[j+1][1];a[j+1][0]=m;a[j+1][1]=m2;}}}int main() {int i;int maxanalogblock=-1;//模仿栈的定义int x;//动态数组初始化cout<<"请输⼊页框⼤⼩物理块数:\n";cin>>mnum;if(mnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}cout<<"⾃动⽣成的内存块需求序列个数:\n";cin>>pnum;if(pnum>999999) {cout<<"输⼊超出控制⼤⼩!"<<endl;return 0;}analogblock=(int**) (new int[mnum]);block=new int[mnum];process=new int[pnum];for (i=0;i<mnum;i++) analogblock[i]=(int*) new int[2];//⽤于保存页⾯号和访问次数for (i = 0; i < mnum; i++) {analogblock[i][0]=-1;analogblock[i][1]=0;}///////////////////////随机产⽣页⾯⾛向序列cout<<"产⽣随机序列如下:\n";srand( (unsigned)time( NULL ) );//以time函数值(即当前时间)作为种⼦数,保证两次产⽣序列的随机性for (i=0; i<pnum; i++) {process[i] = rand()%10;cout<<process[i]<<" ";}cout<<endl;//////////////////////cout<<"最近最不常使⽤(LFU)页⾯置换算法,结果: \n\n";//////////////////////for (x=0;x<pnum;x++) //⾃动读数 {//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i][0]!=-1)cout<<analogblock[i][0]<<" ";//<<"访问次数"<<analogblock[i][1]<<" "}//////////////////////////maxanalogblock++;//读数后maxanalogblock⾃动+1if(maxanalogblock<mnum) //若在物理块范围内 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {analogblock[0][0]=process[x];//新元素从头部插⼊analogblock[0][1]=1;block[maxanalogblock]=process[x];//新元素从尾部插⼊move(analogblock,mnum,0);//移动下标为i的元素到相同访问次数页⾯的顶部cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断调⼊页⾯"<<process[x]<<endl;} else //若数组中存在待插⼊元素 {// move(analogblock,maxanalogblock,judge(analogblock,mnum,process[x]));//移动下标为i的元素到尾部analogblock[judge(analogblock,mnum,process[x])][1]++;move(analogblock,mnum,judge(analogblock,mnum,process[x]));//移动下标为i的元素到相同访问次数页⾯的顶部maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在直接访问"<<endl;}} else //超过物理块数的元素 {if(judge(analogblock,mnum,process[x])==-1)//若数组中不存在待插⼊元素 {//栈法插⼊(新元素从头部⼊,替换掉头部)cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 缺页中断页⾯"<<process[x]<<"置换出页⾯"<<analogblock[0][0]<<endl; replace(process[x],mnum,analogblock[0][0]);//物理块中页⾯置换analogblock[0][0]=process[x];analogblock[0][1]=1;move(analogblock,mnum,0);//移动下标为i的元素相同访问次数页⾯的顶部//////////////////maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock值count++;} else //若数组中存在待插⼊元素 {analogblock[judge(analogblock,mnum,process[x])][1]++;move(analogblock,mnum,judge(analogblock,mnum,process[x]));//移动下标为i的元素到相同访问次数页⾯的顶部maxanalogblock--;//因为没有插⼊新元素,回滚maxanalogblock值cout<<" 第"<<x+1<<"次访问,页⾯"<<process[x]<<" 已存在直接访问"<<endl; }}}//读⼀个序列号,输出当前数组元素cout<<"真实物理块情况:";for (i=0;i<mnum;i++) {if(block[i]!=-1)cout<<block[i]<<" ";}cout<<"模拟物理块情况:";for (i=0;i<mnum;i++) {if(analogblock[i][0]!=-1)cout<<analogblock[i][0]<<" ";}cout<<endl<<"页⾯换算次数为:"<<count<<endl;cout<<"置换率为:"<<(float)count/pnum<<endl;return 0;}//g++ test73.cpp -o test73 -lpthread&&./test73。
请求页式虚拟存储管理(FIFO算法)
{
//内存有空闲
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);
{
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算法
cout<<endl;
cout<<page_table[j].no<<''<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl;
操作系统第五章习题
操作系统第五章习题第五章⼀、填空1.将作业相对地址空间的相对地址转换成内存中的绝对地址的过程称为地址重定。
2.使⽤覆盖与对换技术的主要⽬的是(扩充内存)。
3.地址重定位可分为(静态地址重定位)和(动态地址重定位)两种。
4.在分页式存储管理的页表⾥,主要应该包含(页号)和(页⾯号)两个信息。
5.静态重定位在程序(装⼊内存)时进⾏,动态重定位在程序(执⾏)时进⾏。
6.在分页式存储管理中,如果页⾯置换算法选择不当,则会使系统出现(抖动)现象。
7.在请求分页式存储管理中采⽤先进先出(FIFO )页⾯淘汰算法时,增加分配给作业的块数时,(缺页中断)的次数有可能会增加。
8.在请求分页式存储管理中,页⾯淘汰是由于()引起的,页⾯的置换算法常⽤的是()和()。
9.分区管理中采⽤“⾸次适应算法”时,应将空闲区按(地址递增)次序登记在空闲区表中。
10、内存信息保护⽅法有、、。
11、段页式存储管理中,作业的地址空间是维的。
⼆、选择1.虚拟存储器的最⼤容量是由 B 决定的。
A .内、外存容量之和B .计算机系统的地址结构C .作业的相对地址空间D .作业的绝对地址空间2.采⽤先进先出页⾯淘汰算法的系统中,⼀进程在内存占3块(开始为空),页⾯访问序列为1、2、3、4、1、2、5、1、2、3、4、5、6。
运⾏时会产⽣次缺页中断。
A .7B .8C .9D 101 2 3 4 1 2 5 1 2 3 4 5 6页⾯⾛向→ 3个内存块→缺页计数→3.系统出现“抖动”现象的主要原因是由于引起的。
A 置换算法选择不当B .交换的信息量太⼤C .内存容量不⾜D .采⽤页式存储管理策略4.实现虚拟存储器的⽬的是。
A .进⾏存储保护B .允许程序浮动C .允许程序移动D 扩充主存容量5.在实⾏分页式存储管理系统中,分页是由完成的。
A .程序员B .⽤户C .操作员D 系统6.采⽤静态重定位⽅式装⼊的作业,在作业执⾏过程中()进⾏地址转换。
操作系统第三章练习题与答案
第三章一、填空1.将作业相对地址空间的相对地址转换成内存中的绝对地址的过程称为地址重定位。
2.使用覆盖与对换技术的主要目的是提高内存的利用率。
3.存储管理中,对存储空间的浪费是以内部碎片和外部碎片两种形式表现出来的。
4.地址重定位可分为静态重定位和动态重定位两种。
5.在可变分区存储管理中采用最佳适应算法时,最好按尺寸法来组织空闲分区链表。
6.在分页式存储管理的页表里,主要应该包含页号和块号两个信息。
7.静态重定位在程序装入时进行,动态重定位在程序执行时进行。
8.在分页式存储管理中,如果页面置换算法选择不当,则会使系统出现抖动现象。
9.在请求分页式存储管理中采用先进先出(FIFO)页面淘汰算法时,增加分配给作业的块数时,缺页中断的次数有可能会增加。
10.在请求分页式存储管理中,页面淘汰是由于缺页引起的。
二、选择1.虚拟存储器的最大容量是由 A 决定的。
A.内、外存容量之和 B.计算机系统的地址结构C.作业的相对地址空间 D.作业的绝对地址空间2.采用先进先出页面淘汰算法的系统中,一进程在内存占3块(开始为空),页面访问序列为1、2、3、4、1、2、5、1、2、3、4、5、6。
运行时会产生 D 次缺页中断。
A.7 B.8 C.9 D.10从图3-8中的“缺页计数”栏里可以看出应该选择D。
图3-8 选择题2配图3.系统出现“抖动”现象的主要原因是由于 A 引起的。
A.置换算法选择不当 B.交换的信息量太大C.内存容量不足 D.采用页式存储管理策略4.实现虚拟存储器的目的是 D 。
A.进行存储保护 B.允许程序浮动C.允许程序移动 D.扩充主存容量5.作业在执行中发生了缺页中断,那么经中断处理后,应返回执行 B 指令。
A.被中断的前一条 B.被中断的那条C.被中断的后一条 D.程序第一条6.在实行分页式存储管理系统中,分页是由 D 完成的。
A.程序员B.用户C.操作员D.系统7.下面的 A 页面淘汰算法有时会产生异常现象。
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断--选择页面调度算法处理缺页中断
操作系统实验二〔第一题〕一.实验内容模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。
二.实验目的在电脑系统总,为了提高主存利用率,往往把辅助存储器作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间综合可以超出主存的绝对地址空间。
用这种方法扩充的主存储区成为虚拟存储器。
三.实验题目模拟分页式存储管理中硬件的地址转换和产生缺页中断。
四.程序清单//// 操作实验二.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include<iostream>#include<string>#include<fstream>using namespace std;class ins{private:string ope;long int page;long int unit;public:ins(){ }ins(string o,long int p,long int u):ope(o),page(p),unit(u){}void setope(string o){ ope=o;}void setpage(long int p){ page=p;}void setunit(long int u){ unit=u;}string getope(){return ope;}long int getpage(){return page;}long int getunit(){return unit;}};class work{private:long int Page;int sym;long int inum;long int onum;public:work(){}work(long int P, int s,long int i,long int o):Page(P),sym(s),inum(i),onum(o){} void setPage(long int P){ Page=P;}void setsym( int s){ sym=s;}void setinum(long int i){ inum=i;}void setonum(long int o){ onum=o;}long int getPage(){return Page;}int getsym(){return sym;}long int getinum(){return inum;}long int getonum(){return onum;}};void diaodu(work *w,ins * i,int numofins){ for(int j=0;j<numofins;j++){long int tempofk;long int a =i[j].getpage();for(int k=0;k<7;k++) //7是页表的页数if(w[k].getPage()!=a)continue;else{tempofk=k;break;}if(w[tempofk].getsym()==1)cout<<"绝对地址:"<<w[tempofk].getinum()*128+i[j].getunit()<<" "<<"磁盘地址为:"<<w[tempofk].getonum()<<" "<<"操作为:"<<i[j].getope()<<endl;else cout<<"*"<<"发生缺页中断"<<endl;}}int main(){ins*INS=new ins[12];INS[0].setope ("+");INS[0].setpage(0);INS[0].setunit(70);INS[1].setope ("+");INS[1].setpage(1);INS[1].setunit(50);INS[2].setope ("×");INS[2].setpage(2);INS[2].setunit(15);INS[3].setope ("存"); INS[3].setpage(3);INS[3].setunit(21);INS[4].setope ("取"); INS[4].setpage(0);INS[4].setunit(56);INS[5].setope ("-");INS[5].setpage(6);INS[5].setunit(40);INS[6].setope ("移位"); INS[6].setpage(4);INS[6].setunit(53);INS[7].setope ("+");INS[7].setpage(5);INS[7].setunit(23);INS[8].setope ("存"); INS[8].setpage(1);INS[8].setunit(37);INS[9].setope ("取"); INS[9].setpage(2);INS[9].setunit(78);INS[10].setope ("+"); INS[10].setpage(4);INS[10].setunit(1);INS[11].setope ("存"); INS[11].setpage(6);INS[11].setunit(84);work*W =new work[7]; ifstream in("g://operate1.txt");long int p;int s;long int i;long int o;for(int jj=0;jj<7 ;jj++){in>>p;in>>s;in>>i;in>>o ;W[jj].setPage(p);W[jj].setsym(s);W[jj].setinum(i);W[jj].setonum(o);}diaodu(W,INS,12);}五.结果显示操作系统实验二〔第二题〕一.用先进先出〔FIFO〕九.程序清单/ 操作系统实验二.cpp : 定义控制台应用程序的入口点。
用先进先出(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、随机淘汰算法
学号:0120610340231课程设计题目请求页式管理缺页中断模拟设计--LRU、随机淘汰算法学院计算机学院专业计算机科学与技术班级计算机0602姓名朱林指导教师王红霞2009 年01 月08 日课程设计任务书学生姓名:朱林专业班级:计算机0602指导教师:王红霞工作单位:计算机科学与技术学院题目:请求页式管理缺页中断模拟设计-- LRU、随机淘汰算法初始条件:1.预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会和了解缺页和页面置换的具体实施方法。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.实现指定淘汰算法。
能够处理以下的情形:⑴能够输入给作业分配的内存块数;⑵能够输入给定的页面,并计算发生缺页的次数以及缺页率;⑶缺页时,如果发生页面置换,输出淘汰的页号。
2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:错误!未找到引用源。
)你认为你完成的设计哪些地方做得比较好或比较出色;错误!未找到引用源。
)什么地方做得不太好,以后如何改正;错误!未找到引用源。
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);错误!未找到引用源。
)完成本题是否有其他方法(如果有,简要说明该方法);错误!未找到引用源。
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日开始请求页面序列结束?内存块已满?利用替换算法,选择内存块中应该被替换的页面进行替换,修改页表选择将要调入页面放入未被占用的内存块中,修改页表NYN结束Y 页面在内存中?N Y请求页式管理缺页中段模拟设计 ——LRU 、随机淘汰算法1需求分析用一种计算机高级语言来实现请求页式管理缺页中段模拟设计的LRU 和随机淘汰算法,设计要求如下:⑴ 能够输入给作业分配的内存块数;⑵ 能够输入给定的页面,并计算发生缺页的次数以及缺页率; ⑶ 缺页时,如果发生页面置换,输出淘汰的页号。
计算机操作系统实验_源码_模拟请求分页虚拟存储管理中的硬件地址变换过程[技巧]
地址变换算法框图如图10—1所示。
运行设计的地址变换程序 ,显示或打印运行结果。。因为只是模拟地址变换,并不
cin>>menu;
while(menu)
{
switch(menu)
{
case 1:
cout<<"请输入指令的逻辑地址:";
cin>>ins;
changeaddr(p,ins);
break;
case 2:
cout<<"谢谢使用,下次再见~"<<endl;
exit(0);
break;
default:
cout<<"输入有误,请重新输入~"<<endl;
cout<<"----------\t\t1.输入指令\t\t---------"<<endl;
cout<<"----------\t\t2.退出程序\t\t---------"<<endl;
cout<<"----------欢迎使用分页虚拟存储器硬件地址变换算法---------"<<endl;
cout<<endl<<"请输入您的选择:";
p[2].pno=2;p[2].flag=1;p[2].cno=9;p[2].modf=0;p[2].addr=013;
模拟分页式存储管理中硬件的地址转换和缺页中断2
模拟分页式存储管理中硬件的地址转换和产生缺页中断分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。
为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。
作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。
如果块长为2 的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。
若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
设计一个“地址转换”程序来模拟硬件的地址转换工作。
当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。
当访问的页不在主存时,则输出“* 该页页号”,表示产生了一次缺页中断。
①定义相关数据结构如下typedef struct{int address; //进程的逻辑地址int meaddress; //进程的物理地址int page; //进程所在页号int add; //进程的位移量}arccell,AdjMatrix[MAX];typedef struct{char vex[MAX]; //进程名AdjMatrix arcs; //指向进程地址的数组int vexnum; //进程总数}Pro;typedef struct{int page; //页号int block; //块号int status; //该页是否在内存的状态位}pa_cell,pa_matrix[MAX];typedef struct{pa_matrix ptab; //指向页表相关信息的数组}pa_tab;②定义必要函数:void create_ptable(pa_tab & pa) //创建页表void exchange(Pro & P,pa_tab & pa) //地址转换函数③具体实验代码:#include<iostream.h>#define MAX 64#define eachpage 1024 // eachpage为每页(每块大小)int m; //m为简化后的页表行数typedef struct{int address; //进程的逻辑地址int meaddress; //进程的物理地址int page; //进程所在页号int add; //进程的位移量}arccell,AdjMatrix[MAX];typedef struct{char vex[MAX]; //进程名AdjMatrix arcs; //指向进程地址的数组int vexnum; //进程总数}Pro;void Create_pro(Pro & P)//创建进程{int i;cout<<"请输入进程总数:";cin>>P.vexnum;cout<<"请输入各进程名:";for(i=0;i<P.vexnum;i++)cin>>P.vex[i];cout<<"请输入各进程地址: ";for(i=0;i<P.vexnum;i++)cin>>P.arcs[i].address;for(i=0;i<P.vexnum;i++){P.arcs[i].page=P.arcs[i].address/eachpage;P.arcs[i].add=P.arcs[i].address%eachpage; // 逻辑地址=页号*页大小+位移量}}void print(Pro & P) //输出进程的相关信息{cout<<"各进程的页号页内地址为:"<<endl;for(int i=0;i<P.vexnum;i++)cout<<"进程名"<<P.vex[i]<<" 页号"<<P.arcs[i].page<<" 页内地址"<<P.arcs[i].add<<endl;cout<<endl;}//-------------页表的结构体-----------------typedef struct{int page; //页号int block; //块号int status; //该页是否在内存的状态位(为1表示在内存,为0表示不在内存)}pa_cell,pa_matrix[MAX];typedef struct{pa_matrix ptab; //指向页表相关信息的数组}pa_tab;void create_ptable(pa_tab & pa) //创建页表{int a,b,c;cin>>m; //输入页表行数cout<<"请输入页表相关信息:"<<endl;for(int i=0;i<m;i++){cin>>a>>b>>c;pa.ptab[i].page=a;pa.ptab[i].block=b;pa.ptab[i].status=c; //依次输入每行的页表信息}}//--------------地址转换函数-----------------void exchange(Pro & P,pa_tab & pa){for(int i=0;i<P.vexnum;i++)for(int j=0;j<m;j++)if(pa.ptab[j].page==P.arcs[i].page) //查询到页表里相对应的页号{if(pa.ptab[j].status==1) //若进程访问的页状态位为1,输出该进程物理地址{P.arcs[i].meaddress=pa.ptab[j].block*eachpage+P.arcs[i].address;//物理地址=块号*块大小+位移量cout<<"第"<<i+1<<"个进程物理地址为: "<<P.arcs[i].meaddress<<endl;}else //若访问的页状态位为0,表示该页不在主存,发生“缺页中断”信号cout<<"第"<<i+1<<"个进程地址转换发生缺页中断!"<<endl;}}void main(){Pro P;Create_pro(P); //创建进程cout<<endl;print(P);pa_tab pa;cout<<"由于页表信息太大,为了简化运算,请输入想输入的页表行数: ";create_ptable(pa); //创建页表exchange(P,pa); //调度地址转换函数}。
2022年网络工程师考试题库
从软件设计和开发角度来看,操作系统旳重要作用是提供A) 人机交互接口B) 软件开发基础平台C) 第一道安全防线D) 虚拟机和扩展机共享性是操作系统旳特性之一,下列共享设备中,哪种设备可以共享且可以被抢占使用?A) 中央处理单元B) 打印机C) 扫描仪D) 磁带机在操作系统中,只能在内核态下运行旳指令是?A) 读时钟指令B) 取数指令C) 移位指令D) 关中断指令中断是操作系统中为提高处理机效率而使用旳一种技术,下列选项中,哪一种不是中断而是异常?A) 时钟中断B) 被零除C) 控制台命令D) 存储器校验错对于函数open(),它属于哪一类系统调用?A) 文献操作类B) 进程控制类C) 信息维护类D) 通信传播类进程创立时需要填写进程控制块,下列哪一类信息不需要保留在进程控制块中?A) 进程调度信息B) 进程现场信息C) 进程打开旳文献句柄D) 进程顾客栈中旳信息某一单核处理机旳计算机系统中共有20个进程,那么,处在就绪状态旳进程最多为几种?A) 1B) 20C) 19D) 0进程具有多种状态,操作系统变化进程状态重要是通过下列哪一种措施实现旳?A) 调用进程控制原语实现B) 通过进程调度模块实现C) 通过进程分派模块实现D) 调用处理器特权指令实现对于如下C语言程序int main(){printf("Hello World\n");fork();fork();printf("Hello World\n");}在UNIX操作系统中对旳编译链接后,其对旳旳运行成果为A) 共打印出2行Hello WorldB) 共打印出3行Hello WorldC) 共打印出4行Hello WorldD) 共打印出5行Hello World有如下C语言程序void * th_f(void * arg){printf("Hello World");pthread_yield(0);}int main(void){pthread_t tid;int st;st = pthread_create(&tid, NULL, th_f, NULL); if(st==0)printf("Oops, I can not createthread\n"); exit(NULL);}针对上述程序,下列论述中哪一种是对旳旳?A) 线程th_f运行后积极退出B) 线程th_f运行后等待一种特定旳线程退出C) 线程th_f运行后积极释放CPU给其他线程D) 线程th_f运行后进入等待态在民航网络订票系统中,作为临界资源旳对象是A) 订票人B) 飞机票C) 航空企业D) 旅行社处理进程同步与互斥问题时,对信号量进行P原语操作是在下列哪类代码区完毕旳?A) 进入区B) 临界区C) 退出区D) 剩余区通过连接两个进程旳一种打开旳共享文献,可以实现进程间旳数据通信。
2022年电大操作系统网考复习题总结
单项选择题1.A-按文件用途来分,编译程序是()。
C.系统文件2.A-按照所起的作用和需要的运行环境,操作系统属于()。
D.系统软件3.A-按照作业到达的先后次序调度作业,排队等待时间最长的作业被优先调度,这是指()调度算法。
A.先来先服务法4.B-把逻辑地址转变为内存物理地址的过程称作()。
D.重定位5.CPU状态分为核心态和用户态,从用户态转换到核心态的途径是()。
C.系统调用6.C-操作系统的基本职能是()。
D. 控制和管理系统内各种资源,有效地组织多道程序的运行7.C-操作系统负责管理计算机系统的()。
C.资源8.C-从系统的角度出发,希望批处理控制方式下进入输入井的作业()尽可能小。
D.平均周转时间9.C-操作系统对缓冲区的管理属于()的功能。
B.设备管理10.C-操作系统内核与用户程序、应用程序之间的接口是()。
C.系统调用11.C-操作系统中利用信号量和P,V操作,( ).C.可实现进程的互斥和同步12.C-操作系统中有一组常称为特殊系统调用的程序,其操作具有不可分割性,在操作系统中称为B.原语13.C-操作系统实现“按名存取”的关键在于解决()。
B.文件名称与文件具体的物理地址的转换14.C-操作系统是通过()来对文件进行编辑、修改、维护和检索。
A.按名存取15.C-存放在磁盘上的文件()。
A.既可随机访问,又可顺序访问16.CPU输出数据的速度远远高于打印机的打印速度,为了解决这一矛盾,可采用()。
C.缓冲技术17.CPU启动通道后,设备的控制工作由()。
C.通道独立执行预先编好的通道程序来控制18.C-采用SPOOLing技术的目的是()。
A.提高独占设备的利用率19.C-操作系统中采用的以空间换取时间技术的是()。
A.SPOOLing技术20.C-存储管理中,页面抖动是指()。
B.被调出的页面又立刻被调入所形成的频繁调入调出现象21.D-当前目录是/usr/meng,其下属文件prog/file.c的绝对路径名是()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称操作系统原理实验名称虚拟页式管理
姓名学号专业班级网络
实验日期成绩指导教师赵安科
(①实验目的②实验原理③主要仪器设备④实验内容与步骤⑤实验数据记录与处理⑥实验结果与分析⑦问题建议)
实验二模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断
1.内容:模拟请求页式存储管理中硬件的地址转换和缺页中断处理
2.思想:
装入新页置换旧页时,若旧页在执行中没有被修改过,则不必将该页重写磁盘。
因此,页表中增加是否修改过的标志,执行“存”指令和“写”指令时将对应的修改标志置成“1”
页号标志页架号修改标志在磁盘上位置
3.要求及方法:
①设计一个地址转换程序来模拟硬件的地址转换和缺页中断。
当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可以输出转换后的绝对地址来表示一条指令已执行完成。
当访问的页不在主存中时,则输出“*页号”来表示硬件产生了一次缺页中断。
模拟地址转换流程见图1。
②编制一个FIFO页面调度程序;FIFO页面调度算法总是先调出作业中最先进入主存中的哪一页。
因此可以用一个数组来表示(或构成)页号队列。
数组中每个元素是该作业已在主存中的页面号,假定分配给作业的页架数为m,且该作业开始的m页已装入主存,则数组可由m个元素构成。
P[0],P[1],P[2],…,P[m-1]
它们的初值为P[0]:=0,P[1]:=1,P[2]:=2,…,P[m-1]:=m-1
用一指针K指示当要调入新页时应调出的页在数组中的位置,K的初值为“0”,当产生缺页
中断后,操作系统总是选择P[K]所指出的页面调出,然后执行:
P[K]:=要装入的新页页号 K :=(k+1)mod m
在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT 调出的页号”和“IN 要装入的新页页号”来模拟一次调出和装入过程,模拟程序的流程图见附图1。
按流程控制过程如下:
提示:输入指令的页号和页内偏移和是否存指令⎩⎨
⎧
0 1非存指令存指令,若d 为-1则结束,否则进
入流程控制过程,得P 1和d ,查表在主存时,绝对地址=P 1×1024+d
③ 假定主存中页架大小为1024个字节,现有一个共7页的作业,其副本已在磁盘上。
系统为该作业分配了4个页架,且该作业的第0页至第3页已装入内存,其余3页未装入主
依次执行上述指令调试你所设计的程序(仅模拟指令的执行,不考虑序列中具体操作的执行)。
④为进一步考察程序的执行,可自行确定若干组指令,运行程序,核对执行结果。
4.书写实验报告:
①实验题目;
②程序中所用的数据结构及说明;
③源程序并附上必要的说明;
④按照指令的执行序列,打印输出结果:绝对地址或调出、调入的页号。
图1 模拟算法流程
代码:
#include<iostream>
#include<iomanip>
#include<list>
using namespace std;
char useSign[12][5]={{'+'},{'-'},{'*'},{"存"},{"取"},{'-'},{"移位"},{'+'},{"存"},{"取"},{'+'},{"存"}};
int PageAddress[12]={70,50,15,21,56,40,53,23,37,78,01,84};
int PageNum[12]={0,1,2,3,0,6,4,5,1,2,4,6};
int S_Station;
int pPageNum[7];//页号pPage
int pSign[7];
int pStool[7];//页架号
int pModify[7];//修改标志
int pStation[7];//磁盘位置
static int z=0;
void Store()
{
for(int i=0;i<7;i++)
{
if(i<4)
{
pSign[i]=1;
}
else
pSign[i]=0;
pPageNum[i]=i;
pModify[i]=0;
}
int p1=1,p2=2,p3=3;
for(i=0;i<7;i++)
{
if(i<3)
{
pStation[i]=p1;
p1++;
}
else
if(i<6)
{
pStation[i]=p2;
p2++;
}
else
pStation[i]=p3;
}
pStool[0]=5;
pStool[1]=8;
pStool[2]=9;
pStool[3]=1;
}
void CShow()
{
cout<<"操作";
cout<<"页号";
cout<<"页内地址";
cout<<"标志";
cout<<"绝对地址";
cout<<"修改页号";
cout<<"页架号";
cout<<"绝对地址";
cout<<endl;
}
void Find()
{
int m_Pagenum;
int m_Station;
int Y_Station;//绝对地址
int m_Stool;
cout<<"输入页号及页内地址查询操作:";
cin>>m_Pagenum>>m_Station;
CShow();
int i,j=0;
//string m_Modify;
for(i=0;i<12;i++)
{
if(PageAddress[i]==m_Station)
{
break;
}
}
Y_Station=pStool[m_Pagenum]*1024+m_Station;
if(pSign[m_Pagenum]==1)
{
if(strcpy(useSign[i],"存")!=0)
{
pModify[m_Pagenum]=1;
}
}
cout<<useSign[i]<<" ";
cout<<m_Pagenum<<" ";
cout<<m_Station<<" ";
cout<<pSign[m_Pagenum]<<" ";
if(Y_Station!=m_Station)
{
cout<<Y_Station<<" ";
cout<<" ";
cout<<pStool[m_Pagenum]<<" ";
cout<<Y_Station<<endl;
}
else
{
cout<<"*"<<m_Pagenum<<" ";
for(j=z;j<7;j++)
{
if(pSign[j]==1)
{
z++;
break;
}
}
cout<<m_Pagenum<<"->"<<j<<" ";
pStool[m_Pagenum]=pStool[j];
pSign[j]=0;
pStool[j]=0;
cout<<pStool[m_Pagenum]<<" ";
cout<<pStool[m_Pagenum]*1024+m_Station<<endl;
}
}
int main(void)
{
Store();
char judge='Y';
while(judge=='Y')
{
Find();
cout<<"是否继续输入?Y = 是N=否"<<endl;
cin>>judge;
}
return 0;
}
5.实验分析与总结
在实验过程中,遇到了一些问题但是在调试的过程中,会出现很多错误,有的自己可以解决,也有一些在老师的帮助下,解决了问题。
不能说本次试验很完美,但是我从中得到了不少的收获,掌握了请求页式管理中硬件的地址转换和缺页中断的原理,同时理解了先进先出的调度算法。
以后定会再接再厉了,多学些理论知识来指导实践。