操作系统作业调度

作业调度

1.实验目的

用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。

2.实验内容与要求

为单道批处理系统设计一个作业调度程序。
由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。
  作业调度算法:采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
  作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。

3.流程图与模块调用

在这里插入图片描述

4.实验分析

本次实验实现的是操作系统作业调度实验,完成的有:
1. 单道处理系统的先来先服务(FCFS)
先来先服务算法采取的是先到的先进入CPU运行,直到运行完该作业,才会运行下一个作业。
2. 多道程序系统的先来先服务
多道程序系统的先来先服务采取的是分时间片进行运行本次实验中我采取的是时间片为1。
先来的先进入CPU运行,运行完一个时间片后,如果此时系统内有其他的作业,则运行下一个到的作业,如果系统中仍然只有该一个作业,则继续运行该作业。运行后,插入到另一个队列尾部。
由此,我采用的是两个队列,一个用来记录当前到来的作业,一个是用来记录运行第一次之后,插入队尾的队列。优先从第一个队列中进行调度(即此时当前到来的队列不为空的话,先从此队列调度)。之后再第二个队列中采取轮转调度。
3. 多道程序系统的优先级调度
多道程序系统的优先级调度,也是采取的时间片运行。与先来先服务不同的地方在于,采取的优先级进行调度,如果两个同时到的作业,选取优先级高的进行调度。之后再第二个队列中采取轮转调度。

相关公式:
作业周转时间=完成时间-提交时间
作业平均周转时间=周转时间/作业个数
作业带权周转时间=周转时间/运行时间

5.运行情况

单道程序系统的先来先服务
在这里插入图片描述
多道程序系统的先来先服务(打印的状态比较详细)
在这里插入图片描述
多道程序系统的优先权算法

在这里插入图片描述

6.实验体会

本次实验完成了操作系统的作业调度,尤其是多道程序系统中算法的实现,更加接近我们目前所使用的操作系统算法调度。通过计算出不同算法的周转时间和带权周转时间,也可以更加直观的看出不同算法之间效率的不同。

代码(C++)

