操作系统请求页式存储管理实验报告分析解析汇编.docx
《操作系统请求页式存储管理实验报告分析解析汇编.docx》由会员分享,可在线阅读,更多相关《操作系统请求页式存储管理实验报告分析解析汇编.docx(17页珍藏版)》请在冰豆网上搜索。
![操作系统请求页式存储管理实验报告分析解析汇编.docx](https://file1.bdocx.com/fileroot1/2023-4/24/05a4dcc3-aa6e-4f76-9c41-4e9756975eae/05a4dcc3-aa6e-4f76-9c41-4e9756975eae1.gif)
操作系统请求页式存储管理实验报告分析解析汇编
据了解,百分之八十的饰品店都推出“DIY饰品”来吸引顾客,一方面顺应了年轻一代喜欢与众不同、标新立异的心理;另一方面,自制饰品价格相对较低,可以随时更新换代,也满足了年轻人“喜新厌旧”的需要,因而很受欢迎。
3、你是否购买过DIY手工艺制品?
我们从小学、中学到大学,学的知识总是限制在一定范围内,缺乏在商业统计、会计,理财税收等方面的知识;也无法把自己的创意准确而清晰地表达出来,缺少个性化的信息传递。
对目标市场和竞争对手情况缺乏了解,分析时采用的数据经不起推敲,没有说服力等。
这些都反映出我们大学生创业知识的缺乏;
调研提纲:
“碧芝自制饰品店”拥有丰富的不可替代的异国风采和吸引人的魅力,理由是如此的简单:
世界是每一个国家和民族都有自己的饰品文化,将其汇集进行再组合可以无穷繁衍。
(二)创业优势分析
这里有营业员们向顾客们示范着制作各种风格炯异的饰品,许多顾客也是学得不亦乐乎。
据介绍,经常光顾“碧芝”的都是些希望得到世界上“独一无二”饰品的年轻人,他们在琳琅满目的货架上挑选,然后亲手串连,他们就是偏爱这种DIY的方式,完全自助在现场,有上班族在里面精挑细选成品,有细心的小女孩在仔细盘算着用料和价钱,准备自己制作的原料。
可以想见,用本来稀奇的原料,加上别具匠心的制作,每一款成品都必是独一无二的。
而这也许正是自己制造所能带来最大的快乐吧。
夏日的街头,吊带装、露背装、一步裙、迷你裙五彩缤纷、争妍斗艳。
爱美的女孩们不仅在服饰搭配上费尽心机,饰品的选择也十分讲究。
可惜在商店里买的项链、手链、手机挂坠等往往样式平淡无奇,还容易出现雷同现象。
我们女生之所以会钟爱饰品,也许是因为它的新颖,可爱,实惠,时尚,简单等。
的确,手工艺品价格适中。
也许还有更多理由和意义。
那么大学生最喜欢哪种手工艺品呢?
此次调查统计如下图(1-3)
(二)创业弱势分析
操作系统
实验三
存储管理实验
班级:
学号:
姓名:
1.实验目的
存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
2.实验内容
(1)通过随机数产生一个指令序列,共320条指令
指令的地址按下述原则生成:
a)50%的指令是顺序执行的;
b)25%的指令是均匀分布在前地址部分;
c)25%的指令是均匀分布在后地址部分;
具体的实施方法是:
a)在[0,319]的指令地址之间随机选取一起点m;
b)顺序执行一条指令,即执行地址为m+1的指令;
c)在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m';
d)顺序执行一条指令,其地址为m'+1;
e)在后地址[m'+2,319]中随机选取一条指令并执行;
f)重复上述步骤a)~f),直到执行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)先进先出的算法(FIFO);
b)最近最少使用算法(LRU);
c)最佳淘汰算法(OPT);
命中率=1-页面失效次数/页地址流长度
在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
3.随机数产生办法
关于随机数产生办法,可以采用操作系统提供的函数,如Linux或UNIX系统提供函数srand()和rand(),分别进行初始化和产生随机数。
例如:
srand();
语句可以初始化一个随机数;
a[0]=10*rand()/32767*319+1;
a[1]=10*rand()/32767*a[0];
…
语句可以用来产生a[0]与a[1]中的随机数。
环境说明
此实验采用的是Win7下Code:
:
blocks10.05编译器编程。
此word实验文档中采用notepad++的语法高亮。
4.程序设计说明
4.1.全局变量
constintmaxn=320;//序列个数
constintmax=maxn+20;//数组大小
constintmaxp=max/10;//最大页数
intinst[max];//指令序列
intpage[max];//页地址流
intsize;//内存能容纳的页数
boolin[maxp];//该页是否在内存里,提高效率
intpin[maxp];//现在在内存里的页
其中in[]数组是为了方便直接判断该页是否在内存里,而不用遍历内存里所有页来判断。
fault_n用来记录缺页次数。
4.2.随机指令序列的产生
按照实验要求的写了,但是由于没有考虑细节,开始时出了点问题。
(1)当m=319时,我们顺序执行m+1会产生第32页的页地址,从而使页地址没能按要求限制在[0,31]之间。
解决方法:
采用循环模加来避免超出范围。
(2)但是这样之后有可能出现模0的问题。
所以我索性将等于0的模数都赋值为160.
最后的程序如下。
voidproduce_inst()
{
intm,n;
intnum=0;
while(num{
m=rand()%maxn;
inst[num++]=(m+1)%maxn;
if(num==maxn)break;
m=(m+2)%maxn;
if(m==0)m=160;
n=rand()%m;
inst[num++]=(n+1)%maxn;
if(num==maxn)break;
n=(n+2)%maxn;
m=maxn-n;
if(m==0)m=160;
m=rand()%m+n;
inst[num++]=m;
}
}
4.3.FIFO算法
定义变量ptr。
一开始先预调页填满内存。
在这一部分,ptr指向下一个要存放的位置。
之后继续执行剩下的指令。
此时,ptr表示队列最前面的位置,即最先进来的位置,也就是下一个要被替换的位置。
ptr用循环加,即模拟循环队列。
4.4.LRU算法
定义数组ltu[],即last_time_use来记录该页最近被使用的时间。
定义变量ti模拟时间的变化,每执行一次加一。
这个算法,我没有预调页,而是直接执行所有指令。
若当前需要的页没在内存里,就寻找最近最少使用的页,也就是ltu[]最小的页,即最近一次使用时间离现在最久的页,然后替换掉它。
或者在内存还未满时,直接写入,这个我以初始化内存里所有页为-1来实现。
若已经在内存里了,则只遍历内存内的页,把当前页的最近使用时间改一下即可。
4.5.OPT算法
定义数组ntu[],即next_time_use来记录下一次被使用的时间,即将来最快使用时间。
初始化为-1.
开始时预调页填满内存里的页。
同样利用变量ptr来表示下一个要存放的位置从而控制预调页的过程。
接着初始化ntu数组为-1。
然后求出每一页下一次被使用的指令号,以此代替使用时间。
如果所有剩下的序列都没有用该页时,则还是-1.这种值为-1的页显然是最佳替换对象。
然后执行所有剩下的指令。
当该页不在内存里时,遍历ntu数组,遇到-1的直接使用该页,没有则用ntu[]值最大的,也就是最晚使用的。
无论该页在不在内存里,因为这一次已经被使用了,所以都应该更新这个页的ntu[],只需往前看要执行的页流,记录下第一个遇到的该页即可。
如果没有找到同样添-1即可。
5.编程实现(源程序):
#include
#include
#include
#include
usingnamespacestd;
constintmaxn=320;//序列个数
constintmax=maxn+20;//数组大小
constintmaxp=max/10;//最大页数
intinst[max];//指令序列
intpage[max];//页地址流
intsize;//内存能容纳的页数
boolin[maxp];//该页是否在内存里,提高效率
intpin[maxp];//现在在内存里的页
voidwelcome()
{
printf("******************************************\n");
printf("**ByschneeOn2011-12-06**\n");
printf("**班级:
09211311班内序号:
30**\n");
printf("******************************************\n\n");
}
voidinput_hint()
{
printf("\n1--createnewinstructionsequence2--setmemorypagenumber(4to32)\n");
printf("3--solvebyFIFOalgorithm4--solvebyLRUalgorithm\n");
printf("5--solvebyOPTalgorithm0--exit\n");
printf("*********PleaseinputYourchoice:
");
}
/*通过随机数产生一个指令序列,共320条指令*/
voidproduce_inst()
{
intm,n;
intnum=0;
while(num{
m=rand()%maxn;
inst[num++]=(m+1)%maxn;
if(num==maxn)break;
m=(m+2)%maxn;
if(m==0)m=160;
n=rand()%m;
inst[num++]=(n+1)%maxn;
if(num==maxn)break;
n=(n+2)%maxn;
m=maxn-n;
if(m==0)m=160;
m=rand()%m+n;
inst[num++]=m;
}
}
/*将指令序列变换成为页地址流*/
voidturn_page_address()
{
for(inti=0;ipage[i]=inst[i]/10;
}
voidFIFO_solve()
{
memset(in,false,sizeof(in));
intfault_n=0;//缺页率
intptr,i;
//预调页填满空间
ptr=0;//下一个要放的位置
for(i=0;iif(!
in[page[i]])
{
pin[ptr++]=page[i];
in[page[i]]=true;
fault_n++;
}
//继续执行剩下的指令
ptr=0;//队列里最先进来的位置,即下一个要被替换的位置
for(;iif(!
in[page[i]])
{
in[pin[ptr]]=false;
in[page[i]]=true;
pin[ptr]=page[i];
fault_n++;
ptr=(ptr+1)%size;
}
printf("\nByFIFOalgorithm,thefault-pagenumberis:
%d\n",fault_n);
printf("thehitratiois:
%.2lf\n",(1-(fault_n+0.0)/320.0));
}
voidLRU_solve()
{
intltu[maxp];//last_time_use
intti=1;//模拟时间
intfault_n=0;
memset(ltu,0,sizeof(ltu));
memset(in,false,sizeof(in));
memset(pin,-1,sizeof(pin));
intmin,ptr,i,j;
for(i=0;i{
if(!
in[page[i]])
{
//寻找lru
min=1000000;ptr=0;
for(j=0;j{
if(ltu[j]{
min=ltu[j];
ptr=j;
}
}
//替换或写入
if(pin[ptr]!
=-1)
in[pin[ptr]]=false;
in[page[i]]=true;
pin[ptr]=page[i];
fault_n++;
ltu[ptr]=ti++;
}
else//已经在内存里则只需更改最近使用时间
{
for(j=0;jif(pin[j]==page[i])
{
ltu[j]=ti++;
break;
}
}
}
printf("\nByLRUalgorithm,thefault-pagenumberis:
%d\n",fault_n);
printf("thehitratiois:
%.2lf\n",(1-(fault_n+0.0)/320.0));
}
voidOPT_solve()
{
intntu[maxp];//next_time_use
intfault_n=0;
inti,j;
memset(in,false,sizeof(in));
memset(ntu,-1,sizeof(ntu));
//预调页填满
intptr=0;
for(i=0;i{
if(!
in[page[i]])
{
in[page[i]]=true;
pin[ptr]=page[i];
fault_n++;
ptr++;
}
}
//初始化ntu数组
ptr=0;
for(j=i;j{
if(ntu[page[j]]==-1)
{
ntu[page[j]]=j;
ptr++;
}
}
intmax;
for(;i{
if(!
in[page[i]])
{
max=0;ptr=0;
for(j=0;j{
if(ntu[pin[j]]==-1)
{
ptr=j;
break;
}
if(ntu[pin[j]]>max)
{
max=ntu[pin[j]];
ptr=j;
}
}
in[pin[ptr]]=false;
in[page[i]]=true;
pin[ptr]=page[i];
fault_n++;
}
ntu[page[i]]=-1;
for(j=i+1;jif(page[j]==page[i])
{
ntu[page[i]]=j;
break;
}
}
printf("\nByOPTalgorithm,thefault-pagenumberis:
%d\n",fault_n);
printf("thehitratiois:
%.2lf\n",(1-(fault_n+0.0)/320.0));
}
intmain()
{
srand(time(NULL));
welcome();
intchoice;
while
(1)
{
input_hint();
scanf("%d",&choice);
printf("\n");
if(choice==0)
{
printf("BYE-BYE!
!
!
\n");
break;
}
if(choice==1)
{
produce_inst();
turn_page_address();
printf("NewpageaddresssequenceissetOK!
!
!
\n");
}
elseif(choice==2)
{
printf("Pleaseinputthesizeofmemorypagenumber:
");
scanf("%d",&size);
}
elseif(choice==3)
FIFO_solve();
elseif(choice==4)
LRU_solve();
elseif(choice==5)
OPT_solve();
else
printf("INPUTERROR!
!
!
\n");
}
return0;
}
6.运行结果及分析
6.1.运行(以某两次运行结果为例,列表如下:
)
内存
4
5
10
15
20
25
32
FIFO
285
272
230
178
135
90
32
LRU
285
274
224
185
139
91
32
OPT
221
202
140
96
68
48
32
FIFO
272
262
206
167
128
82
32
LRU
271
265
204
163
130
86
32
OPT
201
183
127
92
66
47
32
随着页数的增多,除了FIFO对某些序列会有Belady’sanomaly(详见6.2)外,大部分情况和LRU算法、OPT算法都是缺页率减小。
OPT是理想情况,效率是最高的。
当然当不缺页时,所有的算法缺页次数都是把所有页调进去的次数。
LRU算法有时候和FIFO算法的效率差别并不大。
甚至有时候它还比FIFO低一些的。
6.2.Belady’sanomaly
如下,我稍微改了下输入,手动输入课本上的样例,编程见证了Belady异常现。
这是只有FIFO算法才有的异常。