|
@@ -0,0 +1,80 @@
|
|
|
+# 多级反馈队列调度算法
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 调度策略与算法原理
|
|
|
+
|
|
|
+ MLFQ(多级反馈队列调度)是一种进程调度策略,它将进程划分为多个优先级队列,并根据优先级队列的特性进行调度。每个队列具有不同的优先级,且优先级随时间变化。MLFQ调度算法的主要思想是给予较高优先级的进程更多的CPU时间,并允许进程在不同的队列之间移动。
|
|
|
+
|
|
|
+基本原则和策略:
|
|
|
+
|
|
|
+1. 多个队列:MLFQ维护多个优先级队列,通常是一个队列数组,每个队列都有不同的优先级。
|
|
|
+2. 优先级调度:较高优先级的队列拥有较短的时间片,即较高的CPU时间分配,以确保高优先级进程能够尽快得到执行。
|
|
|
+3. 时间片轮转:每个队列采用时间片轮转调度策略,当一个进程的时间片用完时,它会被移动到较低优先级的队列中继续执行。
|
|
|
+4. 优先级提升:为了避免饥饿情况,MLFQ允许进程在队列之间移动。例如,如果一个进程在较低优先级队列中等待了一段时间,它可以被提升到较高优先级队列中以获得更多的CPU时间。
|
|
|
+5. 公平性控制:为了避免长时间运行的进程占用所有CPU时间,MLFQ通常采用一些机制来控制进程的优先级提升速度或降低速度,以实现公平性。
|
|
|
+
|
|
|
+ MLFQ的设计可以根据具体需求进行调整和改进,例如,可以调整队列数量、时间片长度、优先级提升规则等来适应不同的系统环境和应用场景。该调度策略在实践中常用于操作系统中,以平衡系统的吞吐量和响应时间,同时为不同类型的进程提供适当的执行机会。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 实验步骤
|
|
|
+
|
|
|
+ 接上文,在这里继续完成调度算法的实现:
|
|
|
+
|
|
|
+ 你只需要实现一个MLFQ算法类,然后实现schedule函数,比如下面的方法:
|
|
|
+
|
|
|
+```cpp
|
|
|
+void schedule(Process processes[], int n, vector<int> time_quantums) {
|
|
|
+ int num_queues = time_quantums.size();
|
|
|
+ vector<queue<Process>> readyQueues(num_queues); // 多个优先级的就绪队列
|
|
|
+
|
|
|
+ // 将所有进程按照优先级加入对应的就绪队列
|
|
|
+ for (int i = 0; i < n; i++) {
|
|
|
+ int priority = processes[i].priority;
|
|
|
+ readyQueues[priority].push(processes[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < num_queues; i++) {
|
|
|
+ int time_quantum = time_quantums[i];
|
|
|
+
|
|
|
+ while (!readyQueues[i].empty()) {
|
|
|
+ Process currentProcess = readyQueues[i].front();
|
|
|
+ readyQueues[i].pop();
|
|
|
+
|
|
|
+ // 执行一个时间片
|
|
|
+ if (currentProcess.remaining_time > time_quantum) {
|
|
|
+ cout << "执行进程 " << currentProcess.pid << ",执行时间片 " << time_quantum << endl;
|
|
|
+ currentProcess.remaining_time -= time_quantum;
|
|
|
+
|
|
|
+ // 降低优先级并将进程重新加入就绪队列
|
|
|
+ currentProcess.priority++;
|
|
|
+ if (currentProcess.priority < num_queues) {
|
|
|
+ readyQueues[currentProcess.priority].push(currentProcess);
|
|
|
+ } else {
|
|
|
+ readyQueues[num_queues - 1].push(currentProcess);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ cout << "执行进程 " << currentProcess.pid << ",执行时间片 " << currentProcess.remaining_time << endl;
|
|
|
+ currentProcess.remaining_time = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 进程执行完毕
|
|
|
+ if (currentProcess.remaining_time == 0) {
|
|
|
+ cout << "进程 " << currentProcess.pid << " 执行完毕" << endl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 实验结果
|
|
|
+
|
|
|
+
|
|
|
+
|