当前位置:文档之家› 实验四 虚拟存储器管理

实验四 虚拟存储器管理

实验四虚拟存储器管理一、实验目的1、为了更好的配合《操作系统》有关虚拟存储器管理章节的教学。

2、加深和巩固学生对于请求页式存储管理的了解和掌握。

3、提高学生的上机和编程过程中处理具体问题的能力。

二、实验内容请求页式存储管理是一种常用的虚拟存储管理技术。

本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

1.通过随机数产生一个指令序列,共320条指令。

指令的地址按下述原则生成:a.50%的指令是顺序执行的。

b.25%的指令是均匀分布在前地址部分。

c.25%的指令是均匀分布在后地址部分。

具体的实施方法是:a.在[0,319]指令地址之间随机选取一起点;b.顺序执行一条指令,即执行地址为m+1的指令;c.在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’;d.顺序执行一条指令,其地址为m’;e.在后地址[m’+2,319]中随机选取一条指令并执行;f.重复上述步骤a~e,直到执行320次指令。

2.将指令序列变换成为页地址流设:a.页面大小为1K;b.用户内存容量为4到32页;c.用户虚存容量为32K。

在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条~第9条指令为第0页,对应虚存地址为[0,9];第10条~第19条指令为第1页,对应虚存地址为[10,19]..第310条~第319条指令为第31页,对应虚存地址为[310,319]。

按以上方式,用户指令可组成32页。

3、输出下述各种算法在不同内存容量下的命中率。

a.先进先出的算法;b.最近最少访问算法;c.最近最不经常使用算法。

其中:命中率=1-页面失效次数/页地址流长度页地址流长度为320,页面失效次数为每次访问相同指令时,该指令所对应的页不在内存的次数。

三、实验要求实验课时4学时。

要求画出利用各种算法置换时的置换图,并可以分析说明。

编程可分为几个部分完成:指令的分页,算法的选择,算法的实现,命中率的输出。

