struct PCB { char name; //进程名 double arrivalTime; //进程到达时间 double serviceTime; //进程要求服务时间 double startTime; //进程开始执行时间 double needServiceTime; //进程还需占用CPU时间 double endTime; //进程执行完成时间 double priority; //进程优先级 double turnaroundTime; //进程周转时间 double weightTurnarounfTime; //进程带权周转时间 string status; //进程状态 }; 结构体为以上PCB的最短剩余时间优先算法C语言实现
时间: 2023-05-31 18:05:05 浏览: 197
//头文件
#include<stdio.h>
#include<string.h>
//定义进程控制块的结构体
struct PCB {
char name; //进程名
double arrivalTime; //进程到达时间
double serviceTime; //进程要求服务时间
double startTime; //进程开始执行时间
double needServiceTime; //进程还需占用CPU时间
double endTime; //进程执行完成时间
double priority; //进程优先级
double turnaroundTime; //进程周转时间
double weightTurnarounfTime; //进程带权周转时间
char status[20]; //进程状态
};
//函数声明
void SJF(struct PCB[], int);
void display(struct PCB);
int main()
{
int n; //进程数量
printf("请输入进程数量:");
scanf("%d", &n);
struct PCB pcb[n]; //定义PCB数组
//输入每个进程的信息
for(int i=0;i<n;i++) {
printf("请输入第%d个进程的信息:\n", i+1);
printf("进程名:");
scanf("%s", &pcb[i].name);
printf("到达时间:");
scanf("%lf", &pcb[i].arrivalTime);
printf("要求服务时间:");
scanf("%lf", &pcb[i].serviceTime);
pcb[i].needServiceTime = pcb[i].serviceTime; //初始化还需占用CPU时间
printf("优先级:");
scanf("%lf", &pcb[i].priority);
strcpy(pcb[i].status, "未执行"); //初始化状态
printf("\n");
}
SJF(pcb, n); //调用最短剩余时间优先算法
//输出每个进程的信息
printf("进程名 到达时间 要求服务时间 开始执行时间 还需占用CPU时间 执行完成时间 优先级 周转时间 带权周转时间 状态\n");
for(int i=0;i<n;i++) {
display(pcb[i]);
}
return 0;
}
//最短剩余时间优先算法
void SJF(struct PCB pcb[], int n)
{
double currentTime = pcb[0].arrivalTime; //当前时间初始化为第一个进程到达时间
int count = 0; //已完成进程数量
while(count < n) {
int shortest = -1; //最短剩余时间的进程下标
double shortestTime = 999999; //最短剩余时间
//找到最短剩余时间的进程
for(int i=0;i<n;i++) {
if(pcb[i].status[0] != 'F' && pcb[i].arrivalTime <= currentTime && pcb[i].needServiceTime < shortestTime) {
shortestTime = pcb[i].needServiceTime;
shortest = i;
}
}
//更新进程信息
pcb[shortest].status[0] = 'E'; //标志为执行
pcb[shortest].startTime = currentTime;
pcb[shortest].endTime = currentTime + pcb[shortest].needServiceTime;
pcb[shortest].turnaroundTime = pcb[shortest].endTime - pcb[shortest].arrivalTime;
pcb[shortest].weightTurnarounfTime = pcb[shortest].turnaroundTime / pcb[shortest].serviceTime;
pcb[shortest].needServiceTime = 0;
currentTime = pcb[shortest].endTime;
count++;
}
}
//输出进程信息的函数
void display(struct PCB pcb)
{
printf("%c\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%.2lf\t%s\n", pcb.name, pcb.arrivalTime, pcb.serviceTime, pcb.startTime, pcb.needServiceTime, pcb.endTime, pcb.priority, pcb.turnaroundTime, pcb.weightTurnarounfTime, pcb.status);
}
阅读全文