《存储管理实验报告》由会员分享,可在线阅读,更多相关《存储管理实验报告(29页珍藏版)》请在金锄头文库上搜索。
1、昆明理工大学信息工程与自动化学院学生实验报告( 2012 2013 学年 第 二 学期 )课程名称:操作系统 开课实验室: 年 月 日年级、专业、班学号姓名成绩实验项目名称存储管理指导教师杨云飞教师评语 教师签名: 年 月 日一、实验目的存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。通过本次实验,要求学生通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解,通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。二、实验原理及基本技术路线图(方框原理图)用C或C+语言模拟实现请求式分页管理。要求实现:
2、页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。int subareaSizenum=8,12,16,32,24,16,64,128,40,64;/分区大小Process *pro=NULL;/保持进程信息int ProcessNum=0;/进程数目int applyProcessNum=0;/每次申请进程数目int maxApplyNum=0;/最大可申请数目int *applyIndex=NULL;/申请进程队列int totalApplyNum=0;/申请总数int *assignPointer=NULL;/
3、已分配内存的进程队列int assignFlag=0;/分配索引,表示已申请队列已分配的进程数int exeIndex;/执行的进程号Node *subareaNode=new Node3;/分区回收时,进程所在分区及其前,后分区信息LinkList createLinkList(int n );/建立空闲分区链Node firstFit(LinkList &head,Process pro);/首次适应算法Node nestFit(LinkList &head,Process pro,Node flag);/循环适应算法Node bestFit(LinkList &head,Process
4、pro);/最佳适应算法Node worstFit(LinkList &head,Process pro);/最坏适应算法Node assign(LinkList &head,int orderIndex,int index,Node flagNode);/一次分区分配int assignMemory(LinkList &head);/内存分配void insertNode(LinkList &head,Node q,int index);/插入节点Node deleteNode(LinkList &head,int index);/删除节点int display(LinkList &head
5、);/打印分区分配情况int lowAttemper(int *excursionPointer);/低级调度int findSubarea(LinkList &head,int index);/回收内存int creatProcess();/创建进程Process* randomCreatPro(int n);/随机产生进程下面是各种方法简述:(1) 最优替换算法,即OPT算法。上面介绍的几种页面替换算法主要是以主存储器中页面调度情况的历史信息为依据的,它假设将来主存储器中的页面调度情况与过去一段时间内主存储器中的页面调度情况是相同的。显然,这种假设不总是正确的。最好的算法应该是选择将来最久
6、不被访问的页面作为被替换的页面,这种替换算法的命中率一定是最高的,它就是最优替换算法。要实现OPT算法,唯一的办法是让程序先执行一遍,记录下实际的页地址流情况。根据这个页地址流才能找出当前要被替换的页面。显然,这样做是不现实的。因此,OPT算法只是一种理想化的算法,然而,它也是一种很有用的算法。实际上,经常把这种算法用来作为评价其它页面替换算法好坏的标准。在其它条件相同的情况下,哪一种页面替换算法的命中率与OPT算法最接近,那么,它就是一种比较好的页面替换算法。 (2)先进先出算法,即FIFO算法(First-In First-Out algorithm)。这种算法选择最先调入主存储器的页面作
7、为被替换的页面。它的优点是比较容易实现,能够利用主存储器中页面调度情况的历史信息,但是,没有反映程序的局部性。因为最先调入主存的页面,很可能也是经常要使用的页面。(3) 最久没有使用算法,即LRU算法(Least Recently Used algorithm)。这种算法把近期最久没有被访问过的页面作为被替换的页面。它把LFU算法中要记录数量上的多与少简化成判断有与无,因此,实现起来比较容易。 (4) 近期最少使用算法,即LFU算法(Least Frequently Used algorithm)。这种算法选择近期最少访问的页面作为被替换的页面。显然,这是一种非常合理的算法,因为到目前为止最少
8、使用的页面,很可能也是将来最少访问的页面。该算法既充分利用了主存中页面调度情况的历史信息,又正确反映了程序的局部性。但是,这种算法实现起来非常困难,它要为每个页面设置一个很长的计数器,并且要选择一个固定的时钟为每个计数器定时计数。在选择被替换页面时,要从所有计数器中找出一个计数值最大的计数器。因此,通常采用如下一种相对比较简单的方法。 (5) 最近未使用法缺页中断率 = 缺页中断次数总的页面引用次数*100%三、所用仪器、材料(设备名称、型号、规格等)。计算机一台四、 实验方法、步骤# include # include # include # include # include #defin
9、e Size 4#define num 10typedef int byte;typedef struct byte subareaSize;/分区大小int startLoc;/起始地址int index;/ 分区号SubareaTable;/分区表typedef struct node/ 结点SubareaTable subarea;/ 分区struct node *next;int status;/状态位0(空闲)1(使用)*Node,*LinkList;typedef struct byte processSize;int subareaIndex;/保存分区号int status;/
10、进程状态,0(新建)1(执行)-1(终止)-2(未绪。申请但没有分配内存)2(就绪,已分配内存)Process;/进程int subareaSizenum=8,12,16,32,24,16,64,128,40,64;/分区大小Process *pro=NULL;/保持进程信息int ProcessNum=0;/进程数目int applyProcessNum=0;/每次申请进程数目int maxApplyNum=0;/最大可申请数目int *applyIndex=NULL;/申请进程队列int totalApplyNum=0;/申请总数int *assignPointer=NULL;/已分配内存
11、的进程队列int assignFlag=0;/分配索引,表示已申请队列已分配的进程数int exeIndex;/执行的进程号Node *subareaNode=new Node3;/分区回收时,进程所在分区及其前,后分区信息LinkList createLinkList(int n );/建立空闲分区链Node firstFit(LinkList &head,Process pro);/首次适应算法Node nestFit(LinkList &head,Process pro,Node flag);/循环适应算法Node bestFit(LinkList &head,Process pro);
12、/最佳适应算法Node worstFit(LinkList &head,Process pro);/最坏适应算法Node assign(LinkList &head,int orderIndex,int index,Node flagNode);/一次分区分配int assignMemory(LinkList &head);/内存分配void insertNode(LinkList &head,Node q,int index);/插入节点Node deleteNode(LinkList &head,int index);/删除节点int display(LinkList &head);/打印
13、分区分配情况int lowAttemper(int *excursionPointer);/低级调度int findSubarea(LinkList &head,int index);/回收内存int creatProcess();/创建进程Process* randomCreatPro(int n);/随机产生进程LinkList createLinkList(int n)/建立空闲分区链cout -创建分区-endl;LinkList head; Node p; head=(LinkList)malloc(sizeof(node); if(head=NULL) cout头结点分配错误nex
14、t=NULL;/链表尾巴设置为NULL LinkList q=head; int start=0; for(int i=1;i=n;i+) p=(Node)malloc(sizeof(node); if(p=NULL) cout节点分配错误next=q-next; q-next=p; q=p; p-subarea.index=i; p-subarea.subareaSize=subareaSizei-1;/分区表赋值大小 p-subarea.startLoc=start; p-status=0; start+=subareaSizei-1; cout分区创建成功!endl; return head;Node firstFit(LinkList &head,Process pro)/首次适应算法 Node p=head