您好,欢迎光临本网站![请登录][注册会员]  
文件名称: c语言时间片
  所属分类: 网络攻防
  开发工具:
  文件大小: 2kb
  下载次数: 0
  上传时间: 2008-01-10
  提 供 者: XF290******
 详细说明: 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最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: 时间片算法
 输入关键字,在本站1000多万海量源码库中尽情搜索: