多调度算法实现:操作系统处理机调度详解
本资源是一份关于操作系统处理机调度的实验源代码,主要涉及了五种不同的处理机调度算法:先来先服务(FCFS)、最短作业优先(SJF)、最高响应比优先(HRN,也称为最短剩余时间优先或Eddies算法)、时间片轮转(RR)以及优先级法。源代码中定义了一个名为`Process`的结构体,包含了进程的基本信息,如进程名、到达时间、运行时间、优先级、执行状态、开始时间、完成时间、周转时间和平均周转时间等。 1. **先来先服务(FCFS,First-Come-First-Served)**: 在FCFS调度中,进程按照其到达时间的顺序被分配处理器,即谁先到达就先执行。函数`FCFS`实现这一调度策略,它会根据进程的到达时间对进程数组进行排序,并按照这个顺序依次执行。 2. **最短作业优先(SJF,Shortest Job First)**: SJF算法根据进程的运行时间最小化策略,选择运行时间最短的进程优先执行。在`SJF`函数中,进程按照运行时间排序,以便尽早结束占用处理器的时间。 3. **最高响应比优先(HRN,Highest Response Ratio Next)**: HRN是一种综合考虑了到达时间和剩余运行时间的调度算法,通过计算响应比(运行时间除以截止时间)来决定进程的执行顺序。函数`HRN`中会对进程进行响应比排序,优先执行响应比最高的进程。 4. **时间片轮转(Round Robin,RR)**: RR调度将处理器分配给每个进程固定长度的时间片,当一个进程用完时间片后,即使没有完成,也会被切换到下一个进程。`RR`函数可能涉及到循环和定时器,确保按预定的时间片轮转执行。 5. **优先级法**: 这个调度策略基于进程的优先级,通常用于那些有特殊需求或者紧急任务。函数`Priority`可能根据进程的优先级值进行排序,优先执行优先级较高的进程。 源代码中的`SortByArrive`、`SortByArriveAndLength`和`SortByArriveAndPriority`函数分别用于根据到达时间、运行时间和优先级对进程进行排序,而`avgTurnover`和`avgWTurnover`函数则用于计算周转时间和平均周转时间,这些指标都是衡量调度性能的重要参数。 `main`函数是程序的入口点,首先提示用户输入进程的数量,然后动态创建进程数组,获取进程信息并调用相应的调度算法进行操作。整个代码提供了丰富的实验材料,对于理解不同调度算法的工作原理和实现过程非常有帮助。
#include <vector>
#include <queue>
#include <string>
using namespace std;
struct Process {
string name;//进程名称
double arrrive;//进程到达时间
double run;//进程预估执行时间
int priority;//进程的优先级
bool perform;//标识进程是否已经被执行,已经被执行标志为true,否则为false
double start;//进程开始执行的时间
double complete;//进程完成的时间
double turnover;//进程的周转时间
double Wturnover;//进程的带权周转时间
double hasRun;//已经执行的时间,在时间片轮转法中会用到
};
double time;//记录当前的时间
void Print(Process *p, int n);//打印结果
void SortByArrive(Process *&process, int n);//冒泡排序函数,按照提交时间先后进行排序
void SortByArriveAndLength(Process *&process, int n);//按照作业提交时间以及长短进行综合排序
void SortByArriveAndPriority(Process *&process, int n);//按照作业提交时间以及优先级综合排序
double avgTurnover(Process *process, int n);//求平均周转时间
double avgWTurnover(Process *process, int n);//求平均带权周转时间
void FCFS(Process *process,Process *p,int n);//先来先服务法
void SJF(Process *process,Process *p,int n);//最短作业优先法
void HRN(Process *process,Process *p, int n);//最高响应比优先法
void RR(Process *process,Process *p, int n);//时间片轮转法
void Priority(Process *process,Process *p, int n);//优先级法
{
int n;
cout << "请输入将要进行调度的进程的个数:" << endl;
cin >> n;
Process *process = new Process[n];//存放输入进程的信息
Process *p = new Process[n];//按输出顺序存放进程信息
cout << "请依次输入每一个进程的信息,每个进程的信息包括进程名、到达时间、预估运行时间以及优先数(规定优先数越小优先级越高):" << endl;
for (int i = 0; i < n; i++)
{
cin >> process[i].name;
cin >> process[i].arrrive >> process[i].run;
cin >> process[i].priority;
process[i].perform = false;
process[i].hasRun = 0;
}
int select;
do {
cout << "-----------------------------------------" << endl;
cout << "请选择要进行进程调度的方式:" << endl;
cout << "1.先来先服务(FCFS)\n2.短进程优先\n3.最高响应比优先\n4.时间片轮转\n5.优先级法\n0.退出\n";
cout << "------------------------------------------" << endl;
cin >> select;
switch (select) {
case 1:
FCFS(process,p, n);
break;
case 2:
SJF(process,p, n);
break;
剩余23页未读,继续阅读
- 粉丝: 22
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WebLogic集群配置与管理实战指南
- AIX5.3上安装Weblogic 9.2详细步骤
- 面向对象编程模拟试题详解与解析
- Flex+FMS2.0中文教程:开发流媒体应用的实践指南
- PID调节深入解析:从入门到精通
- 数字水印技术:保护版权的新防线
- 8位数码管显示24小时制数字电子钟程序设计
- Mhdd免费版详细使用教程:硬盘检测与坏道屏蔽
- 操作系统期末复习指南:进程、线程与系统调用详解
- Cognos8性能优化指南:软件参数与报表设计调优
- Cognos8开发入门:从Transformer到ReportStudio
- Cisco 6509交换机配置全面指南
- C#入门:XML基础教程与实例解析
- Matlab振动分析详解:从单自由度到6自由度模型
- Eclipse JDT中的ASTParser详解与核心类介绍
- Java程序员必备资源网站大全