#include 
#include
#include
#include
#include
#include
using namespace std;
typedef struct {int web;//位置char jcip;//作业名int p_time;//提交时间int n_time;//所需的运行时间int b_time;//开始时间string state;//当前状态int f_time;//完成时间int c_time;//周转时间double cs_time;//带权周转时间int prio;//优先级
}JCB;
struct cp1//FCFS
{bool operator() (const JCB &a, const JCB &b)//按提交时间从小到大排序{return a.p_time > b.p_time;}
};
struct cp2//prio
{bool operator()(const JCB& a, const JCB& b){return a.prio < b.prio;}
};void printstate(vector<JCB> p)//打印状态
{cout << "******进程*****" << endl;for (int i = 0; i < p.size(); i++){cout << "进程" << p[i].jcip << "  提交时间:" << p[i].p_time << "  运行时间:" << p[i].n_time << "  开始时间:" << p[i].b_time << "  结束时间:" << p[i].f_time << "  周转时间:" << p[i].c_time << "  带权周转时间:" << p[i].cs_time << "  状态:" << p[i].state << endl;}
}
void printstate2(vector<JCB> p)//打印状态
{cout << "******进程*****" << endl;for (int i = 0; i < p.size(); i++){cout << "进程" << p[i].jcip <<"  优先级"<<p[i].prio << "  提交时间:" << p[i].p_time << "  运行时间:" << p[i].n_time << "  开始时间:" << p[i].b_time << "  结束时间:" << p[i].f_time << "  周转时间:" << p[i].c_time << "  带权周转时间:" << p[i].cs_time << "  状态:" << p[i].state << endl;}
}
void printfin(vector<JCB> p)
{double pc_time=0;//平均周转double pcs_time=0;//平均带权周转for (int i = 0; i < p.size(); i++){pc_time += p[i].c_time;pcs_time += p[i].cs_time;}pc_time = pc_time / p.size();pcs_time = pcs_time / p.size();cout << "本次算法所用平均周转时间为" << pc_time << "平均带权周转时间为" << pcs_time << endl;
}
void one_fcfs(vector<JCB> p)//单道先来先服务
{priority_queue<JCB,vector<JCB>,cp1>q;//排序for (int i = 0; i < p.size(); i++){q.push(p[i]);// cout << p[i].p_time << endl;}cout << "即将开始先来先服务算法fcfs算法......" << endl;int nowtime=0;//现在的时间nowtime = q.top().p_time;while (!q.empty()){JCB top = q.top();//弹出先来的q.pop();//nowtime = top.p_time;if (nowtime > p[top.web].p_time)p[top.web].b_time = nowtime;//开始进程elsep[top.web].b_time = p[top.web].p_time;p[top.web].f_time = p[top.web].b_time + p[top.web].n_time;//结束时间p[top.web].c_time = p[top.web].f_time - p[top.web].p_time;//周转时间p[top.web].cs_time =(double) p[top.web].c_time / p[top.web].n_time;//带权周转时间p[top.web].state = "Run";//状态nowtime = p[top.web].f_time;//增加时间p[top.web].state = "Finish";printstate(p);}printfin(p);
}
void more_fcfs(vector<JCB> p)//多道先来先服务
{priority_queue<JCB,vector<JCB>,cp1> q;queue<JCB> qb;//接受弹出后的轮度for (int i = 0; i < p.size(); i++)//进优先队列{q.push(p[i]);}cout << "即将开始多道先来先服务算法......" << endl;int nowtime = q.top().p_time;//上一轮循环时间int nw=0;int st;//开始时间int cir=0;//轮数//nowtime = q.top().p_time;st = q.top().p_time;int last = p.size();//剩余未完成while (last!=0) {JCB top;//如果到来的队列不为空,并且(如果队首的提交时间小于当前时间或者第二个队列为空)则采用第一个队列if (!q.empty()&&(q.top().p_time<=nowtime || qb.empty())  ){top = q.top();q.pop();}else{top = qb.front();qb.pop();}p[top.web].state = "Run";//状态p[top.web].n_time--;//所需时间减一if(p[top.web].b_time==0)p[top.web].b_time = nowtime;//开始时间cir++;if (p[top.web].n_time != 0){qb.push(p[top.web]);}else if (p[top.web].n_time == 0){// nw = cir;p[top.web].f_time = p[top.web].b_time + cir;//完成时间p[top.web].c_time = p[top.web].f_time - p[top.web].p_time;//轮转时间p[top.web].cs_time = (double)p[top.web].c_time / cir;//运行时间p[top.web].state = "Finish";//状态last--;//cir = 0;cout << p[top.web].jcip << "已完成......" << endl;}nowtime++;printstate(p);}printfin(p);
}
void more_prio(vector<JCB> p)//多道优先级
{priority_queue<JCB, vector<JCB>, cp2> q;queue<JCB> qb;//接受弹出后的轮度for (int i = 0; i < p.size(); i++)//进优先队列{q.push(p[i]);}cout << "即将开始多道优先服务算法......" << endl;int nowtime = q.top().p_time;//上一轮循环时间int nw = 0;int st;//开始时间int cir = 0;//轮数//nowtime = q.top().p_time;st = q.top().p_time;int last = p.size();//剩余未完成while (last != 0) {JCB top;//如果到来的队列不为空,并且(如果队首的提交时间小于当前时间 或者 第二个队列为空)则采用第一个队列if (!q.empty() && (q.top().p_time <= nowtime || qb.empty())){top = q.top();q.pop();}else{top = qb.front();qb.pop();}p[top.web].state = "Run";//状态p[top.web].n_time--;//所需时间减一if (p[top.web].b_time == 0)p[top.web].b_time = nowtime;//开始时间cir++;if (p[top.web].n_time != 0){qb.push(p[top.web]);}else if (p[top.web].n_time == 0){// nw = cir;p[top.web].f_time = p[top.web].b_time + cir;//完成时间p[top.web].c_time = p[top.web].f_time - p[top.web].p_time;//轮转时间p[top.web].cs_time = (double)p[top.web].c_time / cir;//运行时间p[top.web].state = "Finish";//状态last--;//cir = 0;cout << p[top.web].jcip << "已完成......" << endl;}nowtime++;printstate2(p);}printfin(p);
}
int main()
{//动态进程服务vector<JCB> process;int n;//进程数cout << "请输入生成的进程数" << endl;cin >> n;unsigned seed = time(0);srand(seed);for (int i = 0; i < n; i++){JCB q;//新进程q.web = i;q.jcip = 'a' + i;q.p_time = rand() % (10 - 1 + 1) + 1;q.n_time = rand() % (10 - 1 + 1) + 1;q.prio = rand() % (10 - 1 + 1) + 1;q.state = "Wait";q.f_time = 0;q.c_time = 0;q.b_time = 0;q.cs_time = 0;process.push_back(q);}printstate(process);int cheek;//选择cout <<"请选择: " << "1:单道处理系统(FCFS) 2:多道程序系统(基于先来先服务调度) 3:多道程序系统(基于优先级的作业调度)" << endl;cin >> cheek;if (cheek == 1){one_fcfs(process);}else if (cheek == 2){more_fcfs(process);}else if (cheek == 3){more_prio(process);}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部