文件名称:c语言时间片
文件大小:2KB
文件格式:RAR
更新时间:2011-01-30 10:28:02
时间片算法
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
int together_time;
ofstream fout;
public:
TimeServe();
TimeServe(list
bool run();
void check_task();
void run_ready(list
void print_ready();
~TimeServe();
};
TimeServe::TimeServe()
{
systime=0;
together_time = 0;
ready_list=new list
all_task=new list
}
TimeServe::TimeServe(list
{
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
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
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
{
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
while(it!=ready_list->end())
{
fout << (*it)->name << "、";
it++;
}
fout << endl;
}
TimeServe::~TimeServe()
{
fout.close();
}
int main()
{
PCB *a_pcb[5];
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;
【文件预览】:
shijianpian.txt