c++模拟操作系统进程调度算法(优先数,时间片轮转)
来源:互联网 发布:淘宝高仿nike鞋店推荐 编辑:程序博客网 时间:2024/04/30 10:24
实验一 进程调度
1.目的和要求
进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,体会了解优先数和时间片轮转调度算法的具体实施办法。
2.实验内容
①设计进程控制块PCB表结构,分别适用于优先数调度算法和时间片轮转调度算法。
②建立进程就绪队列。对两种不同算法编写入队子程序。
③设计编写两种进程调度算法:1)优先数调度;2)时间片轮转调度。
3.实验环境
①PC兼容机
②Windows系统
③自选
4.实验提示
①本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。
②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
③在优先数算法中,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的队尾上。
④对于遇到优先数一致的情况,采用FIFO策略解决。
#include <iostream>#include <vector>#include <algorithm>#include <iomanip>using namespace std;bool _state = 0;class PCB//类定义PCB表,适用于优先数{public: int ID; int priority; int CPUtime; int ALLtime; int State;//1运行 2就绪 3等待 int flag; void set_PCB(int a,int b,int c,int d, int e,int f) { ID=a; priority = b; CPUtime=c; ALLtime=d; State=e; flag=f; }};class PCB2{public: int ID; int CPUtime; int ALLtime; int State; int flag; void set_PCB2(int a,int b,int c,int d, int e) { ID=a; CPUtime=b; ALLtime=c; State=d; flag=e; }};bool priority_sort_higher(const PCB &m, const PCB &n)//sort函数,定义按优先数排序,当优先数相同时按序号排序(即先进先出){ if(m.priority == n.priority) return m.ID < n.ID; return m.priority > n.priority;}void priority_way(vector <PCB> &pcb, vector<PCB> &wait)//优先数算法{ vector<PCB>::iterator it1; it1 = pcb.begin(); int flag = 5; while(flag) { wait.erase(wait.begin()); (*it1).State = 1; (*it1).priority -= 3; (*it1).CPUtime += 1; (*it1).ALLtime -= 1; if((*it1).ALLtime == 0) { flag -= 1; (*it1).flag =1; cout<<left<<setw(10)<<(*it1).ID<<setw(10)<<(*it1).State<<setw(10)<<(*it1).priority<<setw(10)<<(*it1).CPUtime<<setw(10)<<(*it1).ALLtime<<setw(10)<<(*it1).flag<<endl; pcb.erase(pcb.begin()); sort(wait.begin(), wait.end(), priority_sort_higher); sort(pcb.begin(), pcb.end(), priority_sort_higher); } else { cout<<left<<setw(10)<<(*it1).ID<<setw(10)<<(*it1).State<<setw(10)<<(*it1).priority<<setw(10)<<(*it1).CPUtime<<setw(10)<<(*it1).ALLtime<<setw(10)<<(*it1).flag<<endl; (*it1).State = 2; wait.push_back(*it1); sort(wait.begin(),wait.end(),priority_sort_higher); sort(pcb.begin(),pcb.end(),priority_sort_higher); } }}void round_robin_way(vector <PCB2> &pcb2,vector<PCB2> &wait2)//时间片算发{ vector<PCB2>::iterator it2; it2 = wait2.begin(); int flag=5; while(flag) { it2 = pcb2.begin(); wait2.erase(wait2.begin());//出队(等待队列) (*it2).State = 1; if((*it2).ALLtime==1) { (*it2).CPUtime +=1; (*it2).ALLtime -=1; flag -= 1; (*it2).flag = 1; cout << left << setw(10) << (*it2).ID << setw(10) << (*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl; pcb2.erase(pcb2.begin()); continue; } else if((*it2).ALLtime==2) { (*it2).CPUtime +=2; (*it2).ALLtime -=2; flag-=1; (*it2).flag =1; cout<<left<<setw(10)<<(*it2).ID<<setw(10)<<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl; pcb2.erase(pcb2.begin()); continue; } else { (*it2).State = 1; (*it2).CPUtime +=2; (*it2).ALLtime -=2; cout<<left<<setw(10)<<(*it2).ID<<setw(10)<<(*it2).State<<setw(10)<<(*it2).CPUtime<<setw(10)<<(*it2).ALLtime<<setw(10)<<(*it2).flag<<endl; (*it2).State = 2; wait2.push_back(*it2); PCB2 q = *it2; pcb2.erase(pcb2.begin()); pcb2.push_back(q); } }}int main( ){cout<<"-------------------------------模拟进程调度----------------------------------"<<endl; int flag_0,a[5],b; cout<<"请输入想要模拟进程调度算法的编号"<<endl; cout<<"1.优先数调度;2.时间片轮转调度。" <<endl; cin>>flag_0; if(flag_0 == 1) { it = pcb.begin(); cout<<"创建5个进程,请为5个进程设置优先数(优先数越大优先级越高)"<<endl; cout<<"例如:14 20 6 12 11 ,即将5个进程的优先数分别设置为14 20 6 12 11"<<endl; for(int i = 1; i <= 5; i++) { cin>>a[i-1]; } cout<<"请为5个进程设置其需运行的时间片数"<<endl; for(int i = 1; i <= 5; i++) { cin>>b; PCB q; q.set_PCB(i,a[i-1],0,b,2,0); pcb.push_back(q); } sort(pcb.begin(),pcb.end(),priority_sort_higher);//按优先数排序,利用sort函数 vector<PCB> wait(5); copy(pcb.begin(),pcb.end(),back_inserter(wait)); cout<<"该进程运行情况如下(flag=0代表未完成,flag=1代表已完成)"<<endl; cout << left<<setw(10)<< "ID"<<setw(10)<<"State"<<setw(10)<<"priority"<<setw(10)<<"CPUtime"<<setw(10)<<"ALLtime "<<setw(10)<<"flag1" << endl; priority_way(pcb,wait); } else if(flag_0 ==2) { vector <PCB2> pcb2; vector<PCB2>::iterator it2; it2 = pcb2.begin(); cout<<"创建5个进程,请为5个进程设置轮转时间数"<<endl; for(int i = 1; i <= 5; i++) { cin>>b; PCB2 q2; q2.set_PCB2(i,0,b,2,0); pcb2.push_back(q2); } vector<PCB2> wait2(5); copy(pcb2.begin(),pcb2.end(),back_inserter(wait2)); cout<<"该进程运行情况如下(flag=0代表未完成,flag=1代表已完成)"<<endl; cout << left<<setw(10)<< "ID"<<setw(10)<<"State"<<setw(10)<<"CPUtime"<<setw(10)<<"ALLtime "<<setw(10)<<"flag1" << endl; round_robin_way(pcb2, wait2); } cout<<"----------------------------------END--------------------------------------"<<endl; return 0;}
0 0
- c++模拟操作系统进程调度算法(优先数,时间片轮转)
- 进程调度算法模拟,用动态优先数及时间片轮转法实现进程调度_Java语言模拟实现
- 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)
- 操作系统进程调度模拟程序 基于优先级调度和时间片轮转调度算法
- 操作系统——模拟时间片轮转调度算法
- 操作系统实验一——模拟进程调度时间片轮转算法
- 【操作系统 - 2】时间片轮转RR进程调度算法
- 进程调度:时间片轮转调度算法
- 模拟时间片轮转算法(C++)
- 【计算机操作系统】操作系统--时间片轮转(RR)进程调度算法
- 时间片轮转调度算法的C语言模拟实现
- C++实现操作系统进程调度(时间片轮转法)
- 操作系统 时间片轮转调度算法
- 进程调度算法--时间片轮转算法
- 【操作系统】学习笔记(三)基于时间片轮转的进程调度算法
- 时间片轮转进程调度算法
- 进程调度-时间片轮转算法
- Java模拟最短作业优先、时间片轮转、最高响应比三种进程调度算法
- 工作日志 4.27
- 联想G480—win8.1安装Centos7双系统
- hdu 2852 KiKi's K-Number
- HDU ACM 1041Computer Transformation(大数模拟+找规律)
- 2015编程之美挑战赛:扑克牌 全排列
- c++模拟操作系统进程调度算法(优先数,时间片轮转)
- iOS 数据持久化之NSUserDefaults-保存Settings
- 分析、化验、检验、检测、测量、测试、计量、实验、试验的区别
- 几个FireFox的插件
- 心态篇一
- ATM自动取款机系统的功能需求分析
- 陈华:我是如何走上互联网这条路的
- 安装第三方库rsa遇到的问题
- 陈华:新手程序员快速成长之道