操作系统第九章实验——主存空间的分配与回收
- 格式:doc
- 大小:124.50 KB
- 文档页数:13
操作系统实验报告实验[ 1 ]:主存储器空间的分配和回收姓名:何浪学号:201306080215专业班级:计本132实验时间:2015.5.31报告时间:2015.6.6系别:计算机系学院:电气与信息工程学院实验3主存储器空间的分配和回收一、实验内容主存储器空间的分配和回收。
二、实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。
当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。
当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。
主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。
三、实验原理模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。
(1)可变分区方式是按作业需要的主存空间大小来分割分区的。
当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。
随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。
例如:为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:第一栏第二栏其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。
(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。
有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。
为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。
计算机操作系统内存分配实验报告⼀、实验⽬的熟悉主存的分配与回收。
理解在不同的存储管理⽅式下.如何实现主存空间的分配与回收。
掌握动态分区分配⽅式中的数据结构和分配算法及动态分区存储管理⽅式及其实现过程。
⼆、实验容和要求主存的分配和回收的实现是与主存储器的管理⽅式有关的。
所谓分配.就是解决多道作业或多进程如何共享主存空间的问题。
所谓回收.就是当作业运⾏完成时将作业或进程所占的主存空间归还给系统。
可变分区管理是指在处理作业过程中建⽴分区.使分区⼤⼩正好适合作业的需求.并且分区个数是可以调整的。
当要装⼊⼀个作业时.根据作业需要的主存量查看是否有⾜够的空闲空间.若有.则按需要量分割⼀个分区分配给该作业;若⽆.则作业不能装⼊.作业等待。
随着作业的装⼊、完成.主存空间被分成许多⼤⼤⼩⼩的分区.有的分区被作业占⽤.⽽有的分区是空闲的。
实验要求使⽤可变分区存储管理⽅式.分区分配中所⽤的数据结构采⽤空闲分区表和空闲分区链来进⾏.分区分配中所⽤的算法采⽤⾸次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。
同时.要求设计⼀个实⽤友好的⽤户界⾯.并显⽰分配与回收的过程。
同时要求设计⼀个实⽤友好的⽤户界⾯,并显⽰分配与回收的过程。
三、实验主要仪器设备和材料实验环境硬件环境:PC或兼容机软件环境:VC++ 6.0四、实验原理及设计分析某系统采⽤可变分区存储管理.在系统运⾏当然开始.假设初始状态下.可⽤的存空间为640KB.存储器区被分为操作系统分区(40KB)和可给⽤户的空间区(600KB)。
(作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB)当作业1进⼊存后.分给作业1(130KB).随着作业1、2、3的进⼊.分别分配60KB、100KB.经过⼀段时间的运⾏后.作业2运⾏完毕.释放所占存。
一、实验目的理解分区式存储管理的基本原理,熟悉分区分配和回收算法。
即理解在不同的存储管理方式下,如何实现主存空间的分配与回收;并掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。
二、设备与环境1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如VC \VC++\Java 等编程语言环境。
三、实验原理实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。
同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。
同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。
A、主存空间分配(1)首次适应算法在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。
在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足要求的空闲区,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中。
(2)最佳适应算法在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。
在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲区且该空闲区的大小比其他满足要求的空闲区都小,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中(3)最坏适应算法在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。
在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲区且该空闲区的大小比其他满足要求的空闲区都大,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中。
B、主存空间回收当一个作业执行完成撤离时,作业所占的分区应该归还给系统。
#include<stdio.h>#include<stdlib.h>#define NUM 128typedef struct{ int zm_no;int cd_no;int jl_no;}disk;void disp(int m[]){int i;printf("位?示º?图ª?:êo\n");for(i=0;i<NUM;i++){if(i%8==0)printf("\n");printf("%d\t",m[i]);}printf("\n");}void creat(int m[]){ int j=0,zh,wh;int keyong=0;while(j<NUM){ if(m[j]==0){ keyong=1;m[j]=1;disk a;a.zm_no=j/8;a.cd_no=(j%8)/4;a.jl_no=(j%8)%4;zh=a.zm_no;wh=a.cd_no*4+a.jl_no;printf("柱¨´面?号?\t磁ä?道̨¤号?\t物?理¤¨ª记?录?号?\n");printf("%d\t%d\t%d\n",a.zm_no,a.cd_no,a.jl_no);printf("字Á?号?\t位?号?\n");printf("%d\t%d\n",zh,wh);break;}else j++;}if(keyong==0){ printf("无T可¨¦用®?磁ä?盘¨¬块¨¦!ê?\n");printf("\n");}}void del(int m[]){ disk b;int zm_no,cd_no,jl_no,j;printf("输º?入¨?待äy回?收º?磁ä?盘¨¬块¨¦的Ì?柱¨´面?号?,ê?磁ä?道̨¤号?,ê?物?理¤¨ª记?录?号?:êo");scanf("%d%d%d",&b.zm_no,&b.cd_no,&b.jl_no);j=8*b.zm_no+4*b.cd_no+b.jl_no;if(m[j]==0)printf("已°?是º?空?闲D状Á¡ä态¬?,ê?不?必À?回?收º?!ê?\n");else{ m[j]=0;disp(m);}}int main(){int i;int input=1;int m[NUM]={ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};while(input!=0){ printf("1.当Ì¡À前¡ã磁ä?盘¨¬状Á¡ä态¬? 2.申¦¨º请?磁ä?盘¨¬块¨¦ 3.回?收º?磁ä?盘¨¬块¨¦ 0.退ª?出?\n");scanf("%d",&input);switch(input){ case 1: disp(m);break;case 2: creat(m);break;case 3: del(m);break;default:break;}}system("pause");return 0;}。
存档资料成绩:华东交通大学理工学院课程设计报告书所属课程名称计算机操作系统题目主存空间的分配与回收分院电信分院专业班级计算机科学与技术(1)班学号学生姓名指导教师2012 年 6 月20 日目录第1章课程设计内容及要求. (3)第2章需求分析 (4)第3章概要设计 (5)第4章详细设计 (8)第5章调试分析与测试结果 (11)第6章课程设计心得 (16)第7章参考文献 (17)附录 (18)第一章课程设计内容及要求1.1 课程设计的目的通过该课程设计使学生理解在不同的存储管理方式下,以及使学生加深对如何实现主存空间的分配与回收原理的理解。
也使学生初步具有研究、设计、编制和调试操作系统模块的能力。
1.2 课程设计内容主存是中央处理器能直接存取指令和数据的存储器,能否合理地利用主存,在很大程度上将影响到整个计算机的性能。
通过本次实验可以帮助理解主存空间的分配与回收的几种算法:①掌握最先适应分配算法;②掌握最优适应分配算法;③掌握最坏适应分配算法。
第二章需求分析2.1 软件及硬件需求适用于现在各种计算机,建议内存不少于128M。
开发环境:VMware虚拟机软件,ubuntu 11.10系统,Gcc编译器。
2.2 设计需求内存的分配与回收是内存管理的主要功能之一。
无论采取哪一种管理和控制方式,能否把外存中的数据和程序调入内存,取决于内否在内存中为他们安排合适的位置。
因此,存储管理模块要为每一个并发执行的进程分配内存空间。
另外,当进程执行结束之后,存储管理模块又要及时回收该进程所占用的内存资源,以便给其他进程分配空间。
但由于作业大大小不一,所以系统为作业分配内存大小不一,在释放时造成系统资源的浪费。
因此,采取首次适应算法,以及那少内存的浪费。
第三章概要设计3.1 设计思想初始化系统的内存分区说明表;输入当前作业或进程的使用内存情况,检索系统内的内存分区说明表,判断是否可分配,也就是查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无;则作业等待。
计算机操作系统实验报告实验二实验题目:存储器管理系别:计算机科学与技术系班级:姓名:学号:2一、实验目的深入理解动态分区存储管理方式下的内存空间的分配与回收。
二、实验内容编写程序完成动态分区存储管理方式下的内存分配和回收的实现。
具体内容包括:确定用来管理内存当前使用情况的数据结构;采用首次适应算法完成内存空间的分配;分情况对作业进行回收;编写主函数对所做工作进行测试。
三、实验原理分配:动态分区存储管理方式把内存除OS占用区域外的空间看作一个大的空闲区。
当作业要求装入内存时,根据作业需要内存空间的大小查询内存中各个空闲区,当从内存中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业要求划出一个分区装入该作业。
回收:作业执行完后,它所占用的内存空间被收回,成为一个空闲区。
如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。
四、实验方法实现动态分区的分配与回收,主要考虑三个问题:第一、设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域(利用结构体类型数组来保存数据);第二、在设计的数据表格基础上设计内存分配算法(采用首次适应算法找合适的分区(对空闲分区表进行排序),分配时要考虑碎片问题);第三、在设计的数据表格基础上设计内存回收算法(分四种情况进行回收(上邻、下邻、上下邻和无相邻分区)。
五、实验步骤第一,设计记录内存使用情况的数据表格●已分配分区表:起始地址、长度、标志(0表示“空表项”,1表示“已分配”)●空闲分区表:起始地址、长度、标志(0表示“空表项”,1表示“未分配”)struct used_table {float address; //已分分区起始地址float length; //已分分区长度,单位为字节int flag; //已分配表区登记栏标志,用0表示空栏目,char zuoyename;}; //已分配区表Struct free_table[ {float address; //空闲分区起始地址float length; //空闲分区长度,单位为字节int flag; //空闲分区表登记栏目用0表示空栏目,1表示未配}; //空闲分区表第二,在设计的表格上进行内存分配●首次适应算法:为作业分配内存,要求每次找到一个起始地址最小的适合作业的分区(按起始地址递增排序)。
实验报告【实验名称】首次适应算法和循环首次适应算法【实验目的】理解在连续分区动态的存储管理方式下,如何实现主存空间的分配与回收。
【实验原理】首次适应(first fit,FF)算法FF算法要求空闲分区链以地址递增的次序链接。
在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区即可。
然后再按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中。
若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已经没有足够大的内存分配给该进程,内存分配失败,返回。
循环首次适应(next fit,NF)算法为避免低址部分留下许多很小的空闲分区,以及减少查找可用空闲分区的开销,循环首次适应算法在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块玉请求大小相等的内存空间分配给作业。
【实验内容】实现主存空间的分配与回收:1.采用可变式分区管理,使用首次适应算法实现主存空间的分配与回收;2.采用可变式分区管理,使用循环首次适应算法实现主存空间的分配与回收。
数据结构和符号说明:typedef struct PCB//进程控制块{char ProgressName[10]; //进程名称int Startaddress; //进程开始地址int ProgressSize; //进程大小int ProgressState = 0; //进程状态};typedef struct FREE //空闲区结构体{int Free_num; //空闲区名称int Startaddress; //空闲区开始地址int Endaddress; //空闲区结束地址int Free_Space; //空闲区大小};算法流程图:首次适应算法循环首次适应算法程序代码及截图:主界面:首次适应算法,初始空闲区:插入进程:插入3个进程:空闲区信息:删除进程2:删除后空闲区状况:再插入一个进程,可以看到其其初始地址为100:循环首次适应算法,插入3个进程删除进程2后:再插入进程A,发现其从上次找到的空闲分区的下一个空闲分区开始查找,其初始地址为750而不是200:。
主内存空间分配和恢复实验报告。
操作系统实验报告实验[1]:主存储空间的分配和名字的恢复;贺兰雪诺。
以下内容:201306080215专业课:132次实验时间:2015.5.31报告时间:2015.6.6分类:计算机科学学院:电气与信息工程学院实验三中主存储空间的分配与恢复I .为实验内容分配和恢复主存储空间。
第二,实验目的一个好的计算机系统不仅要有足够的容量、高速的访问速度、稳定可靠的主存,还要能够合理地分配和使用这些存储空间。
当用户申请内存空间时,内存管理必须根据申请人的要求,按照一定的策略分析主内存空间的使用情况,并找出足够的空闲空间分配给申请人。
当作业收回或主动返回主内存资源时,存储管理将回收作业占用的主内存空间或返回部分主内存空间。
主存分配和恢复的实现与主存的管理模式有关。
本实验帮助学生理解如何在可变分区管理模式下实现主存空间的分配和恢复。
第三,实验原理仿真采用第一种自适应算法实现可变分区管理模式下的内存分配和恢复。
(1)可变分区方法根据作业所需的主内存空间大小划分分区。
当要加载作业时,根据作业所需的主库存检查是否有足够的可用空间,如果有,根据所需的数量划分分区并分配给作业;否则,无法加载作业。
随着作业的加载和卸载,主内存空间被分成许多分区,其中一些被作业占用,一些是空闲的。
例如:05k10k14k26k32k512k操作系统作业1作业3自由区域作业2自由区域为了解释哪些区域是自由的,可以用来加载新作业,必须有一个自由区域描述表,格式如下:起始地址长度状态的第一列14 K12 K没有被分配,第二列32 K96 K没有被分配给MMMM,其中起始地址——指示空闲区域的主存储器起始地址。
长度——表示从起始地址开始的连续空闲长度。
状态——有两种状态,一种是“未分配”状态,这表示由起始地址指示的某一长度的相应区域是空闲区域。
(2)当新作业需要加载到主存储器中时,必须检查空闲区域描述表以找到足够大的空闲区域。
主存储器空间的分配和回收实验二主存储器空间的分配和回收一、实验题目模拟在分页式管理方式下采用位示图来表示主存分配情况,实现主存空间的分配和回收。
[提示]:(1)、分页式存储器把主存分成大小相等的若干块,作业的信息也按块的大小分页,作业装入主存时可把作业的信息按页分散存放在主存的空闲块中,为了说明主存中哪些块已经被占用,哪些块是尚未分配的空闲块,可用一张位示图来指出。
位示图可由若干存储单元来构成,其中每一位与一个物理块对应,用0/1表示对应块为空闲/已占用。
(2)、假设某系统的主存被分成大小相等的64块,则位示图可用8个字节来构成,另用一单元记录当前空闲块数。
如果已有第0,1,4,5,6,9,11,13,24,31,共10个主存块被占用了,那么位示图情况如下:(3)、当要装入一个作业时,根据作业对主存的需要量,先查当前空闲块数是否能满足作业要求,若不能满足则输出分配不成功。
若能满足,则查位示图,找出为“0”的一些位,置上占用标志“1”,从“当前空闲块数”中减去本次占用块数。
按找到的计算出对应的块号,其计算公式为:块号= j 8+i其中,j表示找到的是第n个字节,I表示对应的是第n位。
根据分配给作业的块号,为作业建立一张页表,页表格式:(4) 、当一个作业执行结束,归还主存时,根据该作业的页表可以知道应归还的块号,由块号可计算出在位示图中的对应位置,把对应位的占用标志清成“0”,表示对应的块已成为空闲块。
归还的块数加入到当前空闲块数中。
由块号计算在位示图中的位置的公式如下:字节号 j=[块号/8] ([ ]表示取整)位数 i={块号/8} ({ }表示取余)(5) 设计实现主存分配和回收的程序。
假定位示图的初始状态如(2)所述,现有一信息量为5页的作业要装入,运行你所设计的分配程序,为作业分配主存且建立页表(格式如(3)所述)。
然后假定有另一作业执行结束,它占用的块号为第4,5,6和31块,运行你所设计的回收程序,收回作业归还的主存块。
实验六:主存空间的分配与回收(题目及实例代码(基于java))实验目的:编程模拟主存空间的分配与回收,采用最先适应算法分配分区实验要求:基于现有程序,补全分配与回收部分程序实例代码:import java.util.LinkedList;import java.util.Scanner;public class DArea {public static LinkedList<Area> array1 = new LinkedList();public static void main(String args[]){array1.add(new Area(40,16));array1.add(new Area(78,24));array1.add(new Area(150,50));outArea();int addr=0;int arealong=0;System.out.println("请选择\n1:申请分区\n2:释放分区\n0:退出");Scanner in=new Scanner(System.in);int t=in.nextInt();while(t!=0){if(t==1){System.out.println("请输入申请分区长度");arealong=in.nextInt();int size=array1.size();int i=0;if(size==0)System.out.println("没有空间");else{for(i=0;i<size;i++){if(array1.get(i).areaLong>arealong){array1.get(i).addr=array1.get(i).addr+arealong;array1.get(i).areaLong=array1.get(i).areaLong-areal ong;System.out.println("申请空间分配成功");break;}elseif(array1.get(i).areaLong==arealong){array1.remove(i);System.out.println("申请空间分配成功");break;}}if(i==size)System.out.println("没有满足要求的分区");}}else if(t==2){System.out.println("请输入释放分区起始地址及长度");addr=in.nextInt();arealong=in.nextInt();int size=array1.size();int i=0;if(size==0)array1.add(new Area(addr, arealong));else{for(i=0;i<size;i++){if(array1.get(i).addr>addr)break;}if(i==0){if((addr+arealong)<array1.get(i).addr)array1.addFirst(newArea(addr,arealong));elseif((addr+arealong)==array1.get(i).addr){array1.get(i).addr=addr;array1.get(i).areaLong=arealong+array1.get(i).areaL ong;}else{System.out.println("释放空间数据有误");}}else if(i>=size){if((array1.get(i-1).addr+array1.get(i-1).areaLong)< addr)array1.add(newArea(addr,arealong));elseif((array1.get(i-1).addr+array1.get(i-1).areaLong)==a ddr){array1.get(i-1).areaLong=arealong+array1.get(i-1).a reaLong;}else{System.out.println("释放空间数据有误");}}else{if((array1.get(i-1).addr+array1.get(i-1).areaLong)= =addr&&(addr+arealong)==array1.get(i).addr){array1.get(i-1).areaLong=arealong+array1.get(i-1).a reaLong+array1.get(i).areaLong;array1.remove(i);}elseif((array1.get(i-1).addr+array1.get(i-1).areaLong)==a ddr){array1.get(i-1).areaLong=arealong+array1.get(i-1).a reaLong;}elseif((addr+arealong)==array1.get(i).addr){array1.get(i).addr=addr;array1.get(i).areaLong=arealong+array1.get(i).areaL ong;}elseif((array1.get(i-1).addr+array1.get(i-1).areaLong)>ad dr&&(addr+arealong)<array1.get(i).addr){array1.add(i,newArea(addr,arealong));}else{System.out.println("释放空间数据有误");}}}}outArea();System.out.println("请选择\n1:申请分区\n2:释放分区\n0:退出");t=in.nextInt();}}public static void outArea(){if(array1.size()==0)System.out.println("内存空间已全部分配");else{System.out.println("内存空间可用情况:");System.out.println("起始地址\t分区长度");for(int i=0;i<array1.size();i++){System.out.println(array1.get(i).addr+"\t"+array1.g et(i).areaLong);}}}}class Area {int addr;int areaLong;public Area(int addr, int areaLong) {this.addr = addr;this.areaLong = areaLong;}public int getAddr() {return addr;}public void setAddr(int addr) {this.addr = addr;}public int getAreaLong() {return areaLong;}public void setAreaLong(int areaLong) { this.areaLong = areaLong;}}实例运行:内存空间可用情况:起始地址分区长度40 1678 24150 50请选择1:申请分区2:释放分区0:退出1请输入申请分区长度30申请空间分配成功内存空间可用情况:起始地址分区长度40 1678 24180 20请选择1:申请分区2:释放分区0:退出2请输入释放分区起始地址及长度2020内存空间可用情况:起始地址分区长度20 3678 24180 20请选择1:申请分区2:释放分区0:退出。
第九章虚拟存储器管理软件121 1102052019 金凯1.实验题目:采用最佳页面替换算法(OPT)、先进先出页面替换算法(FIFO)和最近最少使用页面替换算法(LRU)来进行内存管理。
FIFO先进先出页面替换算法,基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入主存的页面,即淘汰在主存中驻留时间最长的页面,认为驻留时间最长的页不再使用的可能性最大。
LRU最近最少使用页面替换算法淘汰的页面是在最近一段时间内最久未被访问的那一页,它是基于程序局部性原理来考虑的,认为那些刚被使用过的页面可能还要立即被使用,而那些在较长时间内未被使用的页面可能不会立即使用。
OPT最佳页面替换算法,当要调入一页而必须淘汰旧页时,应该淘汰以后不再访问的页,或距现在最长时间后要访问的页面。
2.程序流程图FIFO 置换调度算法流程图: 开 始调度算法选输入输入输入FIFO 置换算法 LRU 置换算OPT 置换算结 束初始化内存块数组与页面访问串开始将内存块数组当前列分别赋值为上一列元素是当前页面号在内存块中是否存在?否缺页,找到内存块数组中最先进入的页面将该页面号赋值为当前需调入内存的页面号,time标记重置为1,缺页数加1,缺页*标记置1输出内存块调度结果结束图2 FIFO置换调度算法流程图3.源程序本程序在c++编译器cfree上通过测试,vc6.0没有经过测试。
说明:下列程序均使用教材269页的实例,总共是3个页框,共有5个独立的队列。
顺序是2、3、2、1、5、2、4、5、3、2、5、2,共12次请求。
为了测试方便,仅使用前9个。
1>最佳页面替换算法OPT#include<iostream>using namespace std;void OPT(){int length;int opt[100]={0};int pageLength;int optPage[100]={0};int compare[100]={0};int compares=1;int i,j,k;cout<<"***************************最佳页面调度算法***********************"<<endl;cout<<"页框数:";cin>>pageLength;cout<<"请输入页面序列的长度:";cin>>length;cout<<"时刻t"<<'\t';for(i=0;i<length;i++){cout<<i<<'\t';}cout<<endl<<"引用串"<<'\t';for(i=1;i<=length;i++){cin>>opt[i];}for(i=1;i<=length;i++){compares=1;for(int ll=1;ll<=100;ll++){compare[ll]=0;}int flag=0;for(j=1;j<=pageLength;j++){if(opt[i]==optPage[j]){flag=1;j=pageLength+1;}else if(optPage[j]==0){optPage[j]=opt[i];j=pageLength+1;flag=1;}}if(flag==1){ }else{for(j=1;j<=pageLength;j++){for(int k=i;k<=length;k++){if(optPage[j]==opt[k]){k=length+1;}else{compare[compares]++;}}compares++;}for(k=1;k<pageLength;k++){if(compare[k]>=compare[k+1]){compare[k+1]=compare[k];}else{}}flag=compare[pageLength];for(k=1;k<=pageLength;k++){if(flag==compare[k]){flag=k;k=pageLength+1;}}cout<<" →淘汰"<<optPage[flag]<<endl;optPage[flag]=opt[i];}cout<<endl<<"t="<<i-1<<"时"<<'\t';for(int jk=1;jk<=pageLength;jk++){cout<<"P"<<jk<<'\t';}cout<<endl<<'\t';for(int s=1;s<=pageLength;s++){cout<<optPage[s]<<'\t';}cout<<endl;}}int main(void){OPT();cout<<endl<<" ";cout<<" 程序测试BY:金凯"<<endl;cout<<" ";cout<<"测试结果:符合最佳页面替换算法的要求和结果"<<endl;return 0;}2>先进先出页面替换算法(FIFO)#include<iostream>using namespace std;void FIFO(){int length;int fifo[100]={0};int pageLength;int fifoPage[100]={0};int i,j,k;cout<<" ***********************先进先出页面调度算法**************************"<<endl;cout<<"页框数:";cin>>pageLength;cout<<"请输入页面序列的长度:";cin>>length;cout<<"时刻t"<<'\t';for(i=0;i<length;i++){cout<<i<<'\t';}cout<<endl<<"引用串"<<'\t';for(i=1;i<=length;i++){cin>>fifo[i];}for(i=1;i<=length;i++){int flag=0;for(j=1;j<=pageLength;j++){if(fifo[i]==fifoPage[j]){flag=1;j=pageLength+1;}else if(fifoPage[j]==0){fifoPage[j]=fifo[i];j=pageLength+1;flag=1;}}if(flag==1){}else{cout<<" →淘汰"<<fifoPage[1]<<endl;for(j=1;j<=pageLength;j++){fifoPage[j]=fifoPage[j+1];}fifoPage[pageLength]=fifo[i];}cout<<endl<<"t="<<i-1<<"时"<<'\t';for(int jk=1;jk<=pageLength;jk++){cout<<"P"<<jk<<'\t';}cout<<endl<<'\t';for(int s=1;s<=pageLength;s++){cout<<fifoPage[s]<<'\t';}cout<<endl;}}int main(void){FIFO();cout<<endl<<" ";cout<<" 程序测试BY:金凯"<<endl;cout<<" ";cout<<"测试结果:符合先进先出页面替换算法的要求和结果"<<endl;return 0;}3>最近最少使用页面替换算法(LRU)#include<iostream>using namespace std;void LRU(){int length;int lru[100]={0};int pageLength;int lruPage[100]={0};int i,j,k;cout<<" ***********************最近最少使用页面替换算法***********************"<<endl;cout<<"页框数:";cin>>pageLength;cout<<"请输入页面序列的长度:";cin>>length;cout<<"时刻t"<<'\t';for(i=0;i<length;i++){cout<<i<<'\t';}cout<<endl<<"引用串"<<'\t';for(i=1;i<=length;i++){cin>>lru[i];}for(i=1;i<=length;i++){int flag=0;for(j=1;j<=pageLength;j++){if(lru[i]==lruPage[j]){for(int cc=j;cc>0;cc--){lruPage[cc]=lruPage[cc-1];}lruPage[1]=lru[i];flag=1;j=pageLength+1;}else if(lruPage[j]==0){for(int vv=j;vv>0;vv--){lruPage[vv]=lruPage[vv-1];}lruPage[1]=lru[i];j=pageLength+1;flag=1;}}if(flag==1){}else{cout<<" →淘汰"<<lruPage[pageLength]<<endl;for(j=pageLength;j>0;j--){lruPage[j]=lruPage[j-1];}lruPage[1]=lru[i];}cout<<endl<<"t="<<i-1<<"时"<<'\t';for(int jk=1;jk<=pageLength;jk++){cout<<"P"<<jk<<'\t';}cout<<endl<<'\t';for(int s=1;s<=pageLength;s++){cout<<lruPage[s]<<'\t';}cout<<endl;}}int main(void){LRU();cout<<endl<<" ";cout<<" 程序测试BY:金凯"<<endl;cout<<" ";cout<<"测试结果:符合最近最少使用页面替换算法的要求和结果"<<endl;return 0;}4.心得体会:通过本次实验,我不仅了解了全局页面替换算法的概念和理论知识,更是掌握了其核心的替换思想。