操作系统课程设计编程内容教案资料.docx
《操作系统课程设计编程内容教案资料.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计编程内容教案资料.docx(21页珍藏版)》请在冰豆网上搜索。
操作系统课程设计编程内容教案资料
操作系统课程设计编程内容
实验一进程调度
一、实验目的
通过一个简单的进程调度模拟程序的实现,加深对进程调度算法,进程切换的理解。
二、实验内容
采用动态优先数的方法,编写一进程调度程序模拟程序。
模拟程序只进行相应的调度模拟操作,不需要实际程序。
[提示]:
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
进程名
指针
要求运行时间
优先数
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——可假设有两种状态,“就绪”状态和“结束”状态。
五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3)为了调度方便,把五个进程按给定的优先数从大到小连成队列。
用一单元指出队首进程,用指针指出队列的连接情况。
(4)处理器调度总是选队首进程运行。
采用动态改变优先数的办法,进程每运行一次优先数就减“1”。
由于本实习是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:
优先数-1
要求运行时间-1
来模拟进程的一次运行。
提醒注意的是:
在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。
在这里省去了这些工作。
(5)进程运行一次后,若要求运行时间?
0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。
(6)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。
(7)在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。
(8)为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
三:
实验流程图
四、实验代码
#include
#include
#include
#include
/*进程控制块数据结构*/
typedefstructnode
{
charname[10];/*进程名*/
intprio;/*进程优先级*/
intcount;/*进程运行时间*/
charstate;/*进程的状态:
'R':
运行,'W':
等待,'F':
结束*/
structnode*next;/*指向下一个进程的指针*/
}PCB;
PCB*finish,*ready,*tail,*run;/*指向三个队列的队首的指针,tail为就绪队列的队尾指针*/
intN;/*定义进程的数目*/
/*函数功能:
将进程就绪队列中第一个放进就绪队列
函数原型:
voidfirstin(void)
函数参数:
void
函数返回值:
void
*/
voidfirstin(void)
{
if(ready!
=NULL)
{
run=ready;
ready=ready->next;
run->state='R';
run->next=NULL;
}
else
{
run=NULL;
}
}
/*函数功能:
输出所有进程信息的函数
函数原型:
voidprt(charalgo)
函数参数:
chara:
a=='p'为优先级,=='r'为时间片轮转
函数返回值:
void*/
voidprt(charalgo)
{
PCB*p;
printf("namecountprioritystate\n");
p=ready;
while(p!
=NULL)
{
printf("%-10s,%-10d,%-10d,%-5c\n",p->name,p->prio,p->state);
p=p->next;
}
p=finish;
while(p!
=NULL)
{
printf("%-10s,%-10d,%-10d,%-5c\n",p->name,p->prio,p->state);
p=p->next;
}
getchar();
}
/*函数功能:
优先级法调度将进程插入到就绪队列算法
函数原型:
voidinsert1(PCB*q)
函数参数:
PCB*q待插入的队列进程控制块
优先级越高,插入越靠前
函数返回值:
void
*/
voidinsert1(PCB*q)
{
PCB*p,*s,*r;/*p,r用来控制就绪队列滚动,S指向插入的队列*/
intb;/*b作为插入控制标志的*/
s=q;
p=ready;
r=p;
b=1;
if(s->prio>=ready->prio)
{
s->next=ready;
ready=s;
}
else
{
while((p!
=NULL)&&b)
{
if(p->prio>=s->prio)
{
r=p;
p=p->next;
}
else
{
b=0;
}
}
s->next=p;
r->next=s;
}
}
/*函数功能:
采用优先级进程调度法时,进程初始化函数
函数原型:
voidpcreate_task(charalgo)
函数参数:
charalgo:
函数返回值:
void*/
voidpcreate_task(charalgo)
{
PCB*p;
inti,time;
charna[10];
ready=NULL;
finish=NULL;
run=NULL;
for(i=0;i{
p=(PCB*)malloc(sizeof(PCB));
printf("Enterthenameofprocess\n");
scanf("%s",na);
printf("Enterthetimeofprocess\n");
scanf("%d",&time);
strcpy(p->name,na);
p->count=time;
p->state='W';
p->prio=time;
if(ready==NULL)
{
ready=p;
ready->next=NULL;
}
else
{
insert1(p);
}
printf("Outputthewaitingprocessesinformation\n");
prt(algo);
}
firstin();
}
/*
函数功能:
采用优先级进程调度法时,进程调度函数
函数原型:
voidpriority(charalgo)
函数参数:
chara:
进程调度类别标志:
'P'优先级'R'时间片轮转
函数返回值:
void*/
priority(charalgo)
{
while(run!
=NULL)
{
run->count-=1;
run->prio-=1;
if(run->count==0)
{
run->next=finish;
finish=run;
run->state='E';
run=NULL;
firstin();
}
else
{
if((ready!
=NULL)&&(run->prioprio))
{
run->state='W';
insert1(run);
run=NULL;
firstin();
}
}
prt(algo);
}
return(0);
}
/*main函数*/
intmain()
{charalgo;
algo='P';
printf("PleaseenterthenumberofprocessesN:
\n");
scanf("%d",&N);
pcreate_task(algo);
priority(algo);
return(0);
}
实验二存储管理
一、实验目的
存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
二、实验内容
通过随机数产生一个指令序列,共320条指令。
指令的地址按下述原则生成:
①50%的指令是顺序执行的;
②25%的指令是均匀分布在前地址部分;
③25%的指令是均匀分布在后地址部分。
具体的实施方法是:
①在[0,319]的指令地址之间随机选取一起点m;
②顺序执行一条指令;
③在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m′;
④顺序执行一条指令,其地址为m′+1;
⑤在后地址[m′+2,319]中随机选取一条指令并执行;
⑥重复上述步骤②~⑤,直到执行320次指令。
(1)将指令序列变换成为页地址流
设:
①页面大小为1K;
②用户内存容量为4页到32页;
③用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条~第9条指令为第0页(对应虚存地址为[0,9]);
第10条~第19条指令为第1页(对应虚存地址为[10,19]);
┇
┇
第310条~第319条指令为第31页(对应虚存地址为[310,319])。
按以上方式,用户指令可组成32页。
(2)计算并输出下述各种算法在不同内存容量下的命中率。
1先进先出的算法(FIFO);
2最近最久未使用算法(LRU);
命中率=1-页面失效次数∕页地址流长度
在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
三、随机数产生办法
关于随机数产生办法,Linux或UNIX系统提供函数srand()和rand(),分别进行初始化和产生随机数。
例如:
srand();
语句可初始化一个随机数;
a[o]=10*rand()/32767*319+1;
a[1]=10*rand()/32767*a[o];
┇
语句可用来产生a[0]与a[1]中的随机数。
四,实验代码
/**************************************************************
*此程序为页面调度程序,用于模拟虚存与主存之间的页面置换