开发工具:
文件大小: 2kb
下载次数: 0
上传时间: 2008-01-10
详细说明:
1、 设计一个按时间片轮转调度的算法
提示:
(1)假设系统有5个进程,每个进程用一个进程控制块PCB来代表。PCB的格式如图1-3所示。
其中,进程名即进程标识。
链接指针:指出下一个到达进程的进程控制块首地址。按照进程到达的顺序排队。系统设置一个队头和队尾指针分别指向第一个和最后一个进程。新生成的进程放队尾。
估计运行时间、到达时间以及进程状态一第一题中相同。
(2)为每个进程任意确定一个要求运行时间和到达时间。
(3)按照进程到达的先后顺序排成一个循环队列。再设一个队首指针指向第一个到达进程的首址。
(4)执行处理机调度时,开始选择队首的第一个进程运行。另外再设一个当前运行进程指针,指向当前正在运行的进程。
(5)由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:估计运行时 间减1、输出当前运行进程的名字。用这两个操作来模拟进程的一次运行。
(6)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。同时还应判断该进程的剩余运行时间是否为零。若不为零,则等待下一轮的运行;若该进程的剩余运行时间为零,则将该进程的状态置为完成态C,并退出循环队列。
(7)若就绪队列不为空,则重复上述的步骤(5)和(6),直到所有进程都运行完为止。
(8)在所设计的调度程序中,应包含显示或打印语句。以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
/******************************************************************************************
*
* 实验一 时间片轮转算法模拟程序
* writen by daysky
* 2007-11-19
*
********************************************************************************************/
#include
#include
#include
#include
using namespace std;
//控制块结构体
struct PCB
{
char name;//进程名
PCB *next;//链接指针
int reach_time;//到达时间
int left_time;//估计运行时间
int run_time;//已运行时间
char status;//R就绪 c完成
PCB();
PCB(char aname,int areach_time,int aleft_time,int arun_time=0,char astatus='R',PCB *anext=NULL);
PCB(const PCB &from);
};
PCB::PCB()
{
next=NULL;
reach_time = -1;
left_time = -1;
run_time = 0;
status = 'R';
}
PCB::PCB(char aname,int areach_time,int aleft_time,int arun_time,char astatus,PCB *anext)
{
name = aname;
reach_time = areach_time;
left_time = aleft_time;
run_time = arun_time;
status = astatus;
next = anext;
}
//拷贝构造函数
PCB::PCB(const PCB &from)
{
name = from.name;
next = NULL;
reach_time = from.reach_time;
left_time = from.left_time;
run_time = 0;
status = 'R';
}
/**
* 时间片服务类
*
*/
class TimeServe
{
private:
int systime;
list *ready_list,*all_task;
int together_time;
ofstream fout;
public:
TimeServe();
TimeServe(list *a_all_task,const char *logfile);
bool run();
void check_task();
void run_ready(list::iterator &it);
void print_ready();
~TimeServe();
};
TimeServe::TimeServe()
{
systime=0;
together_time = 0;
ready_list=new list();
all_task=new list();
}
TimeServe::TimeServe(list *a_all_task,const char *logfile)
{
systime=0;
together_time = 0;
ready_list = new list();
all_task = a_all_task;
fout.open(logfile,ios::trunc);
}
//服务执行总调度
bool TimeServe::run()
{
int num = all_task->size();
while(ready_list->empty())
{
//添加新进程,同时从所有队列中删除刚添加的进程
check_task();
systime++;//运行直到有任务
}
list::iterator it=ready_list->begin();
do
{
//打印就绪队列
print_ready();
//执行就绪队列
run_ready(it);
systime++;
check_task();
}while(!ready_list->empty());
//打印平均周转时间
fout << "平均周转时间为:" << together_time/num << "!" << endl;
return true;
}
//检查到达的任务,添加到就绪队列的尾部
void TimeServe::check_task()
{
PCB *current;
list::iterator it;
it = all_task->begin();
//这里用循环处理,因为可能有多个同时到达的任务
while(it!=all_task->end())
{
current=(*it);
if(current->reach_time==systime)
{
PCB *a_pcb = new PCB(*current);//复制进程信息
a_pcb->status = 'R';
ready_list->push_back(a_pcb);//添加在就绪队列的尾部
it = all_task->erase(it); //从所有任务中删除这个任务
fout << "进程" << a_pcb->name << "在时刻:" << systime << "进入就绪队列!" << endl;
}
else
it++;
}
}
//执行就绪队列,运行队列的第一个进程,每次只执行一个时间片
void TimeServe::run_ready(list::iterator &it)
{
if(ready_list->empty()) return;//就绪队列为空就不执行,否则
PCB *current = (*it);
current->run_time++;
current->left_time --;//执行一次,估计时间减一
fout << "进程" << current->name << "执行在时刻:" << systime << "!" << endl;
fout << "进程" << current->name << "已运行时间:" << current->run_time << "!" << endl;
fout << "进程" << current->name << "还剩时间为:" << current->left_time << "!" << endl;
//当进程完成,改变进程的状态
if(current->left_time == 0)
{
current->status = 'C';
//打印并计算周转时间,systime-1为完成时间
fout << "进程" << current->name << "在时刻:" << systime << "结束!" << endl;
int a_time = systime-1-current->reach_time;
together_time += a_time;
fout << "进程" << current->name << "的周转时间为:" << a_time << "!" <
it=ready_list->erase(it);//删除这个元素,迭代指下一个
}
else
it++;
//到尾了就从头开始
if(it==ready_list->end())
it = ready_list->begin();
}
void TimeServe::print_ready()
{
fout << "就绪队列中的进程有:";
list::iterator it=ready_list->begin();
while(it!=ready_list->end())
{
fout << (*it)->name << "、";
it++;
}
fout << endl;
}
TimeServe::~TimeServe()
{
fout.close();
}
int main()
{
PCB *a_pcb[5];
list *all_task=new list();
cout << "正在初始化........" << endl;
//五个进程的到达时间各不相同
a_pcb[0] = new PCB('A',9,10);
a_pcb[1] = new PCB('B',1,30);
a_pcb[2] = new PCB('C',3,25);
a_pcb[3] = new PCB('D',5,40);
a_pcb[4] = new PCB('E',2,33);
for(int i=0;i<5;i++)
{
all_task->push_back(a_pcb[i]);
}
TimeServe fs(all_task,"times_log.txt");
cout << "正在执行........" << endl; ...展开收缩
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.