SJF(短作业优先)算法 C++ 实现

1 SJF简介

    简介后续补上。该算法为非抢占式调度算法,抢占式SJF算法代码后续补上...

2 源代码

#include <iostream>
#include <string>

using namespace std;

//进程个数
const int N=5;
//进程结构体
struct Process
{
	string name;//进程名
	int arriveTime;//进程到达时间
	int runTime;//进程运行时间
	int startTime;//进程开始时间
	int finishTime;//运行结束时间
	bool isfinished;//是否运行完成
};

//打印所有进程信息
void PrintProcess(Process *A)
{
	cout<<"name"<<" "<<"arriveTime"<<" "<<"runTime"<<" "<<"startTime"<<" "<<"endTime"<<" "<<"isfinished"<<endl;
	for(int i=0;i<N;i++)
	{
		cout<<A->name<<"   "<<A->arriveTime<<"\t\t"<<A->runTime<<"\t"<<A->startTime<<"\t  "<<A->finishTime<<"\t  "<<A->isfinished<<endl;
		A++;
	}
}

//按照到达时间排序
void SortedByArrivedTime(Process *A)
{
	for(int i=0;i<4;i++)
	{
		for(int j=i+1;j<5;j++)
		{
			if((A+j)->arriveTime<(A+i)->arriveTime)
			{ 
				string Na;
				int aT,rT,sT;
				int edT;
				bool isF;

				Na=(A+i)->name;
				(A+i)->name = (A+j)->name;
				(A+j)->name = Na;

				aT=(A+i)->arriveTime;
				(A+i)->arriveTime = (A+j)->arriveTime;
				(A+j)->arriveTime = aT;

				rT=(A+i)->runTime;
				(A+i)->runTime = (A+j)->runTime;
				(A+j)->runTime = rT;

				sT=(A+i)->startTime;
				(A+i)->startTime = (A+j)->startTime;
				(A+j)->startTime = sT;

				edT=(A+i)->finishTime;
				(A+i)->finishTime = (A+j)->finishTime;
				(A+j)->finishTime = edT;

				isF=(A+i)->isfinished;
				(A+i)->isfinished = (A+j)->isfinished;
				(A+j)->isfinished = isF;
			}
		}
	}
}
//按照开始时间排序
void SortedByStartTime(Process *A)
{
	for(int i=0;i<4;i++)
	{
		for(int j=i+1;j<5;j++)
		{
			if((A+j)->startTime<(A+i)->startTime)
			{ 
				string Na;
				int aT,rT,sT;
				int edT;
				bool isF;

				Na=(A+i)->name;
				(A+i)->name = (A+j)->name;
				(A+j)->name = Na;

				aT=(A+i)->arriveTime;
				(A+i)->arriveTime = (A+j)->arriveTime;
				(A+j)->arriveTime = aT;

				rT=(A+i)->runTime;
				(A+i)->runTime = (A+j)->runTime;
				(A+j)->runTime = rT;

				sT=(A+i)->startTime;
				(A+i)->startTime = (A+j)->startTime;
				(A+j)->startTime = sT;

				edT=(A+i)->finishTime;
				(A+i)->finishTime = (A+j)->finishTime;
				(A+j)->finishTime = edT;

				isF=(A+i)->isfinished;
				(A+i)->isfinished = (A+j)->isfinished;
				(A+j)->isfinished = isF;
			}
		}
	}
}

int main()
{
	Process Proc[N]={
		{"P1",5,7},
		{"P2",4,4},
		{"P3",3,1},
		{"P4",2,4},
		{"P5",1,5}
	};
    
    //按照进程到达时间排序并打印输出
	SortedByArrivedTime(&Proc[0]);
	PrintProcess(&Proc[0]);
	int finishALL=0;
	int CurrentTime=0;
	int i=0;
	while(finishALL<N)
	{
		if(CurrentTime>Proc[0].arriveTime && finishALL==0)
		{
			CurrentTime = Proc[0].arriveTime;
			Proc[0].startTime = Proc[0].arriveTime;
			Proc[0].finishTime = CurrentTime+Proc[0].runTime;
			CurrentTime = CurrentTime+Proc[0].runTime;
			Proc[0].isfinished=1;
			finishALL++;
			i++;
		}
		else if (CurrentTime>Proc[i].arriveTime && finishALL>0)
		{
			//num:统计当前可执行进程的个数
			int num=0;
			//若num=1
			int temp;
			for(int j=0;j<N;j++)
			{
				if(Proc[j].isfinished==1)
				{
					continue;
				}
				if(CurrentTime>=Proc[j].arriveTime)
				{
					num++;
					temp=j;
				}
			}
			if(num==1)
			{
				//CurrentTime = Proc[temp].arriveTime;
				Proc[temp].startTime = CurrentTime;
				Proc[temp].finishTime = CurrentTime+Proc[temp].runTime;
				Proc[temp].isfinished=1;
				finishALL++;
				i++;
			}
			else if (num>1)
			{
				int minProcess=0;
				int k;
				//找出当前运行时间最短的进程
				for( k=0;k<N;k++)
				{
					if(Proc[k].isfinished==1)
					{
						continue;
					}
					else 
					{
						if(Proc[k].runTime<Proc[minProcess].runTime)
						{
							minProcess = k;
						}
					}
				}
				//CurrentTime = CurrentTime+Proc[k].runTime;
				Proc[minProcess].startTime = CurrentTime;
				Proc[minProcess].finishTime = CurrentTime+Proc[minProcess].runTime;
				CurrentTime = Proc[minProcess].finishTime;
				Proc[minProcess].isfinished=1;
				finishALL++;
			}
		}
		else
		{
			CurrentTime++;
		}
	}
    
    //按照进程开始运行时间排序并打印输出
	SortedByStartTime(&Proc[0]);
	PrintProcess(&Proc[0]);
}