编写程序前可先阅读Linux源代码页面换入:static int do_swap_page(struct mm_struct * mm,struct vm_area_struct * vma,unsigned long address,pte_t * page_table,swp_entry_t entry,int write_access){struct page *page = lookup_swap_cache(entry);pte-t pte;if (!pgae){lock_kernel( );swapin_readahead(entry);page = read_swap_cache(entry);unlock_kernel( );if (!page)return -1;flush_page_to_ram(page);flush_icache_page(vma,page);}mm->rss++;pte = mk_pte(page,vma->vm_page_prot);/**Freeze the "shared" ness of the page,ie page_count + swap_count.*Must lock page before transferring our swap count to already*obtained apge count.*/lock_page(page);swap_free(entry);if (write_access && !is_page_shared(page))pte = pte_mkwrite(pte_mkdirty(pte));UnlockPage(page);set_pte(page_table,pte);/*No need to invalidate - it was non-present before */update_mmu_cache(vma,address,pte);return 1; /*Minor fault */}四、源程序指导#include <stdlib.h>#include <stdio.h>#include <math.h>int i,M,j,k,s,h,t;char r;float int_count,page_count,v;float vc[29];int l,m,n,o,p;int address[320];int page[32][10],pageNo[32],page_Index[200],page_IndexNo[200],page_change[200];pagechange(){for(i=0;i<32;i++){for(j=0;j<10;j++)page[i][j]=10*i+j;pageNo[i]=i;}}Ram_Make(){int x,y;Loop1:l=random(319);if(l>1)m=l+1;elsegoto Loop1;Loop2:x=random(319);if(x<l-1){n=x;o=n+1;}elsegoto Loop2;Loop3:y=random(319);if(y>o)p=y;elsegoto Loop3;}fifo(){for(s=4;s<=32;s++){page_change[0]=page_IndexNo[0];int_count=1;page_count=1;for(h=1;h<5*M;h++){if(page_IndexNo[h]!=page_IndexNo[h-1])page_count+=1;for(t=0;t<s;t++){if(page_IndexNo[h]==page_change[t])goto Loop8;else if(page_IndexNo[h]!=page_change[t] && page_change[t]==999){page_change[t]=page_IndexNo[h];int_count++;goto Loop8;}}for(k=0;k<s;k++)page_change[k]=page_change[k+1];page_change[s-1]=page_IndexNo[h];int_count+=1;Loop8:;}v=int_count/page_count;vc[s-4]=1-v;printf("Vc for page %d: vc[%d]=%.3f $$$ ",s,s-4,vc[s-4]); for(i=0;i<200;i++)page_change[i]=999;}}lru(){int q,temp;for(s=4;s<=32;s++){page_change[0]=page_IndexNo[0];page_count=1;int_count=1;for(h=1;h<5*M;h++){if(page_IndexNo[h]!=page_IndexNo[h-1])page_count+=1;for(t=0;t<s;t++){if(page_IndexNo[h]!=page_change[t] && page_change[t]==999) {page_change[t]=page_IndexNo[h];int_count++;goto Loop9;}else if(page_IndexNo[h]==page_change[t]){for(q=t;q<s;q++){if(page_change[q+1]!=999){temp=page_change[q];page_change[q]=page_change[q+1];page_change[q+1]=temp;}}goto Loop9;}}for(k=0;k<s;k++)page_change[k]=page_change[k+1];page_change[s-1]=page_IndexNo[h];int_count+=1;Loop9:;}v=int_count/page_count;vc[s-4]=1-v;printf("The vc for the page %d: vc[%d]=%.3f $$$ ",s,s-4,vc[s-4]); for(i=0;i<200;i++)page_change[i]=999;}}opt(){int i,count[32],max,j;for(j=0;j<32;j++)count[j]=0;for(s=4;s<=32;s++){page_change[0]=page_IndexNo[0];page_count=1;int_count=1;for(h=1;h<5*M;h++){if(page_IndexNo[h]!=page_IndexNo[h-1])page_count+=1;for(t=0;t<s;t++){if(page_IndexNo[h]==page_change[t])goto Loop10;else if(page_IndexNo[h]!=page_change[t] && page_change[t]==999) {page_change[t]=page_IndexNo[h];int_count++;goto Loop10;}}for(t=0;t<s;t++){for(i=h;i<5*M;i++){if(page_change[t]==page_IndexNo[i]){count[t]=i;goto Loop11;}}page_change[t]=page_IndexNo[h];int_count+=1;goto Loop10;Loop11:;}max=0;for(t=0;t<s;t++){if(count[t]>max)max=count[t];}for(t=0;t<s;t++){if(count[t]==max){page_change[t]=page_IndexNo[h];int_count+=1;}}Loop10:;}v=int_count/page_count;vc[s-4]=1-v;printf("The vc for page %d: vc[%d]=%.3f $$$ ",s,s-4,vc[s-4]); for(i=0;i<200;i++)page_change[i]=999;}}main(){char c;Loop4:clrscr();for(i=0;i<320;i++)address[i]=rand();for(i=0;i<200;i++)page_change[i]=999;printf("Put The Value Of The M: ");scanf("%d",&M);pagechange();for(j=0;j<M;j++){Ram_Make();page_Index[5*j+0]=l;page_IndexNo[5*j+0]=l/10;page_Index[5*j+1]=m;page_IndexNo[5*j+1]=m/10;page_Index[5*j+2]=n;page_IndexNo[5*j+2]=n/10;page_Index[5*j+3]=o;page_IndexNo[5*j+3]=o/10;page_Index[5*j+4]=p;page_IndexNo[5*j+4]=p/10;}for(k=0;k<5*M;k++)printf("page_Index[%d]=%d,page_IndexNo[%d]=%d\n",k,page_Index[k],k,page_IndexNo [k]);printf("\n");Loop5:printf("select the method for page_exchange:\n");printf("1.)FIFO\n2.)LRU\n3.)OPT\n");printf("Put The select of The method: ");scanf("%s",&r);switch(r){ case '1':fifo();break;case '2':lru();break;case '3':opt();break;default:printf("\n");printf("Put the value between 1 to 3 !!!!!!\n");goto Loop5;}Loop6:printf("\n");printf("Do You Want to do again[y/n]:");scanf("%s",&c);if(c=='y')goto Loop4;else if(c=='n')exit;else{printf("Select for 'y' and 'n'!!!!\n");goto Loop6;}}。

相关主题