优先级调度的 C++ 程序

c++server side programmingprogramming更新于 2024/10/5 4:07:00

我们给定 n 个进程,即 P1、P2、P3、.......、Pn,以及它们对应的突发时间和与每个进程相关的优先级。任务是使用优先级 CPU 调度算法查找平均等待时间、平均周转时间和进程执行顺序。

什么是等待时间和周转时间?

周转时间是进程提交和完成之间的时间间隔。

周转时间 = 进程完成 – 进程提交

等待时间是周转时间和突发时间之间的差值

等待时间 = 周转时间 –突发时间

什么是优先级调度?

在优先级调度中,每个进程都与一个优先级相关联,优先级范围从 0 到 10,其中整数 0 表示最低优先级,10 表示最高优先级。优先级可以用两种方式定义,即内部和外部。此外,优先级调度可以是抢占式的,也可以是非抢占式的。

抢占式优先级调度中,如果新到达的进程的优先级高于正在执行的进程的优先级,调度程序将抢占 CPU。

在非抢占式优先级调度中,调度程序会将新进程排在就绪队列的头部。

使用优先级调度算法的缺点是无限期的阻塞或饥饿。将会有一个低优先级进程,由于高优先级进程,该进程可能需要无限期地等待资源,这将导致饥饿问题。

示例

假设有 4 个进程 P1、P2、P3 和 P4,每个进程都有相应的突发时间和优先级,其中 0 代表最低优先级,10 代表最高优先级。

进程突发时间优先级
P1152
P2130
P3104
P4111

将使用下面给出的甘特图表示执行多个进程的顺序

算法

开始
步骤 1-> 创建一个结构体 Process,其中包含变量 pid、bt、priority
步骤 2-> 在函数 bool compare(Process a, Process b) 中
   返回 (a.priority > b.priority)
步骤 3-> 在函数 waitingtime(Process pro[], int n, int wt[]) 中
   设置 wt[0] = 0
   循环 For i = 1 and i < n and i++
      设置 wt[i] = pro[i-1].bt + wt[i-1]
   结束
步骤 4->在函数 turnarround( Process pro[], int n, int wt[], int tat[]) 中
   循环 For i = 0 and i < n and i++
      设置 tat[i] = pro[i].bt + wt[i]
   结束循环
步骤 5-> 在函数 avgtime(Process pro[], int n) 中
   声明并初始化 wt[n]、tat[n]、total_wt = 0、total_tat = 0
   调用函数 waitingtime(pro, n, wt)
   调用函数 turnarround(pro, n, wt, tat)
   打印"进程、突发时间、等待时间、周转时间"
   循环 i=0 和 i<n 和 i++
      设置 total_wt = total_wt + wt[i]
      total_tat = total_tat + tat[i]
   结束循环
   打印"进程、突发时间、等待时间、周转时间"的值
   打印平均等待时间、平均周转时间
步骤 6-> 在函数 scheduling(Process pro[], int n) 中
   调用函数 sort(pro, pro + n, compare)
   循环 For i = 0 and i < n and i++
      打印顺序。
   结束循环
   调用函数 avgtime(pro, n)
步骤 7-> 在函数 int main() 中
   声明并初始化 Process pro[] = {{1, 10, 2}, {2, 5, 0}, {3, 8, 1}}
   声明并初始化 n = sizeof pro / sizeof pro[0]
   调用函数 scheduling(pro, n)
停止

示例

#include<bits/stdc++.h>
using namespace std;
struct Process {
   int pid; // 进程 ID
   int bt; // 所需 CPU 突发时间
   int priority; // 此进程的优先级
};
// 根据优先级对进程进行排序
bool compare(Process a, Process b) {
   return (a.priority > b.priority);
}
void waitingtime(Process pro[], int n, int wt[]) {
   // 进程的初始等待时间为 0
   wt[0] = 0;
   // 计算等待时间
   for (int i = 1; i < n ; i++ )
      wt[i] = pro[i-1].bt + wt[i-1] ;
}
 // 计算周转时间的函数
void turnarround( Process pro[], int n, int wt[], int tat[]) {
   // 通过添加计算周转时间
   // bt[i] + wt[i]
   for (int i = 0; i < n ; i++)
      tat[i] = pro[i].bt + wt[i];
}
//计算平均时间的函数
void avgtime(Process pro[], int n) {
   int wt[n], tat[n], total_wt = 0, total_tat = 0;
   //查找所有进程等待时间的函数
   waitingtime(pro, n, wt);
   //查找所有进程周转时间的函数
   turnarround(pro, n, wt, tat);
   //显示进程及其所有详细信息
   cout << "\n进程 "<< " 爆发时间 " << "等待时间 << &" 周转时间\n&";;
   // 计算总等待时间和总周转时间
   // 周转时间
   for (int i=0; i<n; i++) {
      total_wt = total_wt + wt[i];
      total_tat = total_tat + tat[i];
      cout << &" &" << pro[i].pid << &"\t\t&" << pro[i].bt << &"\t &" << wt[i] << "\t\t " << tat[i] <<endl;
   }
   cout << "\n平均等待时间 = " << (float)total_wt / (float)n;
   cout << "\n平均周转时间 = " << (float)total_tat / (float)n;
}
void scheduling(Process pro[], int n) {
   // 按优先级对进程进行排序
   sort(pro, pro + n, compare);
   cout<< "进程执行的顺序 \n";
   for (int i = 0 ; i < n; i++)
      cout << pro[i].pid <<" " ;
   avgtime(pro, n);
}
// main 主函数
int main() {
   Process pro[] = {{1, 10, 2}, {2, 5, 0}, {3, 8, 1}};
   int n = sizeof pro / sizeof pro[0];
   scheduling(pro, n);
   return 0;
}

输出

进程执行的顺序
1 3 2
进程  爆发时间  等待时间  周转时间
 1              10         0            10
 3              8          10             18
 2              5          18             23
 
平均等待时间 = 9.33333
平均周转时间 = 17

相关文章