一、先来先服务
1.1 代码
#include <stdio.h>
#include <string.h>
double avg_TurnaroundTime;
double AQTT;
struct progress{
char proName[80];
int arriveTime;
int serviceTime;
int finishTime;
int cyclingTime;
double float_Wi;
};
struct progress course[80];
void health_Examine(int *courseNum)
{return; }
void progressNum(int *courseNum)
{int i=0;
for(i=0; i<*courseNum;i++){
printf("请输入第%d个进程的相应信息。\n", i+1);
printf("请输入进程名:");
scanf("%s", course[i].proName);
printf("请输入到达时间:");
scanf("%d", &course[i].arriveTime);
printf("请输入服务时间:");
scanf("%d", &course[i].serviceTime); }
return;
}
void finish_Time(int *courseNum)
{int i=0;
if(course[0].arriveTime != 0)
{course[0].finishTime=course[0].arriveTime + course[0].serviceTime; }
course[0].finishTime=course[0].serviceTime;
for(i=1; i<*courseNum; i++){
if(course[i-1].finishTime >= course[i].arriveTime) {
course[i].finishTime=course[i-1].finishTime + course[i].serviceTime;
}else{
course[i].finishTime=course[i].arriveTime + course[i].serviceTime;
}
}
return;
}
void cyclingTime(int *courseNum)
{int i=0;
for(i=0; i<*courseNum; i++) {
course[i].cyclingTime=course[i].finishTime - course[i].arriveTime;
}
return;
}
void float_Wi(int *courseNum)
{int i=0;
for(i=0; i<*courseNum; i++){
course[i].float_Wi=(double)course[i].cyclingTime/course[i].serviceTime;
}
return;
}
void avgTurnaroundTime(int *courseNum)
{ int i=0,sum_TurnaroundTime=0;
for(i=0; i<*courseNum; i++){
sum_TurnaroundTime += course[i].cyclingTime;
}
avg_TurnaroundTime=sum_TurnaroundTime/(*courseNum);
return;
}
void _AQTT(int *courseNum)
{int i=0;
double sum_float_Wi=0;
for(i=0; i<*courseNum; i++){
sum_float_Wi += course[i].float_Wi;
}
AQTT=sum_float_Wi/(*courseNum);
return;
}
void print_FIFO(int *courseNum)
{int i=0;
printf("进程的相应信息。\n");
printf("进程\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转\n");
for(i=0; i<*courseNum;i++) {
printf("%s\t %d\t\t %d\t\t %d\t\t %d\t\t %.002lf\t\t\n", course[i].proName,course[i].arriveTime, course[i].serviceTime,course[i].finishTime,course[i].cyclingTime,course[i].float_Wi);
}
printf("平均周转时间\t平均带权周转时间\n");
printf(" %.002lf\t\t %.002lf\n",avg_TurnaroundTime,AQTT);
return;
}
int main(){
int courseNum=5;
printf("请输入进程数:");
scanf("%d", &courseNum);
progressNum(&courseNum);
finish_Time(&courseNum);
cyclingTime(&courseNum);
float_Wi(&courseNum);
avgTurnaroundTime(&courseNum);
_AQTT(&courseNum);
print_FIFO(&courseNum);
return 0;
}
1.2 运行截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e0cd98d992ca2ab6962bf1f29e1ec739.png)
二、短进程优先
2.1 代码
#include <stdlib.h>
#include <stdio.h>
typedef struct PCB{
char processName[10];
float arriveTime;
float serviceTime;
float startTime;
float finishTime;
float turnroundTime;
float weightedTurnaroundTime;
}pcb;
void input(pcb *p,int N)
{
int i;
printf("\n");
printf("请输入进程的名字 到达时间 服务时间: (例如: A 0 100)\n");
for(i=0; i <= N-1; i++)
{
printf("请输入进程%d的信息:", i+1);
scanf("%s", &p[i].processName);
scanf("%f", &p[i].arriveTime);
scanf("%f", &p[i].serviceTime);
}
}
void sort(pcb *p, int N)
{
int i,j,m,n,k;
for(i=0;i<=N-1;i++)
{
for(j=i+1;j<N;j++)
{
if(p[i].arriveTime>p[j].arriveTime || (p[i].arriveTime==p[j].arriveTime && p[i].serviceTime>p[j].serviceTime) )
{
pcb temp;
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
for(m=0; m<N-1; m++)
{
if(m == 0)
p[m].finishTime = p[m].arriveTime + p[m].serviceTime;
else
p[m].finishTime = ((p[m-1].finishTime >= p[m].arriveTime)? p[m-1].finishTime: p[m].arriveTime) + p[m].serviceTime;
int i=0;
for(n = m+1; n <= N-1; n++)
{
if(p[n].arriveTime <= p[m].finishTime)
i++;
else
break;
}
float min = p[m+1].serviceTime;
int next = m+1;
for(k = m+1; k < m+i; k++)
{
if(p[k+1].serviceTime < min)
{
min = p[k+1].serviceTime;
next = k+1;
}
}
pcb temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
}
void run(pcb *p, int N)
{
int k;
for(k=0; k <= N-1; k++)
{
if(k==0)
{
p[k].startTime = p[k].arriveTime;
p[k].finishTime = p[k].startTime + p[k].serviceTime;
}
else
{
p[k].startTime = (p[k-1].finishTime >= p[k].arriveTime)? p[k-1].finishTime: p[k].arriveTime;
p[k].finishTime = p[k].startTime + p[k].serviceTime;
}
}
for(k=0; k<=N-1; k++)
{
p[k].turnroundTime = p[k].finishTime - p[k].arriveTime;
p[k].weightedTurnaroundTime = p[k].turnroundTime / p[k].serviceTime;
}
}
void Print(pcb *p, int N)
{
int k;
printf("\n调用最短进程优先算法以后进程运行的顺序是: ");
printf("%s",p[0].processName);
for(k=1;k<N;k++)
{
printf("-->");
printf("%s", p[k].processName);
}
printf("\n");
printf("具体进程调度信息:\n");
printf("进程名 到达时间 服务时间 开始时间 结束时间 周转时间 带权周转时间\n");
for(k=0; k<=N-1; k++)
{
printf("%4s", p[k].processName);
printf("%10.3f", p[k].arriveTime);
printf("%10.3f", p[k].serviceTime);
printf("%10.3f", p[k].startTime);
printf("%10.3f", p[k].finishTime);
printf("%10.3f", p[k].turnroundTime);
printf("%10.3f\n", p[k].weightedTurnaroundTime);
}
}
void sjff(pcb *p,int N)
{
sort(p, N);
run(p, N);
Print(p, N);
int k;
float atTime = 0;
float AQTTime = 0;
for(k=0; k<=N-1; k++)
{
atTime += p[k].turnroundTime;
AQTTime += p[k].weightedTurnaroundTime;
}
atTime = atTime/N;
AQTTime = AQTTime/N;
printf("\n调用短进程优先算法的平均周转时间为:");
printf("%.3f\n", atTime);
printf("调用短进程优先算法的平均带权周转时间为:");
printf("%.3f\n", AQTTime);
}
int main()
{
pcb a[50];
int N;
printf("\n");
printf("\n");
printf("输入进程数目:");
scanf("%d", &N);
input(a, N);
sjff(a, N);
return 0;
}
2.2 运行截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/80406b5cc82e256541d092e6f4990f5e.png)
三、时间片轮转
3.1 代码
#include<stdio.h>
#define N 50
struct PCB
{
int pn;
int at;
int st;
int ct;
int sc;
int st1;
}process[N];
int sjp(int n)
{
int i,j,T;
printf("\n请输入时间片:\n");
scanf("%d",&T);
for(i=1;i<=n;i++)
{
process[i].sc=0;
printf("\n%d:\n请依次输入进程的信息\n请输入pn:",i);
scanf("%d",&process[i].pn);
printf("请输入at:");
scanf("%d",&process[i].at);
printf("请输入st:");
scanf("%d",&process[i].st);
process[i].st1=process[i].st;
}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
if(process[j].at<process[i].at)
{
process[0]=process[j];
process[j]=process[i];
process[i]=process[0];
}
}
int time=process[1].at;
int flag=1;
int sum=0;
printf("\n第几次调度进程 运行的进程pn 开始运行时间 运行时间 剩余服务时间 结束时间\n");
int z=1;
while(sum<n)
{
flag=0;
for(i=1;i<=n;i++)
{
if(process[i].sc==1) continue;
else
{
if(process[i].st1<=T&&time>=process[i].at)
{
flag=1;
time=time+process[i].st1;
process[i].sc=1;
process[i].ct=time;
printf("%8d%12d%15d%11d%11d%11d\n",z++,process[i].pn,time-process[i].st1,process[i].st1,0,time);
process[i].st1=0;
}
else if(process[i].st1>T&&time>=process[i].at)
{
flag=1;
time=time+T;
process[i].st1-=T;
printf("%8d%12d%15d%11d%11d%11d\n",z++,process[i].pn,time-T,T,process[i].st1,time);
}
if(process[i].sc==1) sum++;
}
}
if(flag==0&&sum<n)
{
for(i=1;i<=n;i++)
if(process[i].sc==0) {time=process[i].at;break;}
}
}
}
int main()
{
int n;
printf("\t\t时间片轮转调度算法\n");
printf("请输入总进程数:\n");
scanf("%d",&n);
sjp(n);
return 0;
}
3.2 运行截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/adc8b37041d583de3c1182b95ca1d8f0.png)
四、多级队列