操作系统实验1.docx
《操作系统实验1.docx》由会员分享,可在线阅读,更多相关《操作系统实验1.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统实验1
计算机操作系统实验指导
实验一进程管理
1.目的和要求
加强对进程概念的理解。
2.实验内容
至少要有:
创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。
3.实验环境
①PC兼容机
②Windows、DOS系统
③TC语言
4.实验提示
PCB结构通常包括以下信息:
进程名,进程优先数,轮转时间片,进程所占用的CPU时间,进程的状态,当前队列指针等。
可根据实验的不同,PCB结构的内容可以作适当的增删。
主体程序
#include"conio.h"
#include"stdio.h"
#include"stdlib.h"
structjincheng_type
{intpid;
intyouxian;
intdaxiao;………};
structjincheng_typeneicun[20];
intshumu=0,pid_l;
main()
{
intn,m,i;
chara;
n=1;
while(n==1)
{
clrscr();
printf("\n********************************************");
printf("\n*进程演示系统*");
printf("\n********************************************");
printf("\n1.创建新的进程2.查看运行进程");
printf("\n3.换出某个进程4.杀死运行进程");
printf("\n5.进程之间通信6.退出系统");
printf("\n********************************************");
printf("\n请选择(1~6)");
a=getche();
switch(a)
{case'1':
create();
break;
case'2':
run();
break;
case'3':
huanchu();
break;
case'4':
kill();
break;
case'5':
tongxun();
break;
case'6':
exit(0);
default:
n=0;
}
}
}
create()/*创建一个进程的示例(不完整的程序)*/
{
if(shumu>=20)
{
printf("\n内存已满,请先结束或换出进程\n");
}
else
{
printf("\n请输入新进程的pid\n");
scanf("%d",&neicun[shumu-1].pid);
printf("\n请输入新进程的优先级\n");
scanf("%d",&neicun[shumu-1].youxian);
printf("\n请输入新进程的大小\n");
scanf("%d",&neicun[shumu-1].daxiao);
shumu++;
}
}
5.实验运行结果
********************************************
*进程演示系统*
********************************************
1.创建新的进程2.查看运行进程
3.换出某个进程4.杀死运行进程
5.进程之间通信6.退出系统
********************************************
请选择(1~6)
然后根据你选择的不同,出现不同的结果。
实验二存储管理
1.目的和要求
存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。
2.实验内容
1.过随机数产生一个指令序列,共320条指令。
其地址按下述原则生成:
①50%的指令是顺序执行的;
②25%的指令是均匀分布在前地址部分;
③25%的指令是均匀分布在后地址部分;
#具体的实施方法是:
A.在[0,319]的指令地址之间随机选区一起点M;
B.顺序执行一条指令,即执行地址为M+1的指令;
C.在前地址[0,M+1]中随机选取一条指令并执行,该指令的地址为M’;
D.顺序执行一条指令,其地址为M’+1;
E.在后地址[M’+2,319]中随机选取一条指令并执行;
F.重复A—E,直到执行320次指令。
2.指令序列变换成页地址流
设:
(1)页面大小为1K;
(2)用户内存容量为4页到32页;
(3)用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条—第9条指令为第0页(对应虚存地址为[0,9]);
第10条—第19条指令为第1页(对应虚存地址为[10,19]);
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
第310条—第319条指令为第31页(对应虚存地址为[310,319]);
按以上方式,用户指令可组成32页。
3.计算并输出下述各种算法在不同内存容量下的命中率。
A.FIFO先进先出的算法
B.LRR最近最少使用算法
C.OPT最佳淘汰算法(先淘汰最不常用的页地址)
D.LFR最少访问页面算法
E.NUR最近最不经常使用算法
3.实验环境
在486机或586机上用TC语言实现
4.实验提示
提示:
A.命中率=1-页面失效次数/页地址流长度
B.本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
C.关于随机数产生方法,采用TC系统提供函数RAND()和RANDOMIZE()来产生。
5.实验运行结果
试验输出如下(输出包括了用户内存从3K到32K的各种不同情况)
PAGEFIFOLRROPTLFRNUR
试验结论
从实验数据来看,OPT算法为最好的一种算法。
参考程序见下:
#include
#include
#include
#include
structaa{
intpage;
intcount;
aa*next;
};
voidmain()
{
time_tt;
srand(unsigned(time(&t)));
inti,n,j,ii,m,answer,ffalse,count,fangfa,temp1,min,nn,mm;
doublesum;
aa*head,*tail,*temp,*table,*first,*ti;
/*nn=4;mm=1;
for(nn=4;nn>32;nn++)
{
for(mm=1;mm>5;mm++)
{*/
cin>>m;
//m=nn;
cout<cout<<"fangfa:
1-FIFO;2-LRR;3-OPT;4-LFR;5-NUR"<cout<<"Mothed:
";
cin>>fangfa;
//fangfa=mm;
ffalse=0;
answer=0;
table=new(aa);
temp=table;
table->page=-1;
table->count=0;
head=table;
for(ii=2;ii<=m;ii++)
{
table=new(aa);
table->page=-1;
table->count=0;
temp->next=table;
temp=table;
if(ii==m){table->next=NULL;}
}
tail=table;
temp=head;
first=head;
count=0;
i=0;
while(i<320)
{
min=400;
if(count==0){n=(rand()%320+1)%320;j=n/10;}
if(count==1){n=rand()%(n+1);j=n/10;}
if(count==2){j=((n+1)%320)/10;}
if(count==3){j=((rand()%(320-n-2))+n+2)/10;}
table=head;
temp=head;
answer=0;
min=400;
if(fangfa==5)
{
while(table!
=NULL)
{
if(table->page==j){answer=1;table->count=2;}
table=table->next;
}
if(answer!
=1)
{
table=head;
while(table!
=NULL)
{
if(table->countcount;}
table=table->next;
}
if(temp->page!
=-1)++ffalse;
temp->page=j;
temp->count=1;
}
table=head;
if((i%32)==0)
{
while(table!
=NULL)
{
if(table->page!
=-1)table->count=1;
//if(table->page==j){answer=1;++(table->count);}
table=table->next;
}
}
}
if((fangfa==4)||(fangfa==3))
{
while(table!
=NULL)
{
if(table->page==j){answer=1;++(table->count);}
table=table->next;
}
if(answer!
=1)
{table=head;
while(table!
=NULL)
{
if(table->countcount;}
table=table->next;
}
if(temp->page!
=-1){
++ffalse;
temp->page=j;
table=head;
while(table){
table->count=1;
table=table->next;
}
}
else{
temp->page=j;
++(temp->count);
}
}
}
if(fangfa==2){
while((table!
=NULL)&&(fangfa==2))
{
if(table->page==j){answer=1;temp=table;}
table=table->next;
}
if((fangfa==2)&&(answer==1))
{
//table=temp;
temp1=temp->page;
while(temp!
=NULL)
{
temp->page=temp->next->page;
temp=temp->next;
}
tail->page=temp1;
}
if((answer!
=1)&&(fangfa==2))
{
if(first->page!
=-1)
ffalse=ffalse+1;
first->page=j;
temp=head;
while(temp!
=NULL)
{
temp->page=temp->next->page;
temp=temp->next;
}
tail->page=j;
}
}
table=head;
while((table!
=NULL)&&(fangfa==1))
{
if(table->page==j){answer=1;}
table=table->next;
}
if((answer!
=1)&&(fangfa==1))
{
if(first->page!
=-1)ffalse=ffalse+1;
first->page=j;
if(first->next!
=NULL){first=first->next;}
else{first=head;}
}
++i;
++count;
if(count==4){count=0;}
}
sum=1.0-ffalse/320.0;
/*cout<if(fangfa==1)cout<<"FIFO:
"<if(fangfa==2)cout<<"LRR:
"<if(fangfa==3)cout<<"OPT:
"<if(fangfa==4)cout<<"LFR:
"<if(fangfa==5)cout<<"NUR:
"<if(mm==5)cout<cout<for(ti=head;ti!
=NULL;ti=ti->next)cout<page<<"";
cout<}