操作系统报告Word文件下载.docx
《操作系统报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统报告Word文件下载.docx(23页珍藏版)》请在冰点文库上搜索。
在所有320指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
3.置换算法:
请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用(LRU)算法。
4.作业中指令的访问次序按下述原则生成;
50%的指令是顺序执行的;
25%的指令是均匀分布在前地址部分;
25%的指令均匀分布在后地址部分。
具体的实现办法是:
(1)在[0,319]之间随机选取一条起始执行指令,其序号为m;
(2)顺序执行下一条指令,其序号为m+1条指令;
(3)通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1;
(4)顺序执行下一条指令,即序号为m1+1的指令;
(5)通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;
(6)顺序执行下一条指令,则序号为m2+1的指令;
(7)重复跳转到前地址部分,顺序执行,跳转到后地址部分;
顺序执行的过程,直至执行320条指令。
1设计思路
在进程运行过程中,若其所要访问的页面不在内存时,需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。
但应将哪个页面调出,所以需要根据一定的算法来确定。
在这一过程中,选择换出页面的算法称为页面置换算法。
一个好的页面置换算法,应具有较低的页面更换频率。
页面置换算法的好坏,将直接影响到系统的性能。
以下分别是实验要求的两个页面置换算法的介绍及其设计思想。
(1)先进先出法
该算法总是淘汰最先进入内存的页面,既选择在内存中驻留时间最久的页面予以淘汰。
在该算法的模拟过程中,每当页面被置换进入内存时,将置换页面所在的物理块中访问标记设为-1;
并且每执行一次指令,便将物理块的访问标记自动加1,需要置换时将访问标记最大的物理块中的页面置换出去,这样能防止当物理块访问标记出现两个以上相同的值的错误执行,更好地模拟了先进先出法;
(2)最近最久未使用
该算法以最近的过去作为不久将来的近似,将过去最长一段时间里不曾被使用的页面置换掉。
在该算法的模拟过程中,每当物理块中的页面被访问时(包括原先存在的和后来置换进入的页面),便将其物理块访问标记置为-1。
以后每执行一条指令,便将物理块中各页面的访问标记加1,需置换时访问标记最大的便是将要被置换的。
2文件系统结构的说明
3数据结构的说明
4各模块的算法流程图
(1)整体流程图
(2)LRU算法流程图
(3)LRU算法流程图
5程序清单
#include<
iostream.h>
stdlib.h>
conio.h>
stdio.h>
#defineBsize4
typedefstructBLOCK//声明一种新类型——物理块类型
{
intpagenum;
//页号
intaccessed;
//访问标识符,其值表示多久未被访问
}BLOCK;
intpc;
//程序计数器,用来记录指令的序号
intn;
//缺页计数器,用来记录缺页的次数
staticinttemp[320];
//用来存储320条随机数
BLOCKblock[Bsize];
//定义一大小为4的物理块数组
//*************************************************************
voidinit();
//程序初始化函数
intfindExist(intcurpage);
//查找物理块中是否有该页面
intfindSpace();
//查找是否有空闲物理块
intfindReplace();
//查找应予置换的页面
voiddisplay();
//显示
voidsuijishu();
//产生320条随机数,显示并存储到temp[320]
voidpagestring();
//显示调用的页面队列
voidLRU();
//LRU算法
voidFIFO();
//FIFO算法
voidinit()//初始化物理块
for(inti=0;
i<
Bsize;
i++)
{
block[i].pagenum=-1;
//空闲物理块
block[i].accessed=0;
pc=n=0;
}
}
//-------------------------------------------------------------
intfindExist(intcurpage)//查找物理块中是否有该页面
{
i<
i++)
if(block[i].pagenum==curpage)
returni;
//检测到内存中有该页面,返回block中的位置
return-1;
//没有则返回-1
intfindSpace()//查找是否有空闲物理块
if(block[i].pagenum==-1)
//找到空闲的block,返回block中的位置
}
//找不到则返回-1
intfindReplace()//查找应予置换的页面
intpos=0;
if(block[i].accessed>
block[pos].accessed)
pos=i;
//找到应予置换页面,返回BLOCK中位置
returnpos;
voiddisplay(intspace)//显示
if(block[i].pagenum!
=-1)//物理块不空
{printf("
%02d"
block[i].pagenum);
cout<
<
"
调入的页面是:
block[space].pagenum<
其物理块的地址是:
&
block[space];
endl;
voidsuijishu(intpc)//产生随机数
{intflag=0;
******按照要求产生的320个随机数:
*******"
320;
i++)
{
temp[i]=pc;
if(flag%2==0)pc=++pc%320;
//产生50%的顺序执行指令(flag=0或2时顺序执行)
if(flag==1)pc=rand()%(pc-1);
//产生25%的均匀分布在前地址部分指令
if(flag==3)pc=pc+1+(rand()%(320-(pc+1)));
//产生25%的均匀分布在后地址部分指令
flag=++flag%4;
printf("
%03d"
temp[i]);
if((i+1)%10==0)cout<
voidpagestring()//显示调用的页面队列
printf("
%02d"
temp[i]/10);
//-------------------------------------------------------------
voidLRU()//LRU算法(最近最少使用算法)
intexist,space,position;
intcurpage;
if(i%100==0)getch();
//getch直接从键盘获取键值
pc=temp[i];
//指令在数组中的位置
curpage=pc/10;
//指令所在页面
exist=findExist(curpage);
//查找物理块中是否有该页面,若有返回物理块号
if(exist==-1)//物理块中不存在该页
{
space=findSpace();
if(space!
=-1)//有空闲物理块
{
block[space].pagenum=curpage;
display(space);
n=n+1;
}
else//无空闲物理块,则寻找置换页面
position=findReplace();
//查找应予置换的页面
block[position].pagenum=curpage;
block[position].accessed=-1;
//恢复刚调入的BLOCK中页面accessed为-1
display(position);
n++;
}
else
{
block[exist].accessed=-1;
//恢复存在的并刚访问过的BLOCK中页面accessed为-1
for(inti=0;
i++)
{if(block[i].pagenum!
printf("
cout<
指令已经存在!
其物理块地址为:
block[exist]<
for(intj=0;
j<
4;
j++)//物理块中各页面的访问标记加1
{block[j].accessed++;
缺页次数:
n<
缺页率:
(n/320.0)*100<
%"
voidFIFO()//FIFO算法(先进先出算法)
if(exist==-1)//物理块中不存在该页
block[position].accessed=-1;
//置换页面所在的物理块中访问标记设为-1
else//若存在该页
for(intj=0;
j++)//物理块中各页面访问标记自动加1
block[j].accessed++;
voidmain()
intselect;
请输入第一条指令号(1~319):
;
cin>
>
pc;
//随机选取一条起始执行指令
if(pc>
=1&
pc<
=319)
suijishu(pc);
//产生随机数
*****对应的调用页面队列*******"
pagestring();
do
****************************************"
------1:
LRU2:
FIFO3:
退出-----"
请选择一种页面置换算法:
select;
init();
switch(select)
case1:
cout<
最近最久未使用置换算法LRU:
**************************"
LRU();
break;
case2:
先进先出置换算法FIFO:
cout<
*********************"
FIFO();
default:
;
}while(select!
=3);
elsecout<
输入非法数据!
6使用说明书
本程序能通过输入第一条指令号(用3位整数代表指令号),产生320个随机数,并以每行10个显示出来。
再把这320个随机数转换成对应的页面号,并以每行10个显示出来。
然后,通过输入选择键,分别执行两个置换算法。
各个置换算法能显示页面置换的情况,如果所访问的指令已在内存,则显示“该指令已经存在”并显示其物理地址;
如果所访问的指令还未装入内存,则显示“调入的页面是。
。
”,并显示其调入后的物理地址。
所有指令执行完毕后显示缺页次数,和缺页率。
基本实现了对请求调页存储器管理方式的模拟。
本程序的另一个亮点是使用getch()使程序的执行过程能够暂停。
本程序基本实现了实验要求,自我感觉程序不够精练,可读性不高,还要进一步改进。
6.运行结果及分析
7体会,建议
通过本次操作系统实验,使我们对操作系统这门课程有了更进一步的认识和了解,通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟储技术的特点。
本实验的难点之一在于如何用c语言按要求模拟生成随机指令,即50%的指令是顺序执行的,25%的指令是均匀分布在前地址部分,25%的指令是均匀分布在后地址部分,小组花了大量时间讨论和研究该算法,并参考了相关的资料、运用了随机函数,最终通过一个函数suiji(intpc)予以实现。
第二,如何较好地模拟出先进先出算法(FIFO)、最近最少使用算法(LRU)也花费了较多时间。
在本次设计过程中,用到了许多C++的基本知识和操作系统的基本原理,是对平时所学知识的一次考验,尽管这些知识都学过,但运用到实际时,却不知从何下手,而且错误不断,往往为了找一个错误而花了大量的时间,这是专业知识掌握不够,缺乏实践动手能力的表现。
在设计的过程中我们发现了许多自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,以后还要多加努力。
总之,通过该实验,我们了解到编写程序不是首要任务,而是一种实现手段。
我们最重要的是如何做好需求分析和理清思路,做出正确、简洁的流程设计,这样可以达到事半功倍的效果。
DNS协议为应用层协议,可实现IP地址和主机名之间的转换。
参考程序如下:
1程序源代码:
winsock.h>
string.h>
#pragmacomment(lib,"
ws2_32.lib"
)
//主文件//
intmain()
WORDwVersionRequested=MAKEWORD(1,1);
WSADATAwsaData;
//初始化windowssocketsAPI//
if(WSAStartup(wVersionRequested,&
wsaData)){
WSAStartupfailed%s\n"
WSAGetLastError());
charhostname[256];
//获得本主机名//
intres=gethostname(hostname,sizeof(hostname));
if(res!
=0){//错误处理//
Error:
%u\n"
本主机名为:
%s\n"
hostname);
//打印本主机名字//
请输入一个主机域名:
);
//输入一个主机的域名//
scanf("
%s"
//利用主机名获得主机的地址//
hostent*pHostent=gethostbyname(hostname);
if(pHostent==NULL){//错误处理//
Error:
//解析返回的主机地址信息:
别名、地址类型、地址长度,并打印//
hostent&
he=*pHostent;
name=%s\naliase=%s\naddrtype=%d\nlength=%d\n"
he.h_name,he.h_aliases,he.h_addrtype,he.h_length);
sockaddr_insa;
//打印主机每一个网卡的IP地址//
for(intnAdapter=0;
he.h_addr_list[nAdapter];
nAdapter++){
memcpy(&
sa.sin_addr.s_addr,he.h_addr_list[nAdapter],he.h_length);
Address:
inet_ntoa(sa.sin_addr));
}//显示lP地址//
\n"
unsignedlongaddr;
charhostaddr[50];
请输人服务器IP地址:
//输入一个服务器的IP地址//
hostaddr);
addr=inet_addr(hostaddr);
//将lP地址转化为网络字节序//