- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define TAKEIN "Takein"//吸纳状态
- #define WAIT "Wait"//就绪状态
- #define RUN "Run"//运行状态
- #define FINISH "Finish"//完成状态
- #define JOBNUMBER 5 //设置进程测试数为5
- #define MIN 100
- typedef struct PCB{
- char jobName[10];//作业号
- int arriveTime;//到达时间
- int runTime;//需要运行时间
- int startTime;//开始时间
- int endTime;//完成时间
- int turnoverTime;//周转时间
- float useWeightTurnoverTime;//带权周转时间
- char processStatus[10];//进程状态
- };
- static int currentTime = 0;
- static int finishNumber = 0;
- char JobArray[JOBNUMBER][10];
- static int indexJob = 1;
- //创建PCB
- void createPCB(struct PCB* pcb){
- freopen("input.txt","r",stdin);
- printf("从文件中读入三个参数的数据:\n");
- printf("作业号 到达时间 需要运行时间\n");
- for(int i = 0; i < 5; i++){
- scanf("%s", &pcb[i].jobName);//作业号
- scanf("%d", &pcb[i].arriveTime);//到达时间
- scanf("%d", &pcb[i].runTime);//需要运行时间
- pcb[i].startTime = 0;
- pcb[i].endTime = 0;
- pcb[i].turnoverTime = 0;
- pcb[i].useWeightTurnoverTime = 0.0;
- strcpy(pcb[i].processStatus, TAKEIN);
- printf("%s\t%d\t%d\n",pcb[i].jobName, pcb[i].arriveTime,pcb[i].runTime);
- }
- printf("---------------------------------------------\n");
- }
- //打印用途
- void printJob(struct PCB* pcb){
- printf("当前时间为%d\n", currentTime);
- printf("作业号 到达时间 需要运行时间 开始时间 完成时间 周转时间 带权周转时间 进程状态\n");
- for(int i = 0; i < JOBNUMBER; i++){
- if(strcmp(pcb[i].processStatus, FINISH) == 0)//如果进程为finish状态,这样输出
- printf("%s\t%d\t%4d\t\t%d\t%d\t %d\t%.2f\t%s\n", pcb[i].jobName, pcb[i].arriveTime, pcb[i].runTime, pcb[i].startTime, pcb[i].endTime, pcb[i].turnoverTime, pcb[i].useWeightTurnoverTime, pcb[i].processStatus);
- else if(strcmp(pcb[i].processStatus, RUN) == 0)//如果进程为run状态,这样输出
- printf("%s\t%d\t%4d\t\t%d\t运行中\t none\tnone \t%s\n", pcb[i].jobName, pcb[i].arriveTime, pcb[i].runTime, pcb[i].startTime, pcb[i].processStatus);
- else //如果进程为take in或wait状态,这样输出
- printf("%s\t%d\t%4d\t\t未运行\tnone\t none\tnone \t%s\n", pcb[i].jobName, pcb[i].arriveTime, pcb[i].runTime, pcb[i].processStatus);
- }
- printf("---------------------------------------------\n");
- }
- //根据当前时间修改status状态
- void statusConfirm(struct PCB* pcb){
- for(int i = 0; i < JOBNUMBER; i++){
- //将当前时间为进程的到达时间,修改take in状态改为Wait状态
- if(currentTime >= pcb[i].arriveTime && strcmp(pcb[i].processStatus, TAKEIN) == 0){
- strcpy(pcb[i].processStatus, WAIT);
- }
- }
- }
- //确定当前时间wait进程中最短进程的数组下标,没有wait进程则返回-1
- int shortIndex(struct PCB* pcb){
- int min = MIN, temp = -1;
- statusConfirm(pcb);
- for(int i = 0; i < JOBNUMBER; i++){
- if(strcmp(pcb[i].processStatus, WAIT) == 0){
- if(pcb[i].runTime <= min){
- min = pcb[i].runTime;
- temp = i;
- }
- }
- }
- return temp;
- }
- //运行第一个到达的进程
- void runFirstJob(struct PCB* pcb){
- pcb[0].startTime = currentTime;
- int endTime = pcb[0].startTime + pcb[0].runTime;
- strcpy(pcb[0].processStatus, RUN);
- while(true){
- if(currentTime == endTime){
- pcb[0].endTime = endTime;
- pcb[0].turnoverTime = pcb[0].endTime - pcb[0].arriveTime;
- pcb[0].useWeightTurnoverTime = pcb[0].turnoverTime * 1.0 / pcb[0].runTime;
- strcpy(pcb[0].processStatus, FINISH);
- finishNumber++;
- break;
- }
- else{
- statusConfirm(pcb);
- printJob(pcb);
- currentTime++;
- }
- }
- }
- //运行其他进程
- void runOtherJob(struct PCB* pcb)
- {
- int index = shortIndex(pcb);
- strcpy(JobArray[indexJob++], pcb[index].jobName);
- if(index == -1) //没有进程处于wait状态
- printJob(pcb);
- else{
- pcb[index].startTime = currentTime;
- pcb[index].endTime = pcb[index].startTime + pcb[index].runTime;
- pcb[index].turnoverTime = pcb[index].endTime - pcb[index].arriveTime;
- pcb[index].useWeightTurnoverTime = pcb[index].turnoverTime * 1.0 / pcb[index].runTime;
- strcpy(pcb[index].processStatus, RUN);
- while(true){
- statusConfirm(pcb);
- if(currentTime == pcb[index].endTime){
- strcpy(pcb[index].processStatus, FINISH);
- finishNumber++;
- if(finishNumber == JOBNUMBER){
- printJob(pcb);
- }
- break;
- }
- else{
- printJob(pcb);
- currentTime++;
- }
- }
- }
- }
- //比较各个进程之间的到达时间,按升序排列
- void compare(struct PCB* pcb){
- for(int i = 0; i < JOBNUMBER; i++){
- int min = pcb[i].arriveTime;
- int minIndex = i;
- for(int j = i + 1; j < JOBNUMBER; j++){
- if(pcb[j].arriveTime < min){
- min = pcb[j].arriveTime;
- minIndex = j;
- }
- }
- struct PCB temp = pcb[i];
- pcb[i] = pcb[minIndex];
- pcb[minIndex] = temp;
- }
- }
- //计算平均带权周转时间
- float weightTurnoverTimeCount(struct PCB* pcb){
- float sum = 0.0;
- for(int i = 0; i < JOBNUMBER; i++){
- sum += pcb[i].useWeightTurnoverTime;
- }
- return sum / JOBNUMBER;
- }
- //计算平均周转时间
- float turnOverTimeCount(struct PCB* pcb){
- float sum = 0.0;
- for(int i = 0; i < JOBNUMBER; i++){
- sum += pcb[i].turnoverTime;
- }
- return sum / JOBNUMBER;
- }
- //开始进程调度
- void start(struct PCB* pcb){
- compare(pcb);
- int firstArriveTime = pcb[0].arriveTime;
- //进程调度位currentTime每次加1,直到进程全部被调度完成为止
- for(; finishNumber != 5; currentTime++){
- if(currentTime < firstArriveTime)//当前时间小于第一个节点到来时间时,直接打印
- printJob(pcb);
- else if(currentTime == firstArriveTime)//当时间来到第一个进程的到达时间,调度该进程
- runFirstJob(pcb);
- else{ //根据短进程优先开始调度
- currentTime--;
- runOtherJob(pcb);
- }
- }
- printf("1、进程调度顺序为:%s, %s, %s, %s, %s\n", pcb[0].jobName, JobArray[1], JobArray[2], JobArray[3], JobArray[4]);
- printf("2、平均周转时间为:%.2f\n",turnOverTimeCount(pcb));
- printf("3、平均带权周转时间为:%.2f\n", weightTurnoverTimeCount(pcb));
- printf("------------------测试完毕---------\n");
- }
- //主函数
- int main(){
- struct PCB pcb[JOBNUMBER];
- createPCB(pcb);
- start(pcb);
- return 0;
- }
短进程优先
最新推荐文章于 2021-11-27 10:22:03 发布