EDF算法任务执行序列如下,请分析你的实验结果是否与次一致,为什么?如何修改?(给出修改部分的代码) 时间: 0 10 20 30 40 45 50 55 60 70 80 90 100 任务序列:A1 B1 A2 B1 A3 B2 A4 B2 A5
时间: 2024-02-14 15:07:54 浏览: 142
EDF算法按照任务最后期限进行调度,即将最紧急的任务先调度。根据任务执行序列,我们可以列出每个任务的执行时间和最后期限:
| 任务 | 执行时间 | 最后期限 |
| --- | --- | --- |
| A1 | 10 | 20 |
| B1 | 20 | 30 |
| A2 | 10 | 25 |
| B1 | 10 | 30 |
| A3 | 5 | 40 |
| B2 | 10 | 45 |
| A4 | 5 | 50 |
| B2 | 10 | 55 |
| A5 | 20 | 80 |
根据最后期限,任务的调度顺序应为:A1 -> A2 -> A3 -> B1 -> A4 -> B2 -> A5。但是根据任务执行序列,我们得到的调度顺序为:A1 -> B1 -> A2 -> B1 -> A3 -> B2 -> A4 -> B2 -> A5。可以看出,这两个顺序是不一致的。
造成调度顺序不一致的原因是任务B1的最后期限较紧,但是在执行A2和A3时,B1被重新插入了就绪队列,导致B1先被执行,最终导致调度顺序不一致。
为了解决这个问题,可以对就绪队列进行修改,每次插入任务时根据任务最后期限进行排序。修改后的代码如下:
```
// 定义任务结构体
struct task {
char name; // 任务名称
int arrival_time; // 到达时间
int execution_time; // 执行时间
int deadline; // 最后期限
};
// 就绪队列
std::vector<task> ready_queue;
// 插入任务到就绪队列
void insert_task(task t) {
// 将任务插入到就绪队列
ready_queue.push_back(t);
// 根据任务最后期限进行排序
std::sort(ready_queue.begin(), ready_queue.end(), [](task a, task b) {
return a.deadline < b.deadline;
});
}
// 获取下一个要执行的任务
task get_next_task(int current_time) {
// 从就绪队列中找到最紧急的任务
task next_task = ready_queue.front();
// 将最紧急的任务从就绪队列中删除
ready_queue.erase(ready_queue.begin());
return next_task;
}
```
通过对就绪队列进行修改,我们可以确保任务按照最后期限进行调度,避免了调度顺序不一致的问题。
阅读全文