武汉轻工大学实验一进程调度.doc
- 文档编号:1702904
- 上传时间:2022-10-23
- 格式:DOC
- 页数:10
- 大小:143.54KB
武汉轻工大学实验一进程调度.doc
《武汉轻工大学实验一进程调度.doc》由会员分享,可在线阅读,更多相关《武汉轻工大学实验一进程调度.doc(10页珍藏版)》请在冰豆网上搜索。
武汉轻工大学
数学与计算机学院
《操作系统》实验报告
题目:
进程调度
专业:
数学与计算机学院
班级:
计算机类1303班
学号:
1305110050
姓名:
刘文斌
指导老师:
黄川
2015年05月26日
1、目的和要求
通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。
2、实验内容
阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。
编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。
假设初始状态为:
有n个进程处于就绪状态,有m个进程处于阻塞状态。
采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。
程序要求如下:
1)输出系统中进程的调度次序;
2)计算CPU利用率。
3、实验环境
Windows操作系统、VC++6.0
C语言
4、设计思想:
unuse_cpu++
x++
x==t
blocked队首进程入ready队列队尾;x=0
begin
use_cpu=0
x=0
unuse_cpu=0
ready队列不空或blocked队列不空
ready队列不空
pß取ready队首元素
p->PCB.state置“运行”
输出p->PCB.name
p->PCB.cpu_time--
use_cpu++
p->PCB.cpu_time>0
p入ready队列队尾
释放p
end
/*use_cpu中记录CPU运行时间
/*unuse_cpu中记录CPU空闲时间
否
是
是 否
是
否
是
是
5、源程序
#include
#include
structPCB_type
{
charname;//进程名
intstate;//进程状态
intcpu_time;//运行需要的CPU时间(需运行的时间片个数)
};
structQueueNode
{
structPCB_typePCB;
structQueueNode*next;
};
structQueueNode *ready_head=NULL,//就绪队列队首指针
*ready_tail=NULL,//就绪队列队尾指针
*blocked_head=NULL,//阻塞队列队首指针
*blocked_tail=NULL;//阻塞队列队尾指针
intinuse_cpu,outuse_cpu;
voidstart_state()//读入假设的数据,设置系统初始状态
{
intn,m,i;
structQueueNode*p,*q;
printf("假设处于就绪状态的进程数n为:
\n");
scanf("%d",&n);
printf("假设处于阻塞状态的进程数m为:
\n");
scanf("%d",&m);
p=(structQueueNode*)malloc(sizeof(structQueueNode));
p->next=NULL;
ready_head=ready_tail=p;
for(i=1;i<=n;i++)
{
p=(structQueueNode*)malloc(sizeof(structQueueNode));
p->next=NULL;
p->PCB.state=1;
printf("请输入就绪程序%d的[名称]和[CPU时间]:
\n",i);
scanf("%d%d",&p->PCB.name,&p->PCB.cpu_time);
ready_tail->next=p;
ready_tail=p;
}
q=(structQueueNode*)malloc(sizeof(structQueueNode));
q->next=NULL;
blocked_head=blocked_tail=q;
for(i=1;i<=m;i++)
{
q=(structQueueNode*)malloc(sizeof(structQueueNode));
q->next=NULL;
q->PCB.state=0;
printf("请输入阻塞进程%d的[名称]和[CPU时间]:
\n",i);
scanf("%d%d",&q->PCB.name,&q->PCB.cpu_time);
blocked_tail->next=q;
blocked_tail=q;
}
printf("\n当前处于就绪状态的进程有:
\n");
p=ready_head->next;
i=1;
while(p)
{
printf("进程%d的[名称]和[状态]和[CPU时间]:
%5d%5d%5d\n",i,p->PCB.name,p->PCB.state,p->PCB.cpu_time);
p=p->next;
i++;
}
}
voiddispath()//模拟调度
{
inta=0,t;
inuse_cpu=0;
outuse_cpu=0;
printf("请输入时间片t:
");
scanf("%d",&t);
printf("开始调度:
\n");
while(ready_head!
=ready_tail||blocked_head!
=blocked_tail)
{
structQueueNode*p,*q;
if(ready_head!
=ready_tail)
{
p=ready_head->next;
ready_head->next=p->next;
p->next=NULL;
if(ready_head->next==NULL)
{
ready_tail=ready_head;
}
p->PCB.state=2;
printf("\t进程%d调度中",p->PCB.name);
inuse_cpu++;
a++;
p->PCB.cpu_time--;
if(p->PCB.cpu_time)
{
ready_tail->next=p;
ready_tail=p;
}
else
{
printf("\t进程%d完成调度!
",p->PCB.name);
free(p);
}
}
else
{
outuse_cpu++;
a++;
printf("\t空闲一个时间片");
}
if(a==t&&blocked_head!
=blocked_tail)
{
q=blocked_head->next;
blocked_head->next=q->next;
q->next=NULL;
if(blocked_head->next==NULL)
{
blocked_tail=blocked_head;
}
ready_tail->next=q;
ready_tail=q;
a=0;
}
}
}
voidcalculate()//计算CPU利用率
{
printf("\nCPU的利用率为:
%.2f\n",(float)inuse_cpu/(inuse_cpu+outuse_cpu));
}
voidmain()
{
start_state();
dispath();
calculate();
}
6、实例运行结果
7、总结
该实验利用进程调度中的优先级算法调度进程,开始给每一个进程设定一个优先级数,对于优先级高的进程先调度,优先级低的进程后调度,在调度一个进程时,其他进程将处于就绪态,而正在被调度的进程应处于运行态。
一开始在做这个实验的时候,我感觉大脑一片空白,不知道该从哪里动笔。
后来根据书上的内容和从网上下载的资料,我慢慢地了解了大致的流程。
通过这次实验,首先加深了我对进程调度方法和功能的认识,其次让我更加深刻地理解了操作系统中进程调度中优先级调度的基本原理。
优先级调度算法只是进程调度算法的一种,我们还应依照书本去学习进程调度的其它算法,以便更好地了解进程调度。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉 轻工 大学 实验 进程 调度