OS实验报告之内存管理.docx
- 文档编号:7674807
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:8
- 大小:81.86KB
OS实验报告之内存管理.docx
《OS实验报告之内存管理.docx》由会员分享,可在线阅读,更多相关《OS实验报告之内存管理.docx(8页珍藏版)》请在冰豆网上搜索。
OS实验报告之内存管理
OS实验报告之内存管理
软工0801罗小兰U200818069
◆实验目的
理解操作系统虚拟存储管理的原理,理解程序执行局部性的概念。
◆实验内容
设计一个虚拟存储区和内存工作区,并使用下列算法计算访问命中率。
(1)进先出的算法(FIFO)
(2)最近最少使用的算法(LRU)
(3)最佳淘汰算法(OPT)
命中率=(1-页面失效次数)/页地址流长度
◆实验环境
VS2010,CONSOLE程序,(已生成.exe可执行文件)
◆实验要求
1、理解FIFO,LRU算法原理,理解参考程序的原理和实现思路。
2、完成程序的设计,重点完成FIFO,LRU算法
3、分析运算结果,在分配不同的物理块情况下,各算法的缺页情况有什么规律?
4、完成OPT算法
◆程序设计思想
本实验的程序设计基本上按照实验内容进行。
即首先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
实验中我们产生320条指令,每个虚拟页存放10条指令。
进程分配的物理块从4变化到32。
◆程序设计
本实验分为三部分:
1.main函数负责获得指令,并且对指令进行纸质转变操作,再调用三种不同的算法。
2.Initialize函数负责初始化内存区域和虚拟地址数组
3.FIFO函数以先进先出的方式淘汰内存
LRU函数以最近最少使用的方式淘汰内存
OPT函数以最佳的方式淘汰内存
◆关键代码粘贴:
//先进先出淘汰算法
voidFIFO(inttotal_pf)
{
inti,j;
pp_type*p,*t;
initialize(total_pf);
busy_pp_head=busy_pp_tail=NULL;
for(i=0;i { if(vp_array[page_of_instruction[i]].no_of_pp==INVALID) { counter_page_default+=1; if(free_pp_head==NULL) { p=busy_pp_head->next; vp_array[busy_pp_head->no_of_vp].no_of_pp=INVALID; free_pp_head=busy_pp_head; free_pp_head->next=NULL; busy_pp_head=p; } p=free_pp_head->next; free_pp_head->next=NULL; free_pp_head->no_of_vp=page_of_instruction[i]; vp_array[page_of_instruction[i]].no_of_pp=free_pp_head->no_of_pp; if(busy_pp_tail==NULL) busy_pp_head=busy_pp_tail=free_pp_head; else { busy_pp_tail->next=free_pp_head; busy_pp_tail=free_pp_head; } free_pp_head=p; } } printf("FIFO缺页率: %6.4f",(float)counter_page_default/320); return; } //最近最少淘汰使用算法 voidLRU(inttotal_pf) { intmin,minj,i,j,present_time;//访问时刻¨¬ initialize(total_pf); present_time=0; for(i=0;i { if(vp_array[page_of_instruction[i]].no_of_pp==INVALID) { counter_page_default++; if(free_pp_head==NULL)//无空闲页面? { min=MAXI; for(j=0;j if(min>vp_array[j].time&&vp_array[j].no_of_pp! =INVALID) { min=vp_array[j].time; minj=j; } free_pp_head=&pp_control[vp_array[minj].no_of_pp]; vp_array[minj].no_of_pp=INVALID; vp_array[minj].time=-1; free_pp_head->next=NULL; } vp_array[page_of_instruction[i]].no_of_pp=free_pp_head->no_of_pp; vp_array[page_of_instruction[i]].time=present_time; free_pp_head=free_pp_head->next; } else vp_array[page_of_instruction[i]].time=present_time;//使用 present_time++; } printf("LRU缺¨¡À页°3率¨º: êo%6.4f",(float)counter_page_default/320); return; } //最佳淘汰算法 voidOPT(inttotal_pf) { inti,j,k; intdistance_of_page[NUMBER_OF_VP]={0};//记录每个在内存块中页面离下次使用的距离 intmax_distance_page=0;//记录最大距离块号 initialize(total_pf); for(i=0;i { if(vp_array[page_of_instruction[i]].no_of_pp==INVALID) { counter_page_default++;//记录缺页次数 if(free_pp_head==NULL)//无空闲页面? {//释放最远将用到的页面 free_pp_head=&pp_control[max_distance_page]; //将空页指针指向淘汰的页面 vp_array[free_pp_head->no_of_vp].no_of_pp=INVALID; //设置该页已经不在内存中 pp_control[max_distance_page].no_of_vp=-1;//清空该内存块的引用 free_pp_head->next=NULL;//单个空页,无next } distance_of_page[free_pp_head->no_of_pp]=1; //该页将要调用的页面在前一个 vp_array[page_of_instruction[i]].no_of_pp=free_pp_head->no_of_pp; //将该页放到空页中 pp_control[free_pp_head->no_of_pp].no_of_vp=vp_array[page_of_instruction[i]].no_of_vp;//设置内存引用 free_pp_head=free_pp_head->next; //指向下一个空页,如果为NULL,说明执行了之前的if段代码 } for(j=0;j =-1;j++) //循环所有已占用的内存 { distance_of_page[j]--;//引用一个页面后,所有距离-1 if(distance_of_page[j]==0)//及当前为新页面或者有相同引用 { for(k=i+1;k { distance_of_page[j]++;//距离+1 if(pp_control[j].no_of_pp==vp_array[page_of_instruction[k]].no_of_pp) { break;//当发现最近一个将来会引用的相同页面后记录位置 } } //max_distance_page为最远一个将要用到的page的序号 max_distance_page=distance_of_page[max_distance_page]>distance_of_page[j]? max_distance_page: j; } } } printf("OPT缺¨¡À页°3率¨º: êo%6.4f",(float)counter_page_default/320); return; } 【输出结果】 附录1. 【重要变量、结构和函数的建议】 (1)页面类型 typedefstruct { intpn; intpfn; intcounter; inttime }pl-type; 其中pn为页号,pfn为面号,counter为一个周期内访问该页面的次数,time为访问时间。 (2)页面控制结构 pfc_struct { intpn,pfn; structpfc_struct*next; } typedefstructpfc_structpfc_type; pfc_typepfc_struct[total_vp],*freepf_head,*busypf_head; pfc_type*busypf_tail; 其中: pfc[total_vp]定义用户进程虚页控制结构。 *freepf_head为空页面头的指针。 *busypf_head为忙页面头的指针。 *busypf_tail为忙页面尾的指针。 (3)函数定义 voidinitialize(): 初始化函数,给每个相关的页面赋值。 voidFIFO(): 计算使用FIFO算法时的缺页率。 voidLRU(): 计算使用LRU算法时的缺页率。 voidOPT(): 计算使用OPT算法时的缺页率。 (4)变量定义 inta[total_instruction]: 指令流数据组。 intpage[total_instruction]: 每条指令所属的页号。 intoffset[total_instruction]: 每页装入10条指令后取模运算页号偏移值。 inttotal_pf: 用户进程的内存页面数。 intcounter_page_default: 页面失效次数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OS 实验 报告 之内 管理