进程调度模拟

来源:互联网 发布:淘宝网金丝绒 编辑:程序博客网 时间:2024/06/03 21:09

实验平台:windows 7,vs2010

实验目标:模拟短作业优先算法,时间片轮转算法,和优先数算法,并动态画出Grant图,计算每个进程的响应时间和周转时间

数据结构:

class process{vector<string>process_name;vector<int>arrive_time;vector<int>run_time;vector<int>priority;vector<string>result_name;vector<int>result_time;public:process(void);process(string file){ifstream fin(file);while(!fin.eof()){string name;int arrive_time;int run_time;int priority;fin>>name>>arrive_time>>run_time>>priority;this->process_name.push_back(name);this->arrive_time.push_back(arrive_time);this->run_time.push_back(run_time);this->priority.push_back(priority);}fin.close();}void SJF(void);                     void Preemptive_SJF();int get_minremaintime(int time_bar,vector<int>remain_time);int get_minruntime(int time_bar);               void RR(int time_piece);          void PR(void);                      int get_topprocess();               vector<int> get_response_time();    vector<int> get_cycle_time();      void display();                           ~process(void);};


 

1)最短作业优先算法

非抢占式代码:

int process::get_minruntime(int time_bar){int state=1;int min_runtime = 999;bool flag;for (int i = 1; i < process_name.size(); i++){flag = false;flag=time_bar<arrive_time.at(i);              //加入time_bar判断是否在当前时间之前到达for (int j = 1; j < result_name.size(); j++){if (process_name.at(i) == result_name.at(j)){flag = true;break;}}if (!flag){if (run_time.at(i) < min_runtime){state = i;min_runtime = run_time.at(i);}}}return state;}//==========================//最短作业优先调度,默认按照到达时间排序//作者:林欣  20151025//在第一个到达的进程执行后,不断寻找时间最短的进程//==========================void process::SJF(){int state;int time_bar=0;result_name.push_back(process_name.at(0));result_time.push_back(run_time.at(0));for (int i = 1; i < process_name.size(); i++){state = this->get_minruntime(time_bar);result_name.push_back(process_name.at(state));result_time.push_back(run_time.at(state));time_bar+=run_time.at(state);}}


 

抢占式代码:

//========================//抢占式最短优先//作者:林欣 20151026//========================int process::get_minremaintime(int time_bar,vector<int>remain_time){int state=0;int min_remaintime = 999;bool flag;for (int i = 0; i < process_name.size(); i++){flag = false;flag=(time_bar<arrive_time.at(i));              //加入time_bar判断是否在当前时间之前到达if (!flag){if (remain_time.at(i) <= min_remaintime&&remain_time.at(i)>0){state = i;min_remaintime = remain_time.at(i);}}}return state;}void process::Preemptive_SJF(){vector<int>remain_time(run_time);int state=0;int state_t=-1;int time_bar=0;bool flag=true;do{state=get_minremaintime(time_bar,remain_time);if(state_t!=state){result_name.push_back(process_name.at(state));result_time.push_back(1);remain_time.at(state)--;time_bar++;}else{time_bar++;result_time.at(result_time.size()-1)++;remain_time.at(state)--;}state_t=state;flag=false;for(int i=0;i<process_name.size();i++){flag=flag||remain_time.at(i)!=0;if(flag)break;}}while(flag);}


 

2)时间片轮转算法

/========================//时间片轮转调度//作者:林欣 20151025//到达时间在当前时间之前且还没有执行完的,按时间片加入结果//========================void process::RR(int time_piece){int round = 0;int time_bar = 0;bool flag = false;int total_time = 0;for (int i = 0; i < process_name.size(); i++){total_time += run_time.at(i);}//cout << total_time;do{for (int i = 0; i < process_name.size(); i++){if (arrive_time.at(i) <= time_bar&&run_time.at(i)>round*time_piece)//到达时间在当前时间之前且还没有执行完的{int time_left = run_time.at(i) - round*time_piece;if (time_left >= time_piece){result_name.push_back(process_name.at(i));result_time.push_back(time_piece);time_bar += time_piece;}else{result_name.push_back(process_name.at(i));result_time.push_back(time_left);time_bar += time_left;}}}round++;if (time_bar == total_time)flag = true;} while (!flag);}


 

3)优先数算法:

//===================//优先级优先调度算法//作者:林欣 20151025//类似最短时间优先调度//======================int process::get_topprocess(){int state = 0;int topprocess = 999;bool flag;for (int i = 0; i < process_name.size(); i++){flag = false;for (int j = 1; j < result_name.size(); j++){if (process_name.at(i) == result_name.at(j)){flag = true;break;}}if (!flag){if (priority.at(i)<topprocess){state = i;topprocess = priority.at(i);}}}return state;}void process::PR(){int state;result_name.push_back(process_name.at(0));result_time.push_back(run_time.at(0));for (int i = 1; i < process_name.size(); i++){state = this->get_topprocess();result_name.push_back(process_name.at(state));result_time.push_back(run_time.at(state));}}


 

4)计算响应时间:

//=========================//计算响应时间//作者:林欣 20151025//需紧跟调度函数后执行,与调度顺序结果对应//=========================vector<int> process::get_response_time(){vector<int>resposetime_t;vector<int>resposetime;resposetime_t.push_back(0);int time = 0;for (int i = 1; i < process_name.size(); i++){time += result_time.at(i - 1);resposetime_t.push_back(time);}for (int i = 0; i < process_name.size(); i++){for (int j = 0; j < resposetime_t.size(); j++){if (process_name.at(i) == result_name.at(j)){resposetime.push_back(resposetime_t.at(j));break;}}}return resposetime;}


 

5)计算周转时间

//===============================//周转时间//作者:林欣 20151025//==========================vector<int> process::get_cycle_time(){int time;int time_bar;vector<int>cycle_time;vector<int>response_time(get_response_time());for (int i = 0; i < process_name.size(); i++){time = 0;time_bar = 0;for (int j = 0; j < result_name.size(); j++){if (result_name.at(j) == process_name.at(i))time += result_time.at(j);time_bar += result_time.at(j);if (time == run_time.at(i))break;}cycle_time.push_back(time_bar-response_time.at(i));}return cycle_time;}


 

6)显示

void process::display(){for(int i=0;i<result_name.size();i++){cout.width(result_time.at(i)*2+1);cout.setf(ios::left);cout<<result_name.at(i);}cout<<endl;for(int i=0;i<result_name.size();i++){cout.width(result_time.at(i)*2+1);cout.setf(ios::left);cout<<result_time.at(i);}cout<<endl;for(int i=0;i<result_name.size();i++)               {for(int j=0;j<result_time.at(i)*2;j++){cout<<'*';}cout<<" ";}vector<int>cycle_time(this->get_cycle_time());vector<int>response_time(this->get_response_time());cout<<"\nname:"<<"  response_time"<<"  cycle_time"<<endl;for(int i=0;i<process_name.size();i++){cout<<"  "<<process_name.at(i)<<"       "<<response_time.at(i)<<"          "<<cycle_time.at(i)<<endl;}}


 

0 0
原创粉丝点击