3 结果

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,让我向您解释一下如何使用C结构体来实现SJF作业优先调度算法。 首先,我们需要定义一个结构体来表示每个作业的信息,包括作业的名称、到达时间、服务时间和等待时间。结构体可以定义如下: ```c struct job { char name[10]; int arrive_time; int service_time; int waiting_time; }; ``` 然后,我们可以创建一个作业数组来存储所有的作业信息,并按照到达时间的顺序对它们进行排序。这可以通过一个输入函数来实现,如下所示: ```c void input_jobs(struct job jobs[], int n) { int i; for (i = 0; i < n; i++) { printf("请输入第 %d 个作业的名称、到达时间和服务时间: ", i + 1); scanf("%s %d %d", &jobs[i].name, &jobs[i].arrive_time, &jobs[i].service_time); } // 按照到达时间排序 qsort(jobs, n, sizeof(struct job), cmp_by_arrive_time); } ``` 在这个函数中,我们让用户逐个输入每个作业的名称、到达时间和服务时间,并按照到达时间进行排序。我们还需要定义一个函数 cmp_by_arrive_time() 来比较两个作业的到达时间: ```c int cmp_by_arrive_time(const void *a, const void *b) { const struct job *j1 = (const struct job *)a; const struct job *j2 = (const struct job *)b; return j1->arrive_time - j2->arrive_time; } ``` 接下来,我们可以实现SJF作业优先调度算法。该算法基于服务时间来决定下一个要执行的作业。我们使用一个指针来指向当前时间点正在执行的作业,并将其初始化为 NULL。然后,我们遍历作业数组,如果遇到了一个到达时间小于等于当前时间并且服务时间比当前作业作业,就将当前指针指向该作业。最后,我们更新当前时间,将等待时间和运行时间都累加到总和中,并输出结果。 完整的代码如下所示: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> struct job { char name[10]; int arrive_time; int service_time; int waiting_time; }; void input_jobs(struct job jobs[], int n); int cmp_by_arrive_time(const void *a, const void *b); int main() { int n, i, current_time = 0, total_waiting_time = 0, total_service_time = 0; struct job *current_job = NULL; struct job *jobs; printf("请输入作业个数: "); scanf("%d", &n); jobs = malloc(n * sizeof(struct job)); input_jobs(jobs, n); for (i = 0; i < n; i++) { if (current_job != NULL && current_time < jobs[i].arrive_time && total_service_time != 0) { // 暂停执行当前作业,更新等待时间和当前时间 current_job->waiting_time += (jobs[i].arrive_time - current_time); total_waiting_time += (jobs[i].arrive_time - current_time); current_time = jobs[i].arrive_time; } if (current_job == NULL || jobs[i].service_time < current_job->service_time) { // 切换到更作业 current_job = &jobs[i]; } current_job->service_time--; total_service_time++; if (current_job->service_time == 0) { // 当前作业执行完毕,更新当前时间 current_time += 1; current_job = NULL; } } printf("\n作业执行结果如下:\n"); for (i = 0; i < n; i++) { printf("作业名称:%s,等待时间:%d\n", jobs[i].name, jobs[i].waiting_time); } printf("平均等待时间:%f\n", (float)total_waiting_time / n); free(jobs); return 0; } void input_jobs(struct job jobs[], int n) { int i; for (i = 0; i < n; i++) { printf("请输入第 %d 个作业的名称、到达时间和服务时间: ", i + 1); scanf("%s %d %d", &jobs[i].name, &jobs[i].arrive_time, &jobs[i].service_time); } // 按照到达时间排序 qsort(jobs, n, sizeof(struct job), cmp_by_arrive_time); } int cmp_by_arrive_time(const void *a, const void *b) { const struct job *j1 = (const struct job *)a; const struct job *j2 = (const struct job *)b; return j1->arrive_time - j2->arrive_time; } ``` 希望这可以帮助您更好地理解如何使用C结构体来实现SJF作业优先调度算法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值