资源简介
第二题[提示]
(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为:
进程名
指针
要求运行时间
已运行时间
状态
其中,进程名----作为进程的标识,假设五个进程的进程名分别是Q1,Q2,Q3,Q4,Q5。
指针----进程按顺序排成循环队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址。
要求运行时间----假设进程需要运行的单位时间数。
已运行时间----假设进程已经运行的单位时间数,初始值为“0”。
状态----有两种状态,“就绪”状态和“结束”状态,初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。
(2) 每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。
把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。
(3) 处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际启动运行,而是执行:
已运行时间+1
来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这里省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。
(4) 进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。
(5) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。
(6) 在所设计的称序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进称对列的变化。
(7) 为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
代码片段和文件信息
#include
#include
#include
#include
using namespace std;
class List;
class PCB//定义进程PCB
{
public:
friend class List;
private:
PCB (char p[]int t){strcpy(pnamep);runnedtime=0;requesttime=t;status=‘R‘;next=NULL;}
char pname[2];
int runnedtime;
int requesttime;
char status;
PCB* next;
};
class List//链表类
{
public:
List(char p[]=“Q1“int t=0){list=new PCB(pt);pc=list;time=0;}
int print();
int append(char p[]int t);
//void insert(char p[]int t);
void run();
//void link();
//int length();
private:
PCB *list;
PCB *end();
PCB *pc;
int time;
};
/*int List::length()
{
int cnt=0;
PCB *pt=list;
for(;pt->next!=list;pt->nextcnt++)
;
return cnt;
}*/
/*void List::link()
{
if(list!=NULL)
(end())->next=list;
}*/
/*void List::insert(char p[]int t)
{
PCB *pt=new PCB(pt);
pt->next=list;
list=pt;
}*/
int List::append(char p[]int t)//添加结点
{
PCB *pt=new PCB(pt);
if(list==NULL)
list=pt;
else
{
(end())->next=pt;
}
return 1;
}
PCB *List::end()
{
PCB *prv*pt;
for(prv=pt=list;pt;prv=ptpt=pt->next)
;
return prv;
}
int List :: print()//显示打印函数
{
time++;
if(list==0)
return 0;
PCB *pt=list;
cout<<“\t\t进程名 已运行时间 要求运行时间 状态“< while(pt)
{
cout<<“ “;
cout<<“\t\t“<pname[0]<pname[1]<<“ “;
cout<runnedtime<<“ “;
cout<requesttime<<“ “;
cout<status<<“ “;
cout< pt=pt->next;
}
getch();
return 1;
}
void List:: run()//模拟调度的实现过程
{
for(;pc;)
{
PCB *pt=list;
cout<<“\t\t==================================“< cout<<“\t\t==================================“< cout<<“\t\t请选择#退出,选择*继续“< char u;
cin>>u;
if(u==‘#‘)
{
break;
}
if(u==‘*‘)
;
cout<<“\t\t CPU运行时间:“< cout<<“\t\t 正在运行的进程为:“<pname< pc->runnedtime+=1;
if(pc->runnedtime==pc->requesttime)
{
pc->status=‘E‘;
cout<<“\t\t==================================“< cout<<“\t\t 进程--“<pname<<“运行时间已满,置状态为“E”,退出队列!“<
if(pc==list)
{
list=list->next;
pc=pc->next;
}
else
{
for(;pt->next!=pc;pt=pt->next)
;
if(pc->next!=NULL)
{
pt->next=pc->next;
pc=pc->next;
}
else
{
pt->next=NULL;
pc=list;
}
}
}
else
{
if(pc->next!=NULL)
pc=pc->next;
else
pc=list;
}
print();
}
}
void main()//MAIN()函数
{
int S;
cout< cout< cout<<“\t\t**************************************“< cout<<“\t\t====模拟时间片轮转法实现处理器调度====“< cout<<“\t\t输入进程个数:“;
cin>>S;
char name[10];
int n;
cout<<“\t\t请输入第1个进程的名字:“;
cin>>name;
cout<<“\t\t请输入要运行的时间:“;
cin>>n;
List list(namen);
for(int i=2;i<=S;i++)
{
cout<<“\t\t请输入第“<cin>>name;
cout<<“\t\t请输入要运行的时间:“;
cin>>n;
list.append(namen);
}
cout<<“\t\t 初始化各进程状态如下:“< list.pr
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 108544 2008-12-11 21:37 操作系统原理实验题.doc
文件 3181 2008-12-11 11:49 shijianp.cpp
文件 557123 2008-12-11 21:41 shijianp\Debug\shijianp.exe
文件 802520 2008-12-11 21:41 shijianp\Debug\shijianp.ilk
文件 269516 2008-12-11 21:41 shijianp\Debug\shijianp.obj
I.A.... 2001556 2008-12-11 21:41 shijianp\Debug\shijianp.pch
文件 1115136 2008-12-11 21:41 shijianp\Debug\shijianp.pdb
文件 74752 2008-12-11 21:41 shijianp\Debug\vc60.idb
文件 110592 2008-12-11 21:41 shijianp\Debug\vc60.pdb
目录 0 2008-12-11 21:41 shijianp\Debug
文件 3181 2008-12-11 11:49 shijianp\shijianp.cpp
文件 3425 2008-12-11 21:41 shijianp\shijianp.dsp
文件 522 2008-12-11 21:42 shijianp\shijianp.dsw
文件 33792 2008-12-11 21:42 shijianp\shijianp.ncb
文件 48640 2008-12-11 21:42 shijianp\shijianp.opt
文件 1279 2008-12-11 21:41 shijianp\shijianp.plg
目录 0 2008-12-11 21:42 shijianp
----------- --------- ---------- ----- ----
5133759 17
评论
共有 条评论