模拟页式存储管理操作系统课程设计报告
- 格式:doc
- 大小:122.00 KB
- 文档页数:17
一目的与要求(1) 请求页式虚存管理是常用的虚拟存储管理方案之一。
(2) 通过请求页式虚存管理中对页面置换算法的模拟,加深理解虚拟存储技术的特点。
(3) 模拟页式虚拟存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断.二实验内容或题目(1)本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。
(2)虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。
(3)要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。
(4)程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。
三实验步骤与源程序(1)实验步骤1、理解好相关实验说明。
2、根据实验说明,画出相应的程序流程图。
3、按照程序流程图,用C语言编程并实现。
(2)流程图如下:①虚页和实页结构在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。
pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。
time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。
在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。
pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。
next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。
②程序流程图如下:(3)源程序如下:#include<iostream.h>#define M 40int N;struct Pro{int num,time;};int Input(int m,Pro p[M]){cout<<"请输入实际页数:";do{cin>>m;if(m>M)cout<<"数目太多,请重试"<<endl;else break;}while(1);//cout<<"请输入各页面号:";for(int i=0;i<m;i++){cout<<"第"<<i<<"个页面号为:";cin>>p[i].num;p[i].time=0;}return m;}void print(Pro *page1)//打印当前的页面{Pro *page=new Pro[N];page=page1;for(int i=0;i<N;i++)cout<<page[i].num<<" ";cout<<endl;}int Search(int e,Pro *page1 ){Pro *page=new Pro[N];page=page1;for(int i=0;i<N;i++)if(e==page[i].num)return i; return -1;}int Max(Pro *page1){Pro *page=new Pro[N];page=page1;int e=page[0].time,i=0;while(i<N)//找出离现在时间最长的页面{if(e<page[i].time)e=page[i].time;i++;}for( i=0;i<N;i++)if(e==page[i].time)return i;return -1;}int Compfu(Pro *page1,int i,int t,Pro p[M]){Pro *page=new Pro[N];page=page1;int count=0;for(int j=i;j<M;j++){if(page[t].num==p[j].num )break;else count++;}return count;}int main(){cout<<"可用内存页面数:";cin>>N;Pro p[M];Pro *page=new Pro[N];char c;int m=0,t=0;float n=0;m=Input(m,p);do{for(int i=0;i<N;i++)//初试化页面基本情况{page[i].num=0;page[i].time=2-i;}i=0;cout<<"************************"<<endl;cout<<"*****f:FIFO页面置换*****"<<endl;cout<<"*****l:LRU页面置换******"<<endl;cout<<"*****o:OPT页面置换******"<<endl;cout<<"*****按其它键结束*******"<<endl;cout<<"************************"<<endl;cout<<"请选择操作类型(f,l,o):";cin>>c;if(c=='f')//FIFO页面置换{n=0;cout<<"页面置换情况: "<<endl;while(i<m){if(Search(p[i].num,page)>=0)i++;//找到相同的页面else{if(t==N)t=0;else{n++;//page[t].num=p[i].num;print(page);t++;}}}cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl; }if(c=='l')//LRU页面置换{ n=0;cout<<"页面置换情况: "<<endl;while(i<m){int k;k=t=Search(p[i].num,page);if(t>=0)page[t].time=0;else{n++;t=Max(page);page[t].num=p[i].num;page[t].time=0;}if(t==0){page[t+1].time++;page[t+2].time++;}if(t==1){page[2].time++;page[0].time++;}if(t==2){page[1].time++;page[0].time++;}if(k==-1) print(page); i++;}cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl;}if(c=='o')//OPT页面置换{n=0;while(i<m){if(Search(p[i].num,page)>=0)i++;else{int temp=0,cn;for(t=0;t<N;t++){if(temp<Compfu(page,i,t,p)){temp=Compfu(page,i,t,p); cn=t;}}page[cn]=p[i];n++;print(page);i++;}}cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl; }}while(c=='f'||c=='l'||c=='o');return 0;});四测试数据与实验结果五结果分析与实验体会通过上机,我了解了许多关于操作系统的专业知识。
____大学____学院实验报告课程名称:计算机操作系统实验名称:存储管理实验实验日期:班级:姓名:学号:仪器编号: XX实验报告要求:1.实验目的 2.实验要求 3.实验步骤 4.程序清单 5.运行情况6.流程图 7.实验体会1、实验目的①通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰法。
②通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
2、实验要求①设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。
可以假定每个作业都是批处理作业,并且不允许动态申请内存。
为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。
②设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。
对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。
③编写并调试一个段页式存储管理的地址转换的模拟程序。
首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。
要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。
3、实验步骤(1)理解实验要求,联系所学知识;(2)根据要求编写调度算法;(3)编写完整的实验代码并在VC++ 6.0环境下编译运行;(4)调试程序直至得出结果。
4、程序清单①#include <stdio.h>#include <stdio.h>#include<math.h>#include<stdlib.h>#define NUM 4#define alloMemory(type) (type*)malloc(sizeof(type)) struct partiTab{int no;int size;int firstAddr;char state;}parTab[NUM];typedef struct partiTab PARTITAB;typedef struct jcb { /*定义作业控制块JCB ,部分信息省略*/ char name[10]; //作业名int size; //作业大小struct jcb* link; //链指针}JCB;typedef struct{JCB *front,*rear;}jcbQue;jcbQue *jcbReadyQue;void AllocateMemory(int size);void createTab();void checkTab();void recycleMemory(int i);void AllocateMemory(int size){int i;for(i=0;i<NUM;i++){PARTITAB p=parTab[i];if(p.state='N' && p.size>size)parTab[i].state='Y';elseprintf("没有空闲分区,无法分配内存!\n"); }}void createTab(){int i;for( i=1;i<=NUM;i++){//getPartiTab(PARTITAB);parTab[i-1].no=i;parTab[i-1].size=20;parTab[i-1].firstAddr=21;parTab[i-1].state='N';}}void checkTab(){int i;printf("分区号\t大小\t起址\t状态\n");for(i=0;i<NUM;i++){printf("%d\t",parTab[i].no);printf("%d\t",parTab[i].size);printf("%d\t",parTab[i].firstAddr);printf("%c\t",parTab[i].state);printf("\n");}}void recycleMemory(int i){parTab[i-1].state='N';}int main(int argc, char* argv[]){int i;printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t实验一存储管理实验\n");printf("\t\t\t\t固定式分区分配存储管理\n");printf("\t\t*********************************************\t\t\n"); createTab();checkTab();printf("请按任意键继续:\n");getchar();printf("每个分区装入一道作业:\n");for(i=0;i<NUM;i++){AllocateMemory((i+1)*3);}checkTab();printf("请按任意键继续:\n");getchar();printf("假如一段时间后,其中一个作业结束,回收给它分配的分区(假如该作业在第2分区)\n");recycleMemory(2);checkTab();printf("请按任意键继续:\n");getchar();printf("接着,从外存后备作业队列中选择一个作业装入该分区(假如该作业大小为10)\n");AllocateMemory(10);checkTab();return 0;}#include<stdio.h>#include <dos.h>#include<stdlib.h>#include<conio.h>#define n 10#define m 10#define minisize 100struct{float address;float length;int flag;}used_table[n];struct{float address;float length;int flag;}free_table[m];void allocate(char J,float xk) {int i,k;float ad;k=-1;for(i=0; i<m; i++)if(free_table[i].length>=xk&&free_table[i].flag==1) if(k==-1||free_table[i].length<free_table[k].length) k=i;if(k==-1){printf("无可用空闲区\n");return;}if(free_table[k].length-xk<=minisize){free_table[k].flag=0;ad=free_table[k].address;xk=free_table[k].length;}else{free_table[k].length=free_table[k].length-xk;ad=free_table[k].address+free_table[k].length;}i=0;while(used_table[i].flag!=0&&i<n)i++;if(i>=n){printf("无表目填写已分分区,错误\n");if(free_table[k].flag==0)free_table[k].flag=1;else{free_table[k].length=free_table[k].length+xk;return;}}else{used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=J;}return;}void reclaim(char J){int i,k,j,s,t;float S,L;s=0;while((used_table[s].flag!=J||used_table[s].flag==0)&&s<n)s++;if(s>=n){printf("找不到该作业\n");return;}used_table[s].flag=0;S=used_table[s].address;L=used_table[s].length;j=-1;k=-1;i=0;while(i<m&&(j==-1||k==-1)){if(free_table[i].flag==1){if(free_table[i].address+free_table[i].length==S)k=i; if(free_table[i].address==S+L)j=i;}i++;}if(k!=-1)if(j!=-1) /* 上邻空闲区,下邻空闲区,三项合并*/ {free_table[k].length=free_table[j].length+free_table[k].length+L; free_table[j].flag=0;}else/*上邻空闲区,下邻非空闲区,与上邻合并*/free_table[k].length=free_table[k].length+L;else if(j!=-1) /*上邻非空闲区,下邻为空闲区,与下邻合并*/{free_table[j].address=S;free_table[j].length=free_table[j].length+L;}else /*上下邻均为非空闲区,回收区域直接填入*/{/*在空闲区表中寻找空栏目*/t=0;while(free_table[t].flag==1&&t<m)t++;if(t>=m) /*空闲区表满,回收空间失败,将已分配表复原*/{printf("主存空闲表没有空间,回收空间失败\n");used_table[s].flag=J;return;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return;}/*主存回收函数结束*/int main( ){printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t实验三存储管理实验\n");printf("\n\t\t\t可变式分区分配 (最佳适应算法)\n");printf("\t\t*********************************************\n");int i,a;float xk;char J;/*空闲分区表初始化:*/free_table[0].address=10240; /*起始地址假定为10240*/free_table[0].length=10240; /*长度假定为10240,即10k*/free_table[0].flag=1; /*初始空闲区为一个整体空闲区*/for(i=1; i<m; i++)free_table[i].flag=0; /*其余空闲分区表项未被使用*//*已分配表初始化:*/for(i=0; i<n; i++)used_table[i].flag=0; /*初始时均未分配*/{printf("功能选择项:\n1。
学号:28课程设计模拟设计页式存储管理的分题目配与回收学院计算机科学与技术专业计算机科学与技术班级XX姓名XX指导教师XXX2011年01月09日课程设计任务书学生姓名: XX 专业班级:计算机0902班指导教师: XXX 工作单位:计算机科学与技术学院题目: 模拟设计页式存储管理的分配与回收初始条件:1.预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会页式管理内存的分配和回收过程。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.采用页式管理方案实施内存分配和回收。
能够处理以下的情形⑴能够输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。
⑵要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。
2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收,撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日武汉理工大学《操作系统》课程设计说明书模拟设计页式存储管理的分配与回收1需求分析页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。
操作系统课程设计报告模拟页式存储管理院系:计算机科学技术学院班级:**********班姓名:*******学号:******************指导教师:*********82016年12月9日操作系统原理课程设计任务书一、题目:磁盘调度二、设计要求(1)****(组长)、*****负责设计与实现。
(2)查阅相关资料,自学具体课题中涉及到的新知识。
(3)采用结构化、模块化程序设计方法,功能要完善,具有一定的创新。
(4)所设计的程序应有输入、输出。
(5)按要求写出课程设计报告,并于设计结束后1周内提交。
其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。
报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。
总体设计应配合软件总体模块结构图来说明软件应具有的功能。
详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。
三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。
四、课程设计工作计划2016年11月28日,指导教师讲课,学生根据题目准备资料;2016年11月29日~2016年12月1日,进行总体方案设计;2016年12月3日~2016年12月5日,完成程序模块并通过独立编译;2016年12月6日~2016年12月7日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2016年12月8日~2016年12月9日,验收、撰写报告;指导教师签章:教研室主任签章操作系统原理课程设计指导教师评语与成绩目录第一章引言 (1)第二章设计目的及要求 (1)2.1 设计目的 (1)2.2 设计要求 (1)第三章概要设计 (2)3.1 系统功能结构 (2)3.2 程序文件详细说明 (3)3.3 整体流程图 (3)第四章详细设计 (4)4.1 数据定义 (4)4.2算法分析 (4)4.3核心代码与运行效果 (6)第五章软件调试 (18)5.1 系统测试 (18)5.2 算法效率分析和对比 (19)参考文献 ........................................................................ 错误!未定义书签。
第1篇一、实验目的1. 理解虚拟存储器的概念和作用。
2. 掌握分页式存储管理的基本原理和地址转换过程。
3. 熟悉几种常见的页面置换算法,并比较其优缺点。
4. 通过实验,加深对虚拟存储器管理机制的理解。
二、实验内容1. 模拟分页式存储管理中的地址转换过程。
2. 比较几种常见的页面置换算法:FIFO、LRU、LFU和OPT。
三、实验原理虚拟存储器是一种将内存和磁盘结合使用的存储管理技术,它允许程序使用比实际物理内存更大的地址空间。
虚拟存储器通过将内存划分为固定大小的页(Page)和相应的页表(Page Table)来实现。
1. 分页式存储管理分页式存储管理将内存划分为固定大小的页,每个页的大小相同。
程序在运行时,按照页为单位进行内存访问。
分页式存储管理的主要优点是内存碎片化程度低,便于实现虚拟存储器。
2. 页面置换算法当内存中没有足够的空间来存放新请求的页面时,需要将某个页面从内存中移除,这个过程称为页面置换。
以下介绍几种常见的页面置换算法:(1)FIFO(先进先出):优先淘汰最早进入内存的页面。
(2)LRU(最近最少使用):优先淘汰最近最少被访问的页面。
(3)LFU(最不频繁使用):优先淘汰最不频繁被访问的页面。
(4)OPT(最佳置换):优先淘汰未来最长时间内不再被访问的页面。
四、实验步骤1. 模拟分页式存储管理中的地址转换过程(1)创建一个模拟内存的数组,表示物理内存。
(2)创建一个模拟页表的数组,用于存放虚拟页号和物理页号之间的映射关系。
(3)模拟进程对内存的访问,将访问的虚拟页号转换为物理页号。
2. 比较几种常见的页面置换算法(1)创建一个模拟进程的数组,包含访问的虚拟页号序列。
(2)对每个页面置换算法,模拟进程的运行过程,记录缺页中断次数。
(3)计算不同页面置换算法的缺页率,并比较其性能。
五、实验结果与分析1. 分页式存储管理中的地址转换过程实验结果表明,分页式存储管理能够有效地将虚拟地址转换为物理地址,实现虚拟存储器。
操作系统存储管理实验报告总结篇一:东华大学操作系统存储管理实验报告东华大学计算机学院操作系统实验报告实验名称:存储管理问题姓名:姜元杰学号:111310228班级:计算机1102 指导老师:李继云报告日期: XX/11/2一、实验概述1. 实验目标存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。
2. 实验要求1) 通过随机数产生一个指令序列,共320条指令,指令的地址按下述原则生成:? 50%的指令是顺序执行的;? 25%的指令是均匀分布在前地址部分。
? 25%的指令是均匀分布在后地址部分。
2) 将指令序列变换成页地址流? 页面大小 = 10条指令? 4页? 用户虚存容量 = 32页;? 在用户虚存中,按每K存放10条指令排列虚存地址3) 计算并输出下述各种算法在不同内存容量下的命中率。
? 先进先出的算法(FIFO);? 最近最少使用算法(LRU);? 最佳淘汰算法(OPT);? 命中率=1-页面失效次数/页地址流长度;输出以表结构输出,行头是页码,列头是对应替换算法。
在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
二、实验内容1. 设计思路总体思路:设计存储管理类(class StorageManagemen),封装FIFO,LRU,OPT算法实现函数与各自所需公共或个体数据机构和公共代码部分,实现“TOP-DOWN”的程序设计思想,增强代码结构性和可读性。
1) 先进先出的算法(FIFO):FIFO是最简单的页置换算法,FIFO的页置换的算法为每个页记录着该页调入内存的时间。
当必须置换一页时,将选择最旧的页。
注意并不需要记录调入一页的确切时间,可以创建一个FIFO队列来管理内存中的所有页。
队列中的首页将被置换。
课程设计任务书学生姓名:专业班级:计网2093班指导教师:工作单位:信息工程系设计题目:设计一个虚拟存储区和内存工作区初始条件:Linux操作系统,GCC编译环境要求完成的主要任务主要任务:通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。
1、最佳淘汰算法(OPT)2、先进先出的算法(FIFO)3、最近最久未使用算法(LRU)设计程序时先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
设计报告撰写格式要求:1设计题目与要求 2 设计思想3系统结构 4 数据结构的说明和模块的算法流程图5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)7 自我评价与总结8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;时间安排6月 20日布置课程设计任务;分配题目后,查阅资料、准备程序;6月 21 ~6月23 日上机调试程序、书写课程设计报告;6月24 日提交课程设计报告及相关文档。
指导教师签名:2011年6月18日系主任签名:2011年6月19日课程设计报告书一.设计题目:设计一个虚拟存储区和内存工作区二.设计要求:1、设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。
①最佳淘汰算法(OPT)②先进先出的算法(FIFO)③最近最久未使用算法(LRU)设计程序时先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
2、所编辑的程序能够在Linux系统中GCC环境下正常运行。
课程设计模拟设计页式存储管理的分题目配与回收学院计算机科学与技术专业计算机科学与技术班级XX姓名XX指导教师XXX2011 年01月09 日课程设计任务书学生姓名:XX _________ 专业班级:计算机0902班____________ 指导教师:XXX ________ 工作单位:计算机科学与技术学院题目:模拟设计页式存储管理的分配与回收初始条件:1•预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会页式管理内存的分配和回收过程。
2•实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1•采用页式管理方案实施内存分配和回收。
能够处理以下的情形⑴ 能够输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。
⑵ 要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。
2•设计报告内容应说明:⑴课程设计目的与功能;⑵ 需求分析,数据结构或模块说明(功能与框图);⑶ 源程序的主要部分;⑷ 测试用例,运行结果与运行情况分析;⑸ 自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收,撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:模拟设计页式存储管理的分配与回收1需求分析页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。
课程设计课程设计名称:计算机操作系统专业班级:计算机科学与技术学生姓名:学号:指导教师:课程设计时间:操作系统专业课程设计任务书说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页目录一、设计目的为了掌握Linux环境下常用编译工具如gcc/g++/nasm及开源虚拟机bochs 的下载、安装、使用,掌握x86架构下分页式存储管理系统的基本原理,设计一个请求分页式虚拟存储系统。
掌握Linux系统下程序的编写及运行等方面展开实验。
二、设计要求2.1要求熟练掌握sudo apt-get install的用法。
2.2要求能够掌握分页存储管理系统的基本原理。
2.3要求学会在Linux系统下编写程序、执行程序。
三、设计内容3.1运行环境3.1.1虚拟机系统下3.1.2使用Ubuntu下提供的apt-get软件包安装工具安装vim、 g++ 、nasm 、bochs等3.2 2.详细设计1)回顾虚拟页式存储系统:作业分页,内存分块,只有当进程要使请认真阅读readme.txt文件,弄清楚各个文件的作用2)用其虚拟内存时,其对应的数据才装入物理内存。
3)完成frame_pool.H 、frame_pool.C 、page_table.C三个文件,其中page_table.H已经提供,我们需要添加page_table.C,自己设计并实现这些函数。
4)在frame_pool.H定义所需要的数据结构,在frame_pool.C完成这些函数。
添加代码如下所示:class FramePool {private: unsigned long base_frame_no; unsigned long nframes;unsigned long info_frame_no; unsigned char* free_frames;public:static const unsigned char USED -1;static const unsigned char UNUSED -0;static const unsigned int FRAME_SIZE -4096;public:FramePool(unsigned long _base_frame_no,unsigned long_nframes,unsigned long _info_frame_no);5)建立Frame_pool.C文件系统中使用位示图bitmap标识页面是否使用,start_frame表示第一个页面的起始地址(如系统内存池从2M开始),pool_size表示在用户池中页框的总数(如系统内存池的页框从2M~4M,因此共有(4M-2M)/4KB=512个页框)。
段页式存储模拟课程设计一、教学目标本课程旨在让学生了解和掌握段页式存储的基本原理和实现方法。
知识目标要求学生理解内存管理的重要性,掌握分页和分段的基本概念,了解虚拟内存的实现机制。
技能目标要求学生能够使用编程语言实现简单的段页式存储管理系统,能够分析程序的内存使用情况。
情感态度价值观目标则是培养学生对计算机科学的兴趣,提高他们解决实际问题的能力。
二、教学内容本课程的教学内容主要包括四个部分:内存管理概述、分页存储管理、分段存储管理、段页式存储管理。
首先,通过介绍内存管理的基本概念,使学生了解内存管理的重要性。
然后,讲解分页和分段的原理及其优缺点,让学生掌握不同的内存管理技术。
接着,详细介绍虚拟内存的实现机制,使学生了解如何利用硬盘来扩展内存。
最后,通过实例分析,让学生了解段页式存储管理的具体实现。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法。
首先是讲授法,通过讲解内存管理的基本概念、原理和实现方法,使学生掌握理论知识。
然后是讨论法,引导学生针对实际问题进行思考和讨论,提高他们的解决问题的能力。
此外,还将采用案例分析法和实验法,让学生通过分析实际案例和动手实验,加深对内存管理技术的理解和掌握。
四、教学资源为了支持教学内容和教学方法的实施,我们将选择和准备多种教学资源。
教材方面,我们将使用《计算机组成与设计》等经典教材,为学生提供系统的理论知识。
参考书方面,我们将推荐《现代操作系统》等书籍,供学生深入研究。
多媒体资料方面,我们将制作PPT和视频教程,以直观的方式呈现复杂的原理和实现过程。
实验设备方面,我们将准备计算机实验室,让学生能够动手实践,提高实际操作能力。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分。
平时表现主要评估学生在课堂上的参与程度和讨论表现,通过观察和记录来评价学生的学习态度和积极性。
作业则是对学生理解力和应用能力的考察,通过布置相关的编程练习和理论题目,评估学生对知识的掌握程度。
..一、目的和要求1、设计目的通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
2、设计要求根据模拟的页式管理设计,掌握在页式存储管理中最基本的三种页面调度算法FIFO、LRU以及OPT。
但在三种算法中均要求在调度程序中产生的页面序列是随机产生的,而不是人为的输入,在执行时只需改变页面的大小及存容量就可以得到不同的页面序列,另外还需要说明随机的性能和其性能可能对算法的影响,并对随机性要有一定的参数控制能力。
此外,计算并输出FIFO、LRU以及OPT算法在不同存容量下的命中率。
根据法的执行过程,编写一个解决上述问题的程序,显示访问每个值页面中的值。
具体参数:访问串的长度,访问串,页面个数。
分别用3种不同的法实现页面的置换,并输出相关信息。
二、设计思路及过程1、概要设计1.1 问题概述根据三种不同的置换算法,依据其不同的算法式,分别计算该算法在不同情况下的命中率,并显示各页面的变化情况。
1.2 容分析对于该课程设计中模拟的页式存储管理的页面置换过程,只要掌握其中最基本的三种算法,包括FIFO、LRU及OPT。
但最重要的一点就是要求产生随机序列,所以在编写程序时要采用控制产生随机值的种子数函数,如此能产生随机的访问序列。
另外,不能在执行完一次操作后就只能进行另外一种算法的操作,必须还要有更加详细的操作,比如:是否要重新得到新序列?还是要不改变访问序列而只改变访问串的存容量?抑或是不操作就退出该算法以进行下一种调度算法?因此,在执行完每次操作后都必须要有提示语,看是否进入更细节的操作,还是退出本次算法的操作以进入下一种算法的调度。
2、过程设计2.1模块设计在下图的主模块设计图中,只注重描绘了页式存储管理的三种主要算法,未描绘出细节部分。
其中,在执行每种算法时都会要求输入你所需要的访问串长度、随机值以及同一种算法的不同存容量,如此就可以得出不同的命中率。
另外,在执行完该操作后又会出现三条提示语,是重新得到新序列?还是不改变访问序列只改变访问串的存容量?抑或是不操作退出以进行下一种调度算法?这些在下图中都未一一实现。
=2.2 算法原理分析要学成功实现算法,首先要知道各个法是怎么做的,即原理是怎样的,下面是三种算法的原理。
FIFO算法是先进先出,当当前存中没有正要访问的页面时,置换出最先进来的页面。
LRU算法是最近最久未使用,当当前存中没有正要访问的页面时,置换出在当前页面中最近最久没有使用的页面。
OPT算法是未来最远出现,当当前存中没有正要访问的页面时,置换出当前页面中在未来的访问页中最远出现的页面或再也不出现的页面。
2.3 程序流程图本次课程设计的主要流程是3种置换算法的流程图,本人负责OPT,流程图如下所示:图2.2 OPT算法流程图三、数据定义int length,num_page,count,seed; //length记录访问串的长度,num_page页面数,count记录缺页次数int result[20][30],order[30],a[10]; //result记录结果,order存储访问串,a存储当前页面中的值int pos1,flag1,flag2,flag3; //pos1位置变量,flag1等为标志变量char result1[30]; //记录缺页数组四、核心代码三种置换算法中只列出本人负责部分(OPT算法),具体代码及注释如下:void opt() //理想型{int i,pos[10],flag[10];//i为for循环控制语句,pos为位置变量,flag标志变量while(1){flag1=flag2=0;for(i=0;i<length;i++)//访问串遍历{if(!search(order[i]))//查询要访问的页是否在存中{count++;result1[i]='*';if(a[num_page-1]!=-1) //表示当前页面已满要淘汰一个{memset(pos,-1,sizeof(pos));//初始pos数组memset(flag,0,sizeof(flag));//初始flag数组int j,k;for( j=i;j<length;j++)//找当前页中的值在将来访问串中对应最近位置{for( k=0;k<num_page;k++){if(order[j]==a[k]&&flag[k]==0){pos[k]=j;flag[k]=1;}}}cout<<endl;int max=-10,max_pos;for( k=0;k<num_page;k++)//找出位置最远的那个值{if(pos[k]==-1)//未出现则跳出,替换该值{max_pos=k;break;}else if(max<pos[k]){max=pos[k];max_pos=k;}}a[max_pos]=order[i];}else //还有空页,直接调入存{for(int j=0;j<num_page;j++){if(a[j]==-1){a[j]=order[i];break;}}}}else result1[i]=' ';for(int j=0;j<num_page;j++){result[j][i]=a[j];}}again(); //再操作if(flag1==0&&flag2==0)break;}}其中的查询函数search()具体代码如下:bool search(int n) //查找当前存中是否已存在该页{int i;for(i=0;i<num_page;i++){if(a[i]==n)return true;}return false;}其中的再操作函数again(),具体代码如下:void again() //用于再输入{print();int numpage,m;printf("************************************** \n");printf(" 1.重新输入新序列.\n");printf(" 2.不改变访问序列只改变页面数.\n");printf(" 0.不操作退出.\n");printf("************************************** \n");printf(" 选择所要操作:");scanf("%d",&m);if(m==1){flag1=1; //重新输入init();}else if(m==2){flag2=1;cout<<"输入新页面数:";cin>>numpage;num_page=numpage;memset(a,-1,sizeof(a));}else return ;}五、运行截图根据不同的分工,限于纸只列出部分截图,以下是对OPT调度算法的实验截图:图5.1 相同的存容量下不同的访问串序列1图5.2 相同的存容量下不同的访问串序列2依上图5.1和5.2来看,OPT调度算法在访问串长度一致,随机值不同以致产生不同的访问串序列时,但页面数相同的情况下,所得到的命中率也不同。
图5.3 不同的存容量下相同的访问串序列在上图5.3中就是对同一访问串序列进行OPT调度,只是改变其页面的大小,得到了不同的命中率。
六、小结生程序,并说明随机的性能和其性能可能对算法的影响,对随机性要有一定的参数控制能力;计算并输出FIFO及LRU算法在不同存容量下的命中率。
做了这么多次课程设计了,大致的过程都熟悉了,每次的动手实践,调动了我们主动学习的积极性, 并引导我们根据实际编程要求, 训练自己实际分析问题的能力及编程能力, 并养成良好的编程习惯。
通过详细的实例, 循序渐进地启发我们完成设计课程设计将要求。
从拿到题目到完成整个编程,从理论到实践可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
知识的获得是无止境的,只要你想学,只要你行动,就一定会有所收获的。
回首这两个星期的课程设计,尽管很是头痛,很多都不会,但经过努力,我们还是学了不少知识的。
这期间,老师给了我们多帮助,非常感!附录所有源程序代码如下:#include<iostream>#include<stdlib.h>using namespace std;int length,num_page,count,seed;int result[20][30],order[30],a[10];int pos1,flag1,flag2,flag3;char result1[30];void init(){memset(a,-1,sizeof(a));int i;cout<<"输入访问串的长度:";cin>>length;cout<<"输入种子数控制产生的随机值:";cin>>seed;srand(seed);cout<<"产生的随机访问串:";for(i=0;i<length;i++){// cin>>order[i];order[i]=rand()%10;cout<<order[i]<<" ";}cout<<endl;cout<<"输入页面的个数:";cin>>num_page;}void print(){int i,j;cout<<"(*表示缺页)"<<endl;cout<<endl;for( j=0;j<length;j++)printf("%2d ",order[j]);cout<<endl;for( i=0;i<num_page;i++){for( j=0;j<length;j++){if(result[i][j]==-1){printf(" ");}elseprintf("%2d ",result[i][j]);}cout<<endl;}for( j=0;j<length;j++){printf("%2c ",result1[j]);}cout<<endl;cout<<"缺页率:"<<count<<"/"<<length;printf("=%.1lf",(count*1.0)/(length*1.0)*100);cout<<"%"<<endl;}bool search(int n) //查找当期存是否已存在{int i;for(i=0;i<num_page;i++){if(a[i]==n)return true;}return false;}void again() //用于再输入{print();int numpage,m;printf("************************************** \n");printf(" 1.重新输入新序列.\n");printf(" 2.不改变访问序列只改变页面数.\n");printf(" 0.不操作退出.\n");printf("************************************** \n");printf(" 选择所要操作:");scanf("%d",&m);if(m==1)flag1=1; //重新输入init();}else if(m==2){flag2=1;cout<<"输入新页面数:";cin>>numpage;num_page=numpage;memset(a,-1,sizeof(a));}else return ;}void fifo() //先进先出{int i,thisn=0;while(1){count=0;flag1=flag2=0;for(i=pos1;i<length;i++){if(!search(order[i])){count++;result1[i]='*';if(a[num_page-1]!=-1) //表示当前页面已满要淘汰一个{a[thisn]= order[i];thisn++;if(thisn>=num_page)thisn=0;}else{for(int j=0;j<num_page;j++){if(a[j]==-1){a[j]=order[i];break;}}}}else result1[i]=' ';for(int j=0;j<num_page;j++){result[j][i]=a[j];}again(); //再操作if(flag1==0&&flag2==0)break;}}void lru() //最久最近没使用{int i,pos[10];while(1){count=0;flag1=flag2=0;memset(pos,-1,sizeof(pos));for(i=pos1;i<length;i++){if(!search(order[i])){count++;result1[i]='*';if(a[num_page-1]!=-1) //表示当前页面已满要淘汰一个{int j,k;for( j=0;j<i;j++) //查找当前页中的值对应的最近位置{for( k=0;k<num_page;k++){if(order[j]==a[k]){pos[k]=j;}}}int min=pos[0],min_pos=0;for( k=1;k<num_page;k++)//找出位置最远的那个{if(min>pos[k]){min=pos[k];min_pos=k;}}a[min_pos]=order[i];}else //还有空页{for(int j=0;j<num_page;j++){if(a[j]==-1){a[j]=order[i];break;}}}}else result1[i]=' ';for(int j=0;j<num_page;j++){result[j][i]=a[j];}}again(); //再操作if(flag1==0&&flag2==0)break;}}void opt() //理想型{int i,pos[10],flag[10];while(1){flag1=flag2=0;for(i=0;i<length;i++){if(!search(order[i])){count++;result1[i]='*';if(a[num_page-1]!=-1) //表示当前页面已满要淘汰一个{memset(pos,-1,sizeof(pos));memset(flag,0,sizeof(flag));int j,k;for( j=i;j<length;j++)//找出当前页中的值在将来访问串中对应的最近位置{for( k=0;k<num_page;k++){if(order[j]==a[k]&&flag[k]==0){pos[k]=j;flag[k]=1;}}}cout<<endl;int max=-10,max_pos;for( k=0;k<num_page;k++)//找出位置最远的那个值{if(pos[k]==-1)//未出现则跳出,替换该值{max_pos=k;break;}else if(max<pos[k]){max=pos[k];max_pos=k;}}a[max_pos]=order[i];}else //还有空页{for(int j=0;j<num_page;j++){if(a[j]==-1){a[j]=order[i];break;}}}}else result1[i]=' ';for(int j=0;j<num_page;j++){result[j][i]=a[j];}}again(); //再操作if(flag1==0&&flag2==0)break;}}void mune(){int m;printf("\n**************************************\n\n");printf(" 动态分配分区法演示\n");printf("\n************************************** \n\n");printf(" 1.先进先出算法.\n\n");printf(" 2.最久最近未使用页面置换算法.\n\n");printf(" 3.理想型淘汰算法.\n\n");printf(" 0.退出程序.\n");printf("\n************************************** \n");printf("\n 选择所要操作:");scanf("%d",&m);switch(m){case 1:init();fifo( );mune();break;case 2:init();lru( );mune();break;case 3:init();opt( );mune();break;case 0:break;default:printf("选择错误,重新选择.");mune();}}void main() //主函数{mune();}。