C语言 短作业 进程 优先调度算法,如何证明按短作业优先算法调度时其平均周转时间最短...

满意答案

00e27ab806e4881f8254fe7ae8741834.png

phoenix810

2013.11.30

00e27ab806e4881f8254fe7ae8741834.png

采纳率:56%    等级:11

已帮助:8957人

假设有n个作业,按照运行时间排序t1 < t2 <... tn>

平均周转时间 = (总的运行时间 + 总的等待时间)/n

其中总的运行时间是定值,n为定值,因此要平均周转时间最短既要求总的等待时间最短。

按照最短作业优先,设第i个作业的等待时间为ai.则

a1 = 0

a2 = t1

a3 = t1 + t2

....

an = t1 + t2 + ... + t(i-1)

总的等待时间为a1 + a2 + a3 + ... + an

现在只需要证明这个是最小就可以了。任意取2个作业i 和 j。 且ti < tj。交换ti和tj的顺序。

则新等待时间变成b0 b1 b2 .... b(i-1) bi b(i+1) ..... b(j-1) bj b(j+1) ... bn 其中b0 + b1 + ... + b(i-1) + bi与原来的a相等。

b(i+1) = t1 + t2 + ... + t(i-1) + tj > t1 + t2 + ... + t(i-1) + ti = a(i+1)

依次类推之后bx > ax 其中i < x < j+1.之后b与a又相等。

所以任意交换后,等待时间变大。所以最小作业优先的等待时间最小。所以平均周转时间最短。

00分享举报

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用 C 语言实现最短作业优先调度算法的示例代码: ```c #include <stdio.h> #define MAX_JOBS 100 typedef struct { int id; int arrival_time; int burst_time; int completion_time; int waiting_time; int turnaround_time; } Job; int main() { int n, i, j; Job jobs[MAX_JOBS], tmp; // 输入作业数量 printf("Enter the number of jobs: "); scanf("%d", &n); // 输入每个作业的到达时间和执行时间 for (i = 0; i < n; i++) { printf("Enter arrival time and burst time for job %d: ", i + 1); scanf("%d %d", &jobs[i].arrival_time, &jobs[i].burst_time); jobs[i].id = i + 1; } // 按作业的到达时间排序 for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (jobs[i].arrival_time > jobs[j].arrival_time) { tmp = jobs[i]; jobs[i] = jobs[j]; jobs[j] = tmp; } } } // 计算每个作业的完成时间、等待时间和周转时间 int current_time = 0; for (i = 0; i < n; i++) { // 执行下一个作业之前等待的时间 int wait_time = current_time - jobs[i].arrival_time; if (wait_time < 0) { wait_time = 0; } // 记录作业的等待时间和完成时间 jobs[i].waiting_time = wait_time; jobs[i].completion_time = current_time + jobs[i].burst_time; jobs[i].turnaround_time = jobs[i].burst_time + jobs[i].waiting_time; // 更新当前时间 current_time = jobs[i].completion_time; } // 计算平均等待时间和平均周转时间 float avg_waiting_time = 0, avg_turnaround_time = 0; for (i = 0; i < n; i++) { avg_waiting_time += jobs[i].waiting_time; avg_turnaround_time += jobs[i].turnaround_time; } avg_waiting_time /= n; avg_turnaround_time /= n; // 输出每个作业的信息和平均等待时间和平均周转时间 printf("ID\tArrival Time\tBurst Time\tCompletion Time\tWaiting Time\tTurnaround Time\n"); for (i = 0; i < n; i++) { printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", jobs[i].id, jobs[i].arrival_time, jobs[i].burst_time, jobs[i].completion_time, jobs[i].waiting_time, jobs[i].turnaround_time); } printf("Average waiting time: %.2f\n", avg_waiting_time); printf("Average turnaround time: %.2f\n", avg_turnaround_time); return 0; } ``` 在这个示例代码中,我们首先输入作业数量和每个作业的到达时间和执行时间,然后按照到达时间对作业进行排序。接着,我们依次执行每个作业,计算每个作业的完成时间、等待时间和周转时间,并累计平均等待时间和平均周转时间。最后,我们输出每个作业的信息和平均等待时间和平均周转时间

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值