短作业优先算法c语言实现,短作业优先调度算法C语言实现.doc

#include

struct sjf//定义进程的结构体

{

char name[10];//进程名

float arrivetime;//到达时间

float servicetime;//服务时间

float starttime;//开始时间

float finishtime;//完成时间

float zztime;//周转时间

float dqzztime;//带权周转时间

};

sjf b[100];//定义短作业优先算法进程的最大数量

void Sinput(sjf *p,int N)//输入函数

{

int i;

printf("输入进程的名称、到达时间、服务时间:(例如: x 0 100)\n");

for(i=0;i<=N-1;i++)

{

printf("输入第%d进程的名称、到达时间、服务时间:",i+1);

scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);

}

}

//输出函数

void SPrint(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N)

{

int k;

printf("\n执行顺序:\n");

printf("%s",p[0].name);

for(k=1;k

{

printf("-%s",p[k].name);

}

printf("\n进程名\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n");

for(k=0;k<=N-1;k++)

{

printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);

}

}

void Ssort(sjf *p,int N) //按短作业优先算法排序

{

for(int i=1;i<=N-1;i++)

for(int j=1;j<=i;j++)

if(p[i].servicetime

{

sjf temp;

temp=p[i];

p[i]=p[j];

p[j]=temp;

}

}

//运行结果

void Sdeal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,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].arrivetime+p[k].servicetime;

}

else

{

p[k].starttime=p[k-1].finishtime;//开始时间=前一个进程的完成时间

p[k].finishtime=p[k-1].finishtime+p[k].servicetime;//结束时间=前一个进程的完成时间+现在进程的服务时间

}

}

for(k=0;k<=N-1;k++)

{

p[k].zztime=p[k].finishtime-p[k].arrivetime;//周转时间=完成时间-到达时间

p[k].dqzztime=p[k].zztime/p[k].servicetime;//带权周转时间=周转时间/服务时间

}

}

void SJF(sjf *p,int N)

{

float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;

Ssort(p,N);

Sdeal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

SPrint(p,arrivetime,service

#include //定义一个结构体 struct sjf{ char name[10]; //进程名 float arrivetime; //到达时间 float servicetime;//服务时间 float starttime; //开始时间 float finishtime;//完成时间 float zztime;//周转时间 float dqzztime;//带权周转 }; //定义一个结构体数组 sjf a[100]; //定义一个输入函数 void input(sjf *p,int N) { int i; printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n"); for(i=0;i<=N-1;i++) { printf("input the %dth process's information:\n",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); } } //定义一个输出函数 void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) { int k; printf("run order:");//执行顺序 printf("%s",p[0].name); for(k=1;k%s",p[k].name); } printf("\nthe process's information:\n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n"); for(k=0;k<=N-1;k++) { printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime); } } //按到达时间排序 void sort(sjf *p,int N) { for(int i=0;i<=N-1;i++) for(int j=0;j<=i;j++) if(p[i].arrivetime<p[j].arrivetime) { sjf temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } //运行阶段 void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) { int k; for(k=0;k=p[k].arrivetime) { p[k].starttime=p[k-1].finishtime;} else { p[k].starttime =p[k].arrivetime;} p[k].finishtime=p[k].starttime+p[k].servicetime; } } for(k=0;k<=N-1;k++) { p[k].zztime=p[k].finishtime-p[k].arrivetime;//周转时间=完成时间-到达时间 p[k].dqzztime=p[k].zzti
很抱歉,作为AI,我没有能力提供实验报告。但是我可以为您提供一些关于时间片轮转调度算法的基本信息和C语言实现的思路。 时间片轮转调度算法是一种常用的进程调度算法,它将CPU时间分成若干个时间片,每个进程在一个时间片内获得相同数量的CPU时间,如果进程在时间片结束之前没有执行完,则将其放入就绪队列的末尾,等待下一次执行。这样可以保证每个进程都有机会获得CPU时间,避免进程长时间占用CPU的情况,提高系统的资源利用率。 在C语言中,我们可以使用结构体来表示进程的信息,包括进程ID、进程状态、执行时间和优先级等。我们可以使用一个数组来存储所有进程的信息,并使用一个循环队列来表示就绪队列,每个时间片从队首开始执行,执行完毕后将进程放到队列尾部,直到所有进程都执行完毕。 以下是时间片轮转调度算法C语言实现参考代码: ``` #include <stdio.h> #define MAX_PROCESS_NUM 10 #define TIME_SLICE 2 struct Process { int pid; // 进程ID int status; // 进程状态,0表示未执行,1表示正在执行,2表示已完成 int priority; // 进程优先级 int execute_time; // 进程执行时间 }; int main() { struct Process processes[MAX_PROCESS_NUM]; int ready_queue[MAX_PROCESS_NUM]; int head = 0, tail = 0; int process_num, current_time = 0; int i, j; printf("请输入进程数:"); scanf("%d", &process_num); // 初始化进程信息 for (i = 0; i < process_num; i++) { printf("请输入进程%d的信息(ID 优先级 执行时间):", i + 1); scanf("%d%d%d", &processes[i].pid, &processes[i].priority, &processes[i].execute_time); processes[i].status = 0; // 所有进程初始状态均为未执行 } // 将所有进程放入就绪队列 for (i = 0; i < process_num; i++) { ready_queue[tail++] = i; } // 时间片轮转调度 while (head != tail) { // 就绪队列不为空 int current_process = ready_queue[head]; head = (head + 1) % MAX_PROCESS_NUM; // 队首出队 if (processes[current_process].execute_time > TIME_SLICE) { // 执行一个时间片 current_time += TIME_SLICE; processes[current_process].execute_time -= TIME_SLICE; // 将进程重新放入就绪队列末尾 ready_queue[tail] = current_process; tail = (tail + 1) % MAX_PROCESS_NUM; } else { // 执行剩余时间 current_time += processes[current_process].execute_time; processes[current_process].execute_time = 0; processes[current_process].status = 2; // 进程执行完毕 // 输出进程执行信息 printf("进程%d执行完毕,执行时间:%d,优先级:%d\n", processes[current_process].pid, current_time, processes[current_process].priority); // 将已完成进程从就绪队列中删除 for (i = 0; i < tail; i++) { if (ready_queue[i] == current_process) { for (j = i; j < tail - 1; j++) { ready_queue[j] = ready_queue[j + 1]; } tail--; break; } } } } return 0; } ``` 以上代码仅供参考,具体实现方式可以根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值