实验三进程调度模拟程序2.0
专业:计算机班级:14网络工程一班姓名:黄智涛学号:201406114331
一、实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、实验要求
设计一个有 N个进程并发执行的进程调度模拟程序。
1.模拟进程数据的生成
允许用户指定作业的个数(2-24),默认值为5。
允许用户选择输入每个进程的到达时间,所需运行时间,进程的运行时间以时间片为单位。
2. 模拟调度程序的功能
2.1 按照模拟数据的到达时间和所需运行时间,能分别执行以下调度算法。
FCFS
SJ
HRRN
RR
2.2 显示每种算法下各进程的调度执行顺序。
2.3计算各进程的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。
2.4模拟数据结果分析:对同一组模拟数据,比较各算法的平均周转时间,周转系数。
三、实验说明
1) 先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。
3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间。
4) 时间片轮转(RR)调度算法:调度程序每次把CPU分配给就绪队列首进程使用一个时间片,就绪队列中的每个进程轮流地运行一个时间片。当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。
四、实验环境
可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB等可视化环境,利用各种控件较为方便。自主选择实验环境。
五.实验内容
#include <stdio.h>
#define Time int
#define Max 100
typedef struct process {
char name[10]; //进程名
int priority; //优先数
Time ReachTime; //到达时间
Time NeedTime; //需要运行时间
Time UsedTime; //已用时间
Time WaitTime; //等待时间
Time CycleTime; //周转时间
Time Response; //响应比
char state; //进程状态
}PCB; //进程控制块
int n; //标示进程的总数
PCB pcb[Max];
int pTime;
//时间片大小
void AddProcess() {
char ch;
do {
printf("\n请输入进程名");
scanf("%s",pcb[n].name);
printf("请输入进程的优先级");
scanf("%d",&pcb[n].priority);
printf("请输入进程需要的时间");
scanf("%d",&pcb[n].NeedTime);
pcb[n].ReachTime=n;
pcb[n].UsedTime=0;
pcb[n].state='W';
n++;
printf("还要继续增加进程吗,是(Y),否(N)");
do
{
ch=getchar();
} while(ch!='Y'&&ch!='N'&&ch!='y'&&ch!='n');
}while (ch=='Y'||ch=='y');
}
void AddProcess4() {
char ch;
do {
printf("\n请输入进程名");
scanf("%s",pcb[n].name);
printf("请输入进程的到达时间");
scanf("%d",&pcb[n].ReachTime);
printf("请输入进程需要的时间");
scanf("%d",&pcb[n].NeedTime);
pcb[n].UsedTime=0;
pcb[n].state='W';
n++;
printf("还要继续增加进程吗,是(Y),否(N)");
do
{
ch=getchar();
} while(ch!='Y'&&ch!='N'&&ch!='y'&&ch!='n');
}while (ch=='Y'||ch=='y');
}
// 排序函数,将最先运行的进程放在最先即pcb[0]
void sort()
{ //用冒泡排序
int i,j;
PCB temp; //先按到达时间排序
for (i=0;i<n-1;i++)
{
for(j=n-2;j>=i;j--){
if(pcb[j+1].ReachTime<pcb[j].ReachTime)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
for (i=0;i<n-1;i++)
{
for (j=n-2;j>=i;j--)
{
if (pcb[j+1].priority>pcb[j].priority)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
if (pcb[0].state!='F')
{
pcb[0].state='R'; //将优先级最高的状态置为运行
}
}
void sort1()
{ //用冒泡排序
int i,j;
PCB temp; //先按到达时间排序
for (i=0;i<n-1;i++)
{
for(j=n-2;j>=i;j--){
if(pcb[j].UsedTime==pcb[j].NeedTime)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
if (pcb[0].state!='F')
{
pcb[0].state='R'; //将优先级最高的状态置为运行
}
}
void sort2()
{ //用冒泡排序
int i,j;
PCB temp; //先按到达时间排序
for (i=0;i<n-1;i++)
{
for(j=n-2;j>=i;j--){
if(pcb[j+1].NeedTime<pcb[j].NeedTime)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
}
void sort4()
{ //用冒泡排序
int i,j;
PCB temp; //先按到达时间排序
for (i=0;i<n-1;i++)
{
for (j=n-2;j>=i;j--)
{
if (pcb[j+1].ReachTime<pcb[j].ReachTime)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
if (pcb[0].state!='F')
{
pcb[0].state='R'; //将优先级最高的状态置为运行
}
}
void sort5()
{ //用冒泡排序
int i,j;
PCB temp; //先按到达时间排序
pcb[0].CycleTime=pcb[0].NeedTime-pcb[0].ReachTime;
pcb[1].CycleTime=pcb[0].NeedTime+pcb[1].NeedTime-pcb[1].ReachTime;
pcb[2].CycleTime=pcb[0].NeedTime+pcb[1].NeedTime+pcb[2].NeedTime-pcb[2].ReachTime;
if (pcb[0].state!='F')
{
pcb[0].state='R'; //将优先级最高的状态置为运行
}
}
void sort6()
{ //用冒泡排序
int i,j;
PCB temp; //先按到达时间排序
pcb[0].Response=pcb[0].CycleTime/pcb[0].NeedTime;
pcb[1].Response=pcb[1].CycleTime/(pcb[0].NeedTime+pcb[1].NeedTime);
pcb[2].Response=pcb[2].CycleTime/(pcb[0].NeedTime+pcb[1].NeedTime+pcb[2].NeedTime);
if (pcb[0].state!='F')
{
pcb[0].state='R'; //将优先级最高的状态置为运行
}
}
void sort7()
{ //用冒泡排序
int i,j;
PCB temp; //先按到达时间排序
for (i=0;i<n-1;i++)
{
for (j=n-2;j>=i;j--)
{
if (pcb[j+1].Response>pcb[j].Response)
{
temp=pcb[j];
pcb[j]=pcb[j+1];
pcb[j+1]=temp;
}
}
}
if (pcb[0].state!='F')
{
pcb[0].state='R'; //将优先级最高的状态置为运行
}
}
void print() //打印
{
int i;
sort();
printf("\n 进程名 优先级 到达时间 需要时间 已用时间 进程状态 \n");
for (i=0;i<n;i++)
{ printf("%8s%8d%8d%10d%10d%10c\n",pcb[i].name,pcb[i].priority,pcb[i].ReachTime,pcb[i].NeedTime,pcb[i].UsedTime,pcb[i].state);
}
}
void print1() //打印
{
int i;
sort1();
printf("\n 进程名 优先级 到达时间 需要时间 已用时间 进程状态 \n");
for (i=0;i<n;i++)
{ printf("%8s%8d%8d%10d%10d%10c\n",pcb[i].name,pcb[i].priority,pcb[i].ReachTime,pcb[i].NeedTime,pcb[i].UsedTime,pcb[i].state);
}
}
void print2() //打印
{
int i;
sort2();
printf("\n 进程名 优先级 到达时间 需要时间 已用时间 进程状态 \n");
for (i=0;i<n;i++)
{ printf("%8s%8d%8d%10d%10d%10c\n",pcb[i].name,pcb[i].priority,pcb[i].ReachTime,pcb[i].NeedTime,pcb[i].UsedTime,pcb[i].state);
}
}
void print4() //打印
{
int i;
printf("\n 进程名 优先级 到达时间 需要时间 周转时间 已用时间 进程状态 \n");
for (i=0;i<n;i++)
{ printf("%8s%8d%8d%10d%10d%10d%10c\n",pcb[i].name,pcb[i].priority,pcb[i].ReachTime,pcb[i].NeedTime,pcb[i].CycleTime,pcb[i].UsedTime,pcb[i].state);
}
}
void print5() //打印
{
int i;
printf("\n 进程名 优先级 到达时间 需要时间 周转时间 响应比 已用时间 进程状态 \n");
for (i=0;i<n;i++)
{ printf("%8s%8d%8d%10d%10d%10d%10d%10c\n",pcb[i].name,pcb[i].priority,pcb[i].ReachTime,pcb[i].NeedTime,pcb[i].CycleTime,pcb[i].Response,pcb[i].UsedTime,pcb[i].state);
}
}
void attemper() //调度
{
do{
if ((pcb[0].NeedTime-pcb[0].UsedTime)>pTime)
{
pcb[0].UsedTime+=pTime; //已用时间加时间片
pcb[0].priority--; //优先级减一
pcb[0].state='W';
}
else
{
pcb[0].UsedTime=pcb[0].NeedTime;//已用时间等于需要时间
pcb[0].priority=-1000; //优先级置为零
pcb[0].state='F'; //完成进程,将状态置为完成
}
print();
}while(pcb[0].state!='F');
}
void attemper1() //调度
{
do{
if (pcb[0].UsedTime!=pcb[0].NeedTime)
{
pcb[0].UsedTime+=pTime; //已用时间加时间片
pcb[0].priority--; //优先级减一
pcb[0].state='W';
if(pcb[0].UsedTime==pcb[0].NeedTime){
pcb[0].state='F';
pcb[0].priority=-1000;
}
}
print1();
}while(pcb[0].state!='F');
}
void attemper4() //调度
{
do{
if (pcb[0].UsedTime!=pcb[0].NeedTime)
{
pcb[0].UsedTime+=pTime; //已用时间加时间片
pcb[0].priority--; //优先级减一
pcb[0].state='W';
}
else
{
pcb[0].UsedTime=pcb[0].NeedTime;//已用时间等于需要时间
pcb[0].priority=-1000; //优先级置为零
pcb[0].state='F'; //完成进程,将状态置为完成
}
print();
}while(pcb[0].state!='F');
}
char face()
{
char choose;
printf("\n增加进程并调度进程,请按1");
printf("\n打印进程,请按2");
printf("\n任务结束, 请按0");
printf("\n请选择:");
do{
choose=getchar();
} while(choose!='1'&&choose!='2'&&choose!='0');
return choose;
}
void main()
{
char choose;
n=0; //初始化进程数为0
printf("设置时间片的大小:");
scanf("%d",&pTime);
choose=face();
do
{
if (choose=='1')
{
AddProcess4();
//sort2();
sort4();
print4();
sort5();
print4();
sort6();
print5();
sort7();
print5();
//attemper1();
}
if (choose=='2')
{
print1();
}
if (choose=='0')
{
return;
}
choose=face();
} while(1);
}
六。实验结果
先到先执行
短作业优先
最高响应比优先
时间片轮转
七。实验感受
这次实验比较困难,勉强做出实验结果,有不好地方,会慢慢做好!