操作系统实验指导Word格式文档下载.docx
《操作系统实验指导Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导Word格式文档下载.docx(57页珍藏版)》请在冰豆网上搜索。
①创建新的进程;
②查看运行进程;
③换出某个进程;
④杀死运行进程;
⑤进程之间通信。
3.实验环境
装有DOS、Windows操作系统以及TC(或C++)语言系统的PC机1台/人。
4.实验提示
PCB结构通常包括以下信息:
进程名,进程优先数,轮转时间片,进程所占用的CPU时间,进程的状态,当前队列指针等。
可根据实验的不同,PCB结构的内容可以作适当的增删。
参考程序:
#include"
conio.h"
#include"
stdio.h"
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********************************************"
);
\n*进程演示系统*"
\n1.创建新的进程2.查看运行进程"
\n3.换出某个进程4.杀死运行进程"
\n5.进程之间通信6.退出系统"
\n请选择(1~6)"
a=getche();
switch(a)
{case'
1'
:
create();
break;
case'
2'
run();
3'
huanchu();
4'
kill();
5'
tongxun();
6'
exit(0);
default:
n=0;
}
create()/*创建一个进程的示例(不完整的程序)*/
{
if(shumu>
=20)
\n内存已满,请先结束或换出进程\n"
else
printf("
\n请输入新进程的pid\n"
scanf("
%d"
&
neicun[shumu-1].pid);
\n请输入新进程的优先级\n"
neicun[shumu-1].youxian);
\n请输入新进程的大小\n"
neicun[shumu-1].daxiao);
shumu++;
……
}
5.实验运行结果
(将调试通过代码及运行结果打印后附于报告后)
6.实验体会与收获
实验时间:
_____________________实验地点:
_____________________
指导老师:
_____________________实验成绩:
实验二进程调度
进程调度是处理机管理的核心内容。
本实验要求用C语言编写和调试一个简单的进程调度程序。
通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。
①设计进程控制块PCB表结构(与实验一的结构相同),分别适用于优先数调度算法和循环轮转调度算法。
②建立进程就绪队列。
对两种不同算法编制入链子程序。
③编制两种进程调度算法:
1)优先数调度;
2)循环轮转调度
装有DOS、Windows操作系统以及C++语言系统的PC机1台/人。
①本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。
②为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
③在优先数算法中,优先数可以先取值为98,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。
在轮转算法中,采用固定时间片(即:
每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。
④对于遇到优先数一致的情况,采用FIFO策略解决。
⑤在实验操作过程中,考虎用户输入的数据量太大且每次用户输入的大多数数据为重复数据,因此可采用文件输入方式,用户只需指定特定的输入文件的文件名来输入数据。
另一方面,程序的输出量较大,可以采用文件输出的方式来储存程序的运行结果。
也可以用实时的输出界面来输出程序结果。
#include<
stdio.h>
#include<
dos.h>
stdlib.h>
conio.h>
iostream.h>
#defineP_NUM5
#defineP_TIME50
enumstate{
ready,
execute,
block,
finish
};
structpcb{
charname[4];
intpriority;
intcputime;
intneedtime;
intcount;
intround;
stateprocess;
pcb*next;
pcb*get_process();
pcb*get_process(){
pcb*q;
pcb*t;
pcb*p;
inti=0;
cout<
<
"
inputnameandtime"
endl;
while(i<
P_NUM){
q=(structpcb*)malloc(sizeof(pcb));
cin>
>
q->
name;
needtime;
q->
cputime=0;
priority=P_TIME-q->
process=ready;
next=NULL;
if(i==0){
p=q;
t=q;
}
else{
t->
next=q;
i++;
}//while
returnp;
voiddisplay(pcb*p){
name"
"
cputime"
needtime"
priority"
state"
while(p){
cout<
p->
;
cputime;
priority;
switch(p->
process){
caseready:
cout<
ready"
break;
caseexecute:
execute"
caseblock:
block"
casefinish:
finish"
p=p->
next;
intprocess_finish(pcb*q){
intbl=1;
while(bl&
&
q){
;
returnbl;
voidcpuexe(pcb*q){
pcb*t=q;
inttp=0;
while(q){
if(q->
process!
=finish){
;
if(q->
needtime==0){
}
if(tp<
priority&
tp=q->
q=q->
if(t->
needtime!
=0){
t->
priority-=3;
needtime--;
process=execute;
cputime++;
voidpriority_cal(){
pcb*p;
p=get_process();
intcpu=0;
while(!
process_finish(p)){
cpu++;
cputime:
cpu<
cpuexe(p);
display(p);
sleep
(2);
clrscr();
Allprocesseshavefinished,pressanykeytoexit"
getch();
voiddisplay_menu(){
CHOOSETHEALGORITHM:
1PRIORITY"
2ROUNDROBIN"
3EXIT"
pcb*get_process_round(){
;
round=0;
count=0;
voidcpu_round(pcb*q){
q->
cputime+=2;
needtime-=2;
if(q->
needtime<
0){
needtime=0;
;
;
pcb*get_next(pcb*k,pcb*head){
pcb*t;
t=k;
do{
t=t->
while(t&
t->
process==finish);
if(t==NULL){
t=head;
while(t->
next!
=k&
process==finish){
t=t->
returnt;
voidset_state(pcb*p){
if(p->
process==execute){
voiddisplay_round(pcb*p){
NAME"
CPUTIME"
NEEDTIME"
COUNT"
ROUND"
STATE"
count;
round;
voidround_cal(){
pcb*r;
p=get_process_round();
r=p;
cpu+=2;
cpu_round(r);
r=get_next(r,p);
cpu"
display_round(p);
set_state(p);
sleep(5);
voidmain(){
display_menu();
intk;
k);
switch(k){
case1:
priority_cal();
case2:
round_cal();
case3:
display_menu();
scanf("
实验三存储管理
存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。
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最近最不经常使用算法
提示:
A.命中率=1-页面失效次数/页地址流长度
B.本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
C.关于随机数产生方法,采用TC系统提供函数RAND()和RANDOMIZE()来产生。
time.h>
structaa{
intpage;
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;
fangfa:
1-FIFO;
2-LRR;
3-OPT;
4-LFR;
5-NUR"
Mothed:
fangfa;
//fangfa=mm;
ffalse=0;
answer=0;
table=new(aa);
temp=table;
table->
page=-1;
head=table;
for(ii=2;
ii<
=m;
ii++)
temp->
next=table;
if(ii==m){table->
tail=table;
temp=head;
first=head;
count=0;
i=0;
while(i<
320)
min=400;
table=head;
if(fangfa==5)
while(table!
=NULL)
if(table->
page==j){answer=1;
table->
count=2;
table=table->
if(answer!
=1)
while(table!
{
if(table->
count<
min){temp=table;
min=table->
table=table->
if(temp->
page!
=-1)++ffalse;
page=j;
count=1;
if((i%32)==0)
=-1)table->
//if(table->
++(table->
count);
if((fangfa==4)||(fangfa==3))
if(answer!
{table=head;
if(temp->
=-1){
++ffalse;
temp->
table=head;
while(table){
table->
table=table->
++(temp->
if(fangfa==2){
while((table!
=NULL)&
(fangfa==2))
temp=table;
i