欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

先来先服务调度算法(C++实现)

发布时间:2025/3/20 46 豆豆
生活随笔 收集整理的这篇文章主要介绍了 先来先服务调度算法(C++实现) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

算法思想:

先来先服务调度算法:

(1)假设系统中有5个进程,每个进程有一个进程控制块(PCB)来标识。进程控制块内容包括:进程名,链接指针,到达时间,估计运行时间,进程状态。

进程名即进程标识。

链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。指针指出下一个到达进程的进程控制块地址。最后一个进程的链接指针为NULL。

估计运行时间:可由设计者任意指定一个时间值。

到达时间:进程创建时的系统时间或由用户指定。调度时。总是选择到达时间最早的进程。

进程状态:为简单起见,这里假定进程有两种状态:就绪和完成。并假定进程一创建就处于就绪状态,用R表示。当一个进程运行结束时,就将其置成完成态,用C表示。

(2)设置一个队首指针head,用来指出最先进入系统地进程。各就绪进程通过链接指针连在一起。

(3)处理机调度时总是选择对首指针指向的进程投入运行。由于本实验是模拟试验,所以对被选中进程并不实际启动运行,而只是执行:估计运行时间减1。用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。

(4)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名、已运行时间、还剩时间、就绪队列中的进程等。所有进程运行完成时,给出各进程的周转时间和平均周转时间。

代码:

#include<iostream> #include<string> #include<queue> using namespace std; typedef struct pcb {string pName; //进程名float arriveTime;//到达时间float serviceTime;//服务时间float estimatedRunningtime;//估计运行时间float startTime;//开始运行时间float finishTime;//完成运行时间float turnaroundTime;//周转时间float weightedTuraroundTime;//带权周转时间char state;//状态bool operator<(const pcb &a)const {return arriveTime > a.arriveTime;} }PCB;void createProcess(priority_queue<PCB> &p, int n) {//创建n个进程cout << endl << endl << "创建进程" << endl;PCB r;//工作结点for (int i = 0; i<n; i++) {cout << "请输入第" << i + 1 << "个进程的名字、到达时间、服务时间(例如:A 12 8):";cin >> r.pName;cin >> r.arriveTime;cin >> r.serviceTime;r.startTime = 0;r.finishTime = 0;r.estimatedRunningtime = r.serviceTime;r.turnaroundTime = 0;r.weightedTuraroundTime = 0;p.push(r);} }void printProcess(priority_queue<PCB> p) {//输出所有进程的信息PCB q;cout << "进程名\t到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间" << endl;while (p.size() != 0) {q = p.top();cout << q.pName << "\t" << q.arriveTime << "\t " << q.serviceTime << "\t ";cout << q.startTime << "\t " << q.finishTime << "\t " << q.turnaroundTime << "\t " << q.weightedTuraroundTime << endl;p.pop();}cout << endl << endl; }void runProcess(priority_queue<PCB> &p, priority_queue<PCB> &q, int n) {//运行进程PCB s;float finishTimeOfPriorProcess;for (int i = 0; i<n; i++) {s = p.top();if (i == 0) {//当前进程是第一个进程while (s.estimatedRunningtime != 0) {//输出当前运行进程的信息cout << "正在运行的进程" << endl;cout << "进程名\t到达时间 服务时间 已运行时间 还剩运行时间" << endl;cout << s.pName << "\t" << s.arriveTime << "\t " << s.serviceTime << "\t ";cout << s.serviceTime - s.estimatedRunningtime << "\t " << s.estimatedRunningtime << endl;s.estimatedRunningtime--; //当前进程的估计运行时间减1}s.startTime = s.arriveTime;s.finishTime = s.startTime + s.serviceTime;s.turnaroundTime = s.finishTime - s.arriveTime;s.weightedTuraroundTime = float(s.turnaroundTime*1.0 / s.serviceTime);s.state = 'C';finishTimeOfPriorProcess = s.finishTime;}else {//当前进程不是第一个进程while (s.estimatedRunningtime != 0) {cout << "正在运行的进程" << endl;cout << "进程名\t到达时间 服务时间 已运行时间 还剩运行时间" << endl;cout << s.pName << "\t" << s.arriveTime << "\t " << s.serviceTime << "\t ";cout << s.serviceTime - s.estimatedRunningtime << "\t " << s.estimatedRunningtime << endl;s.estimatedRunningtime--;//当前进程的估计运行时间减1}s.startTime = finishTimeOfPriorProcess>s.arriveTime ? finishTimeOfPriorProcess : s.arriveTime;s.finishTime = s.startTime + s.serviceTime;s.turnaroundTime = s.finishTime - s.arriveTime;s.weightedTuraroundTime = float(s.turnaroundTime*1.0 / s.serviceTime);s.state = 'C';finishTimeOfPriorProcess = s.finishTime;}q.push(s);p.pop();cout << "进程" << s.pName << "执行结束之后就绪队列中的进程" << endl;printProcess(p);}cout<< endl << endl; }int main() {priority_queue<PCB> p,q;int n;cout << "请输入进程的个数:";cin >> n;createProcess(p, n);runProcess(p, q, n);cout << "所有进程执行结束之后的相关情况" << endl << endl;printProcess(q);getchar();getchar();return 0; }

实验结果:

总结

以上是生活随笔为你收集整理的先来先服务调度算法(C++实现)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。