进程调度算法实现 摘要: 实现了进程调度算法,包括FCFS(先进先出),SPF(短进程优先),HRRF(最高响应比优先法),HPF(优先级法)算法,设计了一个允许 n 个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制、同步,其进程调度算法可任意选择。
初始值: 进程名 到达时间 服务时间 优先级 a 0 4 0 b 1 3 1 c 2 5 2 d 3 2 3 e 4 4 4 算法描述 FCFS(先进先出):每次从就绪队列选择最先进入队列的进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择第一个进程接着运行。
SPF(短进程优先):每次从就绪队列选择最短服务时间进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择最短服务时间的进程接着运行。
HRRF(最高响应比优先法):每次进行进程调度时,先计算响应比优先级,然后把响应比优先级最高的进程投入运行。响应比计算公式为响应比=(进程执行时间+进程等待时间)/ 进程执行时间。
HPF(优先级法):每次从就绪队列选择优先级最高的进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择优先级最高的进程接着运行。 FCFS: 算法: //先来先服务 void FCFS_run() { //设置当前系统时间 int cur_svc_time = 0; //初始化参数 init(); while(1) { //判断当前时间下是否有任务进入队列,并加入队列 get_arv_task(); //判断当前是否有任务运行,如果无 if(_cur_task == nullptr || cur_svc_time == 0) { //获取先来的任务 _cur_task = get_first_task(); if(_cur_task != nullptr) { //执行该任务 std::cout << “进程” << _cur_task->get_name() << “开始执行——当前时间为:” << _time << “s\n”; //计算系统时间 cur_svc_time = _cur_task->get_svc_time(); _cur_task->set_start_time(_time); } } //没任务了,输出执行完毕 if(_cur_task == nullptr && _cur_num == _task_num) { std::cout << “执行完毕!\n”; break; } //计算当前任务所剩运行时间 if(cur_svc_time > 0)cur_svc_time–; //系统时间+1 _time++; //当前进程运行完毕 if(cur_svc_time == 0 && _cur_task != nullptr) { std::cout << “进程” << _cur_task->get_name() << “执行完毕——当前时间为:” <<_time << “s\n”; _cur_task->set_fns_time(_time); } } } 甘特图: 执行结果: 平均等待时间:5.4 带权周转时间: 进程名 带权周转时间 a 1.0 b 2.0 c 2.0 d 5.5 e 3.5 SPF: 算法: //短进程优先 void SHR_run() { int cur_svc_time = 0; init(); while(1) { get_arv_task();
if(_cur_task == nullptr || cur_svc_time == 0)
{
//获取最短的任务
_cur_task = get_min_task();
if(_cur_task != nullptr)
{
std::cout << "进程" << _cur_task->get_name() << "开始执行——当前时间为:" << _time << "s\n";
cur_svc_time = _cur_task->get_svc_time();
_cur_task->set_start_time(_time);
}
}
if(_cur_task == nullptr && _cur_num == _task_num)
{
std::cout << "执行完毕!\n";
break;
}
if(cur_svc_time > 0)cur_svc_time--;
_time++;
if(cur_svc_time == 0 && _cur_task != nullptr)
{
std::cout << "进程" << _cur_task->get_name() << "执行完毕——当前时间为:" <<_time << "s\n";
_cur_task->set_fns_time(_time);
}
}
}
甘特图: 执行结果 平均等待时间:4.4 带权周转时间: 进程名 带权周转时间 a 1.0 b 2.67 c 3.2 d 1.5 e 2.25 HRRF: 算法: //高响应比 void HRRF_run() { int cur_svc_time = 0; init(); while(1) { get_arv_task(); update_res_ratio();
if(_cur_task == nullptr || cur_svc_time == 0)
{
//获取最高响应比的任务
_cur_task = get_max_res_ratio();
if(_cur_task != nullptr)
{
std::cout << "进程" << _cur_task->get_name() << "开始执行——当前时间为:" << _time << "s\n";
cur_svc_time = _cur_task->get_svc_time();
_cur_task->set_start_time(_time);
}
}
if(_cur_task == nullptr && _cur_num == _task_num)
{
std::cout << "执行完毕!\n";
break;
}
if(cur_svc_time > 0)cur_svc_time--;
_time++;
if(cur_svc_time == 0 && _cur_task != nullptr)
{
std::cout << "进程" << _cur_task->get_name() << "执行完毕——当前时间为:" <<_time << "s\n";
_cur_task->set_fns_time(_time);
}
}
}
甘特图: 执行结果: 平均等待时间:4.4 带权周转时间: 进程名 带权周转时间 a 1.0 b 2.67 c 3.2 d 1.5 e 2.25 HPF: 算法: //优先级算法 void HPF_run() { int cur_svc_time = 0; init(); while(1) { get_arv_task();
if(_cur_task == nullptr || cur_svc_time == 0)
{
//获取最优先的任务
_cur_task = get_max_pri();
if(_cur_task != nullptr)
{
std::cout << "进程" << _cur_task->get_name() << "开始执行——当前时间为:" << _time << "s\n";
cur_svc_time = _cur_task->get_svc_time();
_cur_task->set_start_time(_time);
}
}
if(_cur_task == nullptr && _cur_num == _task_num)
{
std::cout << "执行完毕!\n";
break;
}
if(cur_svc_time > 0)cur_svc_time--;
_time++;
if(cur_svc_time == 0 && _cur_task != nullptr)
{
std::cout << "进程" << _cur_task->get_name() << "执行完毕——当前时间为:" <<_time << "s\n";
_cur_task->set_fns_time(_time);
}
}
}
甘特图: 执行结果: 平均等待时间:5.4 带权周转时间: 进程名 带权周转时间 a 1.0 b 5.67 c 2.6 d 3.5 e 1.0
|