本项目采用C语言实现短作业优先调度算法在操作系统中的应用,旨在优化进程管理与任务调度效率。
以下是经过调整后的代码:
```c
#include
// 定义一个结构体用于存储进程的信息
struct sjf {
char name[10]; // 进程名
float arrivetime; // 到达时间
float servicetime; // 服务时间
float starttime; // 开始时间
float finishtime; // 完成时间
float zztime; // 周转时间
float dqzztime; // 带权周转时间
};
// 定义一个结构体数组用于存储多个进程的信息
struct sjf a[100];
// 输入函数,获取用户输入的进程信息并填充到结构体中。
void input(struct sjf *p, int N) {
printf(请输入各个进程的名字、到达时间和服务时间(例如:a 0 100)\n);
for(int i = 0; i < N; ++i) {
printf(%d号进程信息:\n, i + 1);
scanf(%s%f%f, &p[i].name, &p[i].arrivetime, &p[i].servicetime);
}
}
// 输出函数,打印所有进程的详细信息。
void Print(struct sjf *p, int N) {
printf(执行顺序:\n);
for(int k = 0; k < N - 1; ++k)
printf(%s-->, p[k].name);
if(N > 0)
printf(%s\n, p[N-1].name);
// 打印表格标题
printf(\n名字\t到达时间\t服务时间\t开始时间\t完成时间\t周转时间\t带权周转\n);
for(int k = 0; k < N ; ++k) {
printf(%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n,
p[k].name,
p[k].arrivetime,
p[k].servicetime,
p[k].starttime,
p[k].finishtime,
p[k].zztime,
p[k].dqzztime);
}
}
// 按到达时间排序
void sort(struct sjf *p, int N) {
for(int i = 0; i < N - 1; ++i)
for(int j = i + 1 ; j < N ; ++j)
if(p[i].arrivetime > p[j].arrivetime) { // 注意,这里使用大于号是为了按到达时间升序排序
struct sjf temp;
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
// 计算每个进程的开始、完成时间和周转及带权周转时间。
void deal(struct sjf *p, int N) {
for(int k = 0 ; k < N ; ++k){
if(k == 0)
p[k].starttime = p[k].arrivetime; // 第一个进程,其开始时间为到达时间
else{
if(p[k - 1].finishtime >= 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;
// 计算周转时间和带权周转时间
p[k].zztime = p[k].finishtime - p[k].arrivetime;
p[k].dqzztime= (p[k].zztime / p[k].servicetime);
}
}
// 短作业优先调度算法实现函数,先按到达时间排序后,再根据服务时间调整顺序。
void sjff(struct sjf *p, int N) {
sort(p,N); // 按到达时间进行升序排列
deal(p, N);
for(int m = 0; m < N - 1 ; ++m)
for(int n = m + 1; n < N ; ++n){
if(p[m].servicetime > p[n].servicetime){ // 根据服务时间调整顺序
struct sjf temp;
temp = p[m];
p[m] = p[n];
p[n] = temp;
}
}
deal(p, N); // 再次计算所有进程的开始、完成时间和周转及带权周转时间。
Print(p,N);
}
int main() {
int N;
printf(------短作业优先调度算法------\n);
printf(请输入进程数量