资源简介
⑴ 能够选择不同的调度算法——时间片轮转算法和强占式短进程优先算法;⑵ 能够输入进程的基本信息——进程名、到达时间和运行时间等;⑶ 根据选择的调度算法显示进程调度队列;⑷ 根据选择的调度算法计算平均周转时间和平均带权周转时间。
代码片段和文件信息
#include
#include
using namespace std;
#define QT 2//定义时间片长度为2
struct PCB
{
string name;//进程名
int ta;//进程到达时间
int ts;//进程估计运行的时间
int tb;//进程开始运行时间
int tm;//进程仍需运行的时间
int to;//进程完成的时间
int rn;//进程运行的次数
int totalTime;//周转时间
double weightTotalTime;//带权周转时间(周转时间/估计运行时间)
PCB *next;//定义指向下一个进程的指针
};
int pronum;//定义进程数为pronum
int total;//记录所有进程的总时间
double weight;//记录所有进程的带权周转时间
PCB *create(PCB *head);//创建进程队列
void del(PCB *p);//删除p的下一个节点
void sort(PCB *head);//将进程按到达的先后顺序排列
int getCount(PCB *headint time);//察看在time之前到达但未移动到运行队列的进程数量
PCB *searchEnd(PCB *head);//查找并返回循坏队列的尾节点
void move(PCB *headFPCB *headTint n);//将headF后的n个节点移动到循环队列headT中
void cyclerun(PCB *head);//时间片轮转算法
PCB *SJF(PCB *headint count);//在头节点后的count个节点中选择需时间最小的返回
void SJFrun(PCB *head);//强占式短进程优先算法
void main()
{
int choice;
char a;
cout<<“*进程调度模拟设计——时间片轮转、强占式短进程优先算法*“< cout<<“***********1.时间片轮转算法***************************“< cout<<“***********2.强占式短进程优先算法*********************“< cout<<“***********3 退出*************************************“< l1: cout<<“请输入您的选择:“< l2: cin>>choice;
PCB *head=NULL;
switch(choice)
{
case 1:head=create(head);cyclerun(head);goto l1;
case 2:head=create(head);SJFrun(head);goto l1;
case 3:break;
default:cout<<“输入错误!\n请重新输入:“< }
}
PCB *create(PCB *head)
{
PCB *p1*p2;
p1=p2=new PCB;
head=p1;
cout<<“请输入进程数:“;
cin>>pronum;
for(int i=0;i {
p2=p1;
p1=new PCB;
p1->next=NULL;
cout<<“请依次输入第“< cin>>p1->name>>p1->ta>>p1->ts;
p1->tm=p1->ts;
p1->rn=1;
total+=p1->ts;
p2->next=p1;
}
return head;
}
void sort(PCB *head)//将进程按到达的先后顺序排列
{
PCB *p*q*r*s;
if(head->next!=NULL)
{
p=head->next->next;
head->next->next=NULL;
}
while(p)
{
q=p;
p=p->next;
r=head;
s=head->next;
while(s&&s->ta<=q->ta)
{
r=s;
s=s->next;
}
r->next=q;
q->next=s;
}
}
void del(PCB * p)//删除p的下一个节点
{
PCB *tmp;
tmp=p->next;
p->next=tmp->next;
free(tmp);
}
int getCount(PCB *headint time)//察看在time之前到达但未移动到运行队列的进程数量
{
int count=0;
PCB *s*t;
s=head;
t=s->next;
while(t!=NULL&&t->ta<=time)
{
s=t;
t=t->next;
count++;//count记录当前时刻到达的进程数
}
return count;
}
PCB* searchEnd(PCB *head)//查找并返回循坏队列的尾节点
{
PCB *p*q;
p=head;
q=head->next;
while(q->next!=head)
{
p=q;
q=q->next;
}
return p;
}
void move(PCB *headFPCB *headTint n)//将headF后的n个节点移动到循环队列headT中
{
PCB *r*s*t;
s=headF;
t=s->next;
r=t;//r记录要移动的第一个节点
while(n>1)
{
t=t->next;
n--;
}
s->next=t->next;//以上完成从原队列中摘除相关节点rt分别为第一个和最后一个节点
s=searchEnd(headT);
t->next=s->next;
s->next=r;
}
void cyclerun(PCB *head)//时间片轮转算法
{
sort(head);
int time=0;//记录当前时间
int newarrive;//新到达进程数
PCB *rhead;
rhead=new PCB;
rhead->next=rhead;//创建新的循环链表,存放当前就绪队列中的进程
PCB *p*q;
p=rhead;
q=p->next;//q记录当前应当运行的
评论
共有 条评论