进程调度C语言实现.docx
- 文档编号:4406850
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:20
- 大小:18.64KB
进程调度C语言实现.docx
《进程调度C语言实现.docx》由会员分享,可在线阅读,更多相关《进程调度C语言实现.docx(20页珍藏版)》请在冰豆网上搜索。
进程调度C语言实现
..
#include
#include
#include
typedefstructProcessNode{//进程结点的基本结构
charname;//进程名
intservice_time;//服务时间
intarrive_time;//到达时间
intpriority;//优先级
//先到先服务structFCFS_time{
完成时间//intfinish_time;
//intturnaround_time;周转时间floatweigtharound_time;//带权周转时间}FCFS_time;
//短作业优先structSJF_time{
intfinish_time;
intturnaround_time;
floatweigtharound_time;
intflag;
}SJF_time;
//时间片轮转的结点structRR_time{
intfinish_time;
intturnaround_time;
floatweigtharound_time;
intflag_time;//则进程完成0赋值为进程的服务时间,为}RR_time;
structPri_time{//优先权非抢占式
intfinish_time;
intturnaround_time;
floatweigtharound_time;
}Pri_time;
structProcessNode*next;
}ProcessNode,*Linklist;
voidmain()
{
intchoice;
;.
..
Linklistp,head;
Linklistread_information();
LinklistFCFS_scheduling(Linklisthead);
LinklistSJF_scheduling(Linklisthead);
LinklistRR_scheduling(Linklisthead);
LinklistPri_scheduling(Linklisthead);
head=read_information();//读入进程的基本信息
do{
p=head->next;
printf(\
);
**********\n);//输出初始化后的进程基本信息printf(**********进程初始信息输出printf(\
);
);
牰湩晴尨进程名称牰湩晴尨到达时间);
牰湩晴尨服务时间);
牰湩晴尨优先级);
printf(\
);
while(p)
{
printf(%c,p->name);
p->arrive_time);
%dprintf(
printf(%d,p->service_time);
printf(%d,p->priority);
printf(\
);
p=p->next;
}
printf(\
);
printf(************************************\n);//输出进程的调用选择项
printf(\
);
\n);、printf(FCFS----先到先服务
\n);短作业优先、SJF-----printf(
\n);RR------时间片轮转printf(、
\n);Pri-----printf(、优先权调度printf(_x0005_、退出\n);
printf(\
);
printf(************************************\n);
printf(\
);
);5—1牰湩晴尨请在之间选择:
scanf(%d,&choice);
printf(\
);
printf(\
);
;.
..
switch(choice)
{
case1:
FCFS_scheduling(head);
break;
case2:
SJF_scheduling(head);
break;
case3:
RR_scheduling(head);
break;
Pri_scheduling(head);case4:
break;
exit();//case5:
}
}while(choice!
=5);
}
Linklistread_information()//进程读入函数{
inti;
num;
int
//ProcessNode;
Linklistpro;
Linklistp;
Linklisthead;
printf(\
);
printf(************进程调度算法************\n);
printf(\
);
牰湩晴尨请输入进程的个数:
);
scanf(%d,&num);
printf(\
);
*************\n);初始化信息printf(*************printf(\
);
head=(Linklist)malloc(sizeof(ProcessNode));//头结点
head->next=NULL;
p=head;
for(i=1;i<=num;i++)
{
pro=(Linklist)malloc(sizeof(ProcessNode));//创建进程结点
:
\n,i);
输入第printf(%d个进程信息;.
..
printf(请输入进程名:
);
fflush(stdin);
scanf(%c,&pro->name);
printf(到达时间:
);
scanf(%d,&pro->arrive_time);
printf(服务时间:
);
scanf(%d,&pro->service_time);
:
);优先级↑printf(
scanf(%d,&pro->priority);
//pro->next=head->next;head->next=pro;//逆序建链
p->next=pro;p=pro;//顺序建链
//p++;
pro->next=NULL;
}
printf(\
);
returnhead;
}
先到先服务算法函数LinklistFCFS_scheduling(Linklisthead)//{
Linklistp;
Linklistq;//指向前一进程
p=head->next;
while(p)//初始化进程的完成时间、周转时间、带权周转时间,初值均赋为0
{
p->FCFS_time.finish_time=0;
p->FCFS_time.turnaround_time=0;
p->FCFS_time.weigtharound_time=0;
p=p->next;
}
p=q=head->next;
0避免第一个进程到达时间不为p->FCFS_time.finish_time=p->arrive_time;//
while(p)
{
if(p->arrive_time<=q->FCFS_time.finish_time)//下一进程已到达,在等待中{
p->FCFS_time.finish_time=(p->service_time)+(q->FCFS_time.finish_time);//服务时间;.
..
p->FCFS_time.turnaround_time=(p->FCFS_time.finish_time)-(p->arrive_time);//周转时间
p->FCFS_time.weigtharound_time=(float)(p->FCFS_time.turnaround_time)/(p->service_time);//带权周转时间
}
else
{
p->FCFS_time.finish_time=p->service_time+p->arrive_time;//服务时间
p->FCFS_time.turnaround_time=(p->FCFS_time.finish_time)-(p->arrive_time);//周转时间
带p->FCFS_time.weigtharound_time=(float)(p->FCFS_time.turnaround_time)/(p->service_time);//权周转时间
}
q=p;
p=p->next;
}
p=head->next;
输出先\n);//FCFS********************************printf(********************************
到先服务调度后的进程信息printf(\
);
);牰湩晴尨进程名称
牰湩晴尨到达时间);
牰湩晴尨服务时间);
牰湩晴尨优先级);
牰湩晴尨完成时间);
牰湩晴尨周转时间);
牰湩晴尨带权周转时间);
printf(\
);
while(p)
{
printf(%c,p->name);
printf(%d,p->arrive_time);
printf(%d,p->service_time);
printf(%d,p->priority);
printf(%d,p->FCFS_time.finish_time);
printf(%d,p->FCFS_time.turnaround_time);
printf(%0.2f,p->FCFS_time.weigtharound_time);
printf(\
);
p=p->next;
}
printf(\
);
printf(**********************************************************************\n);
printf(\
);
returnhead;
;.
..
}
LinklistSJF_scheduling(Linklisthead)//短作业优先算法
{
Linklistp,r;
Linklistq;//指向前一进程结点
intnum=0;//记录进程个数
intadd_flag=0;//进程完成服务个数
intservice_time_min;
intarrive_time;
intk;
p=head->next;//首元结点
0while(p)//初始化进程的完成时间、周转时间、带权周转时间,初值均赋为
{
p->SJF_time.finish_time=0;
p->SJF_time.turnaround_time=0;
p->SJF_time.weigtharound_time=0;
p->SJF_time.flag=0;
++num;
q=p;
p=p->next;
}
q->next=head->next;//将创建的进程队列变为循环队列
p=head->next;q=p;
p->SJF_time.finish_time=p->arrive_time+p->service_time;
p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周转时间
p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//带权周转时间
q->SJF_time.finish_time=p->SJF_time.finish_time;
add_flag=1;
p->SJF_time.flag=1;
p=p->next;
do{
if(p->SJF_time.flag==1){p=p->next;}
elseif((p->arrive_time)>(q->SJF_time.finish_time))
{
service_time_min=p->service_time;
arrive_time=p->arrive_time;
while(p->arrive_time==arrive_time&&p->SJF_time.flag==0)//寻找最短的作业{
;.
..
if((p->next->service_time)<(p->service_time)){service_time_min=p->next->service_time;p=p->next;}
else{p=p->next;}
}
p=q->next;
r=q;
while(p->service_time!
=service_time_min){p=p->next;}//指针指向最短作业
p->SJF_time.finish_time=p->arrive_time+p->service_time;
p->SJF_time.flag=1;++add_flag;
p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周转时间
带权周转时间p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//q=p;p=r->next;
}
else
{
k=0;
service_time_min=p->service_time;
while(((p->arrive_time)<=(q->SJF_time.finish_time))&&k<=num)//寻找最短的作业{
if(p->SJF_time.flag==1){p=p->next;++k;}
else
if((p->SJF_time.flag!
=1)&&((p->service_time) {service_time_min=p->service_time; p=p->next;++k;} else{p=p->next;++k;} } p=q->next; r=q; while(p->service_time! =service_time_min){p=p->next;}//指针指向最短作业 p->SJF_time.finish_time=q->SJF_time.finish_time+p->service_time; p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周转时间 p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//带权周转时间 p->SJF_time.flag=1;++add_flag; //q=p;p=p->next; q=p;p=r->next; } }while(add_flag! =num); for(p=head->next;num>0;num--)//断开循环队列;. .. { q=p;p=p->next; } q->next=NULL; 指向链首,输出短作业调度后的进程信息p=head->next;// printf(\ ); printf(********************************SJF*********************************\n); printf(\ ); );牰湩晴尨进程名称 牰湩晴尨到达时间); 牰湩晴尨服务时间); 牰湩晴尨优先级); 牰湩晴尨完成时间); 牰湩晴尨周转时间); 牰湩晴尨带权周转时间); printf(\ ); while(p) { printf(%c,p->name); printf(%d,p->arrive_time); printf(%d,p->service_time); printf(%d,p->priority); printf(%d,p->SJF_time.finish_time); printf(%d,p->SJF_time.turnaround_time); printf(%0.2f,p->SJF_time.weigtharound_time); printf(\ ); p=p->next; } printf(\ ); printf(**********************************************************************\n); printf(\ ); returnhead; } LinklistRR_scheduling(Linklisthead)//时间片轮转算法 { Linklistq;//指向前一进程结点 Linklistp; 时间片大小intq_time;//intnum=0;//记录进程个数intadd_flag=0;//进程完成服务个数 ;. .. 牰湩晴尨请输入时间片的大小: ); scanf(%d,&q_time); p=head->next; 0while(p)//初始化进程的完成时间、周转时间、带权周转时间,初值均赋为 { p->RR_time.finish_time=0; p->RR_time.turnaround_time=0; p->RR_time.weigtharound_time=0; p->RR_time.flag_time=p->service_time; q=p; ++num; p=p->next; } 将创建的进程队列变为循环队列q->next=head->next;//p=head->next; q->RR_time.finish_time=p->arrive_time; do{ /*printf(\ ); printf(**************************************************************\n); printf(%c,p->name); printf(%d,p->arrive_time); printf(%d,p->service_time); printf(%d,p->priority); printf(%d,p->RR_time.finish_time); printf(\ );*/ 服务时间大于时间片if((p->RR_time.flag_time)>(q_time))// { p->RR_time.finish_time=(q->RR_time.finish_time)+(q_time);//累加完成时间p->RR_time.flag_time=(p->RR_time.flag_time)-(q_time); if((p->next->arrive_time)<=(p->RR_time.finish_time))//有进程等待 {q=p;p=p->next;} 当前进程未完成,无进程等待,指针不向后移//else {q=p;} } elseif((p->RR_time.flag_time)==0)//进程已经完成 { p=p->next; } else { ;. .. p->RR_time.finish_time=(q->RR_time.finish_time)+(p->RR_time.flag_time); p->RR_time.flag_time=0;++add_flag; p->RR_time.turnaround_time=(p->RR_time.finish_time)-(p->arrive_time);//周转时间 p->RR_time.weigtharound_time=(float)(p->RR_time.turnaround_time)/(p->service_time);//带权周转时间 if((p->next->arrive_time)<(p->RR_time.finish_time))//有进程等待 {q=p;p=p->next;} else//当前进程完成,无进程等待,指针向后移 }//{q=p;q->RR_time.finish_time=p->next->arrive_time; {p=p->next;q=p;q->RR_time.finish_time=p->arrive_time;} } }whi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 调度 语言 实现