1、 设计一个按时间片轮转调度的算法<br><br>提示:<br><br>(1)假设系统有5个进程,每个进程用一个进程控制块PCB来代表。PCB的格式如图1-3所示。<br><br><br>其中,进程名即进程标识。<br><br>链接指针:指出下一个到达进程的进程控制块首地址。按照进程到达的顺序排队。系统设置一个队头和队尾指针分别指向第一个和最后一个进程。新生成的进程放队尾。<br><br>估计运行时间、到达时间以及进程状态一第一题中相同。<br><br>(2)为每个进程任意确定一个要求运行时间和到达时间。<br><br>(3)按照进程到达的先后顺序排成一个循环队列。再设一个队首指针指向第一个到达进程的首址。<br><br>(4)执行处理机调度时,开始选择队首的第一个进程运行。另外再设一个当前运行进程指针,指向当前正在运行的进程。<br><br>(5)由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:估计运行时间减1、输出当前运行进程的名字。用这两个操作来模拟进程的一次运行。<br><br>(6)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。同时还应判断该进程的剩余运行时间是否为零。若不为零,则等待下一轮的运行;若该进程的剩余运行时间为零,则将该进程的状态置为完成态C,并退出循环队列。<br><br>(7)若就绪队列不为空,则重复上述的步骤(5)和(6),直到所有进程都运行完为止。<br><br>(8)在所设计的调度程序中,应包含显示或打印语句。以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。<br><br><br>/******************************************************************************************<br>*<br>* 实验一 时间片轮转算法模拟程序<br>* writen by daysky<br>* 2007-11-19<br>*<br>********************************************************************************************/<br><br>#include <iostream><br>#include <list><br>#include <string><br>#include <fstream><br><br>using namespace std;<br><br>//控制块结构体<br>struct PCB<br>{<br>char name;//进程名<br>PCB *next;//链接指针<br>int reach_time;//到达时间<br>int left_time;//估计运行时间<br>int run_time;//已运行时间<br>char status;//R就绪 c完成<br>PCB();<br>PCB(char aname,int areach_time,int aleft_time,int arun_time=0,char astatus='R',PCB *anext=NULL);<br>PCB(const PCB &from);<br>};<br>PCB::PCB()<br>{<br>next=NULL;<br>reach_time = -1;<br>left_time = -1;<br>run_time = 0;<br>status = 'R';<br>}<br>PCB::PCB(char aname,int areach_time,int aleft_time,int arun_time,char astatus,PCB *anext)<br>{<br>name = aname;<br>reach_time = areach_time;<br>left_time = aleft_time;<br>run_time = arun_time;<br>status = astatus;<br>next = anext;<br>}<br>//拷贝构造函数<br>PCB::PCB(const PCB &from)<br>{<br>name = from.name;<br>next = NULL;<br>reach_time = from.reach_time;<br>left_time = from.left_time;<br>run_time = 0;<br>status = 'R';<br>}<br>/**<br>* 时间片服务类<br>*<br>*/<br>class TimeServe<br>{<br>private:<br>int systime;<br>list<PCB *> *ready_list,*all_task;<br>int together_time;<br>ofstream fout;<br>public:<br>TimeServe();<br>TimeServe(list<PCB *> *a_all_task,const char *logfile);<br>bool run();<br>void check_task();<br>void run_ready(list<PCB *>::iterator &it);<br>void print_ready();<br>~TimeServe();<br>};<br>TimeServe::TimeServe()<br>{<br>systime=0;<br>together_time = 0;<br>ready_list=new list<PCB *>();<br>all_task=new list<PCB *>();<br>}<br>TimeServe::TimeServe(list<PCB *> *a_all_task,const char *logfile)<br>{<br>systime=0;<br>together_time = 0;<br>ready_list = new list<PCB *>();<br>all_task = a_all_task;<br>fout.open(logfile,ios::trunc);<br>}<br><br>//服务执行总调度<br>bool TimeServe::run()<br>{<br>int num = all_task->size();<br>while(ready_list->empty())<br>{<br> //添加新进程,同时从所有队列中删除刚添加的进程<br> check_task();<br> systime++;//运行直到有任务<br>}<br>list<PCB *>::iterator it=ready_list->begin();<br>do<br>{<br> //打印就绪队列<br> print_ready();<br><br> //执行就绪队列<br> run_ready(it);<br><br> systime++;<br><br> check_task();<br>}while(!ready_list->empty());<br><br>//打印平均周转时间<br>fout << "平均周转时间为:" << together_time/num << "!" << endl;<br>return true;<br>}<br><br>//检查到达的任务,添加到就绪队列的尾部<br>void TimeServe::check_task()<br>{<br>PCB *current;<br>list<PCB *>::iterator it;<br>it = all_task->begin();<br>//这里用循环处理,因为可能有多个同时到达的任务<br>while(it!=all_task->end())<br>{<br> current=(*it);<br> if(current->reach_time==systime)<br> {<br> PCB *a_pcb = new PCB(*current);//复制进程信息<br> a_pcb->status = 'R';<br> ready_list->push_back(a_pcb);//添加在就绪队列的尾部<br> it = all_task->erase(it); //从所有任务中删除这个任务<br> fout << "进程" << a_pcb->name << "在时刻:" << systime << "进入就绪队列!" << endl;<br> }<br> else<br> it++;<br>}<br>}<br><br>//执行就绪队列,运行队列的第一个进程,每次只执行一个时间片<br>void TimeServe::run_ready(list<PCB *>::iterator &it)<br>{<br> if(ready_list->empty()) return;//就绪队列为空就不执行,否则<br><br>PCB *current = (*it);<br><br> current->run_time++;<br>current->left_time --;//执行一次,估计时间减一<br><br>fout << "进程" << current->name << "执行在时刻:" << systime << "!" << endl;<br>fout << "进程" << current->name << "已运行时间:" << current->run_time << "!" << endl;<br>fout << "进程" << current->name << "还剩时间为:" << current->left_time << "!" << endl;<br>//当进程完成,改变进程的状态<br>if(current->left_time == 0)<br>{<br> current->status = 'C';<br> //打印并计算周转时间,systime-1为完成时间<br> fout << "进程" << current->name << "在时刻:" << systime << "结束!" << endl;<br> int a_time = systime-1-current->reach_time;<br> together_time += a_time;<br> fout << "进程" << current->name << "的周转时间为:" << a_time << "!" <<endl;<br><br> it=ready_list->erase(it);//删除这个元素,迭代指下一个<br>}<br>else<br> it++;<br><br> //到尾了就从头开始<br> if(it==ready_list->end())<br> it = ready_list->begin();<br>}<br><br>void TimeServe::print_ready()<br>{<br>fout << "就绪队列中的进程有:";<br>list<PCB *>::iterator it=ready_list->begin();<br>while(it!=ready_list->end())<br>{<br> fout << (*it)->name << "、";<br> it++;<br>}<br>fout << endl;<br>}<br>TimeServe::~TimeServe()<br>{<br>fout.close();<br>}<br>int main()<br>{<br>PCB *a_pcb[5];<br>list<PCB *> *all_task=new list<PCB *>();<br> cout << "正在初始化........" << endl;<br>//五个进程的到达时间各不相同<br>a_pcb[0] = new PCB('A',9,10);<br>a_pcb[1] = new PCB('B',1,30);<br>a_pcb[2] = new PCB('C',3,25);<br>a_pcb[3] = new PCB('D',5,40);<br>a_pcb[4] = new PCB('E',2,33);<br><br> for(int i=0;i<5;i++)<br> {<br> all_task->push_back(a_pcb[i]);<br> }<br><br>TimeServe fs(all_task,"times_log.txt");<br>cout << "正在执行........" << endl;
- 1
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助