VC++进程调度模拟实验,死循环了~求高手帮忙调试
实验内容
?每个用来标识进程的进程控制块PCB用结构(记录)来 描述,根据需要,它包括以下字段:
?进程标识数ID。
?进程优先数Priority,并规定优先数越大的进程,其优先权越高。采用简单轮转法时该字段无用。
?进程已经占用的CPU时间CPUTIME(以时间片为单位,下同)。
?进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。
?进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
?进程被阻塞的时间BLOCKTIME,表示已经阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
?进程状态STATE。
?队列指针NEXT,用来将PCB排成队列。
?优先数改变的原则(采用简单轮转法时该字段无用):
?进程在就绪队列中等待一个时间片,优先数增加1;
?进程每运行一个时间片,优先数减3。
?假设在进行调度前,系统中有5个进程,它们的初始状态可以编程输入(更具有灵活性),也可以初始化为如下内容:
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
090323READY
13803-10READY
23006-10READY
32903-10READY
4004-10READY
我写的代码:(当选择一时程序正确。问题应该出在DoH函数里)
#include "stdafx.h"
#include "malloc.h"
#include <iostream.h>
#include "string.h"
struct PCB{
int ID;
int priority;
int CPUTime;
int AllTime;
int StartBlock;
int BlockTime;
char State[6];
};
typedef PCB qelemtype;
typedef int status;
typedef struct qnode{
qelemtype data;
struct qnode *next;
}qnode,*queueptr;
typedef struct {
queueptr front;
queueptr rear;
}linkqueue;
status initqueue(linkqueue &Q){
Q.rear=(queueptr)malloc(sizeof(qnode));
Q.front=Q.rear;
if(!Q.front) return 0;
Q.front->next =NULL;
return 1;
}
status REnQueue(linkqueue &Q,qelemtype e){
queueptr p;
p=(queueptr)malloc(sizeof(qnode));
if(!p) return 0;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
int GetLength(linkqueue Q){
int len=0;
queueptr p;
p=Q.front->next;
while(p!=NULL){
len++;
p=p->next;
}
return len;
}
status HEnQueue(linkqueue &Q,qelemtype e){
int x=GetLength(Q);
queueptr p,q,ptr;
q=Q.front->next;
ptr=Q.front;
p=(queueptr)malloc(sizeof(qnode));
if(!p) return 0;
p->data=e;
if(x==0){
p->next=NULL;
Q.front->next=p;
Q.rear=p;
}
else {
for(int i=0;i<x+1;i++){
if(q!=NULL){
if(p->data.priority>=q->data.priority){
ptr->next=p;
p->next=q;
break;
}
else {
q=q->next;
ptr=ptr->next;
}
}
else {
ptr->next=p;
p->next=NULL;
break;
}
}
}
return 1;
}
void printqueue(linkqueue &Q)
{
queueptr p;
p=Q.front->next;
if(p==NULL)
cout<<"队列为空!"<<endl;
else{
while(p!=NULL){
cout<<"-------------------------------"<<endl;
cout<<"ID--"<<p->data.ID<<'\t';
cout<<"priority--"<<p->data.priority<<'\t';
cout<<"CPUTime--"<<p->data.CPUTime<<'\t';
cout<<"AllTime--"<<p->data.AllTime<<'\t';
cout<<"startblock--"<<p->data.StartBlock<<'\t';
cout<<"BlockTime--"<<p->data.BlockTime<<'\t';
cout<<"state--"<<p->data.State<<endl;
cout<<"-------------------------------"<<endl;
p=p->next;
}
}
cout<<endl;
}
status DeQueue(linkqueue &Q,qelemtype &e)
{
queueptr s;
if(Q.front==Q.rear) return(-1);
else {
s=Q.front->next;
e=s->data;
Q.front->next=s->next;
if(Q.rear==s) Q.rear=Q.front;
free(s);
}
return 1;
}
void DoH(linkqueue &Q,linkqueue &Z){
qelemtype e;
while(GetLength(Q)){
DeQueue(Q,e);
cout<<"运行:"<<e.ID<<endl;
e.CPUTime++;
e.AllTime--;
e.StartBlock--;
e.priority=e.priority-3;
queueptr p=Q.front ->next ;
for(int i=0;i<GetLength(Q);i++){
p->data .priority ++;
p=p->next ;
}
if(e.AllTime==0){
cout<<"ID--"<<e.ID<<"已运行完毕!"<<endl;
}
else if(e.StartBlock==0){
e.BlockTime++;
strcpy(e.State,"block");
HEnQueue(Z,e);
}
else {HEnQueue(Q,e);
}
if(GetLength(Z)!=0){
queueptr q=Z.front->next;
queueptr w=Z.front;
for(int i=0;i<GetLength(Z);i++){
if(q){
q->data.BlockTime--;
if(q->data.BlockTime==0){
qelemtype x;
if(GetLength(Z)==1){
DeQueue(Z,x);
strcpy(x.State,"READY");
HEnQueue(Q,x);
q=NULL;
w=NULL;
}
else {
x=q->data ;
q=q->next ;
w->next =q;
strcpy(x.State,"READY");
HEnQueue(Q,x);
}
}
}
}
}
cout<<"就绪队列情况如下:"<<endl;
printqueue(Q);
cout<<"阻塞队列情况如下:"<<endl;
printqueue(Z);
}
}
void DoR(linkqueue &Q,linkqueue &Z){
qelemtype e;
while(GetLength(Q)){
DeQueue(Q,e);
cout<<"运行:"<<e.ID<<endl;
e.CPUTime++;
e.AllTime--;
e.StartBlock--;
if(e.AllTime==0){
cout<<"进程"<<e.ID<<"已运行完毕!"<<endl;
}
else {
if(e.StartBlock==0){
e.BlockTime++;
strcpy(e.State,"block");
REnQueue(Z,e);
}
else REnQueue(Q,e);
}
if(GetLength(Z)!=0){
queueptr p=Z.front->next;
for(int i=0;i<GetLength(Z);i++){
p->data.BlockTime--;
if(p->data.BlockTime==0){
qelemtype x;
DeQueue(Z,x);
strcpy(x.State,"READY");
REnQueue(Q,x);
p=p->next;
}
}
}
cout<<"就绪队列情况如下:"<<endl;
printqueue(Q);
cout<<"阻塞队列情况如下:"<<endl;
printqueue(Z);
}
}
void main(){
linkqueue Q,Z;
initqueue(Q);
initqueue(Z);
PCB e;
int x;
char a;
int flag=1;
while(flag){
cout<<"请选择以下方式中的一种!"<<endl;
cout<<"1.简单轮转法Round Robin"<<endl;
cout<<"2.优先权高者优先算法Highest Priority First"<<endl;
cin>>x;
for(int i=0;i<5;i++){
cout<<"请输入一个进程:"<<endl;
cout<<"ID--";
cin>>e.ID;
cout<<endl<<"priority--";
cin>>e.priority;
cout<<endl<<"CPUTime--";
cin>>e.CPUTime;
cout<<endl<<"AllTime--";
cin>>e.AllTime;
cout<<endl<<"StartBlock--";
cin>>e.StartBlock;
cout<<endl<<"BlockTime--";
cin>>e.BlockTime;
cout<<endl<<"State--";
cin>>e.State;
if(x==1)
REnQueue(Q,e);
else if(x==2)
HEnQueue(Q,e);
else
cout<<"ERROR!"<<endl;
}
if(x==1) DoR(Q,Z);
else if(x==2) DoH(Q,Z);
else cout<<"ERROR!"<<endl;
cout<<"Continue(Y/y) or not(N/n)?"<<endl;
cin>>a;
if(a=='N'||a=='n')
flag=0;
}
}
[解决办法]
帮忙顶一下,如果明天没人解,就看看。
[解决办法]
操作系统的实验题吧!!呵呵 。刚做完!分享一下!也希望能够指出有什么不足的地方。
#include<iostream>
using namespace std;
struct Jincheng
{
int ID[5];
int PRIORITY[5];
int CPUTIME[5];
int ALLTIME[5];
int STARTBLOCK[5];
int BLOCKTIME[5];
char *STATE[5];
};
void init(Jincheng &jinc);
int select(const Jincheng &jinc);
void runtime(Jincheng &jinc,int first);
void display(const Jincheng &jinc);
bool alltime(const Jincheng &jinc);
int main()
{
struct Jincheng jinc;
init(jinc);
display(jinc);
int n;
bool x=alltime(jinc);
while(x)
{
cout<<"============="<<endl;
n=select(jinc);
runtime(jinc,n);
cout<<"=============="<<endl;
display(jinc);
x=alltime(jinc);
}
display(jinc);
return 0;
}
void init(Jincheng &jinc)
{
for(int i=0;i<5;i++)
{
cout<<"Please input the "<<i<<"st information:\n";
jinc.ID[i]=i;
cout<<"Please input the jinc.PRIORITY["<<i<<"]= ";
cin>>jinc.PRIORITY[i];
cout<<"Please input the jinc.CPUTIME["<<i<<"]= ";
cin>>jinc.CPUTIME[i];
cout<<"Please input the jinc.ALLTIME["<<i<<"]= ";
cin>>jinc.ALLTIME[i];
cout<<"Please input the jinc.STARTBLOCK["<<i<<"]= ";
cin>>jinc.STARTBLOCK[i];
cout<<"Please input the jinc.BLOCKTIME["<<i<<"]= ";
cin>>jinc.BLOCKTIME[i];
if(jinc.STARTBLOCK[i]<=0&&jinc.BLOCKTIME[i]>0)
jinc.STATE[i]="BLOCK";
else jinc.STATE[i]="READY";
}
return;
}
int select(const Jincheng &jinc)
{
int m=0;
int n=0;
for(int i=0;i<5;i++)
{
if((m<jinc.PRIORITY[i])&&(jinc.ALLTIME[i]>0)&&(jinc.STATE[i]=="READY"))
{
m=jinc.PRIORITY[i];
n=i;
}
}
return n;
}
void runtime(Jincheng &jinc,int first)
{
for(int i=0;i<5;i++)
{
if((i!=first)&&(jinc.ALLTIME[i]>0))
{
jinc.PRIORITY[i]+=1;
// jinc.BLOCKTIME[i]-=1;
if(jinc.STARTBLOCK[i]>0)
jinc.STARTBLOCK[i]-=1;
if(jinc.STARTBLOCK[i]<=0&&jinc.STATE[i]=="BLOCK")
jinc.BLOCKTIME[i]-=1;
}
elseif((i==first)&&(jinc.ALLTIME[i]>0))
{
if(jinc.PRIORITY[i]<=3)
jinc.PRIORITY[i]=0;
else
jinc.PRIORITY[i]-=3;
jinc.CPUTIME[i]+=1;
jinc.ALLTIME[i]-=1;
if(jinc.STARTBLOCK[i]>0)
jinc.STARTBLOCK[i]-=1;
else if((jinc.STARTBLOCK[i]<=0)&&(jinc.BLOCKTIME[i]<=0))
jinc.BLOCKTIME[i]-=1;
}
if(jinc.BLOCKTIME[i]>0&&jinc.STARTBLOCK[i]<=0)
jinc.STATE[i]="BLOCK";
else jinc.STATE[i]="READY";
////////////////////////
}
return ;
}
void display(const Jincheng &jinc)
{
cout<<"ID:\n";
for(int i=0;i<5;i++)
{
cout<<jinc.ID[i]<<" ";
}
cout<<endl;
cout<<"PRIORITY: \n";
for( i=0;i<5;i++)
{
cout<<jinc.PRIORITY[i]<<" ";
}
cout<<endl;
cout<<"CUPTIME: \n";
for( i=0;i<5;i++)
{
cout<<jinc.CPUTIME[i]<<" ";
}
cout<<endl;
cout<<"ALLTIME:\n ";
for(i=0;i<5;i++)
{
cout<<jinc.ALLTIME[i]<<" ";
}
cout<<endl;
cout<<"STARTBLOCK: \n";
for(i=0;i<5;i++)
{
cout<<jinc.STARTBLOCK[i]<<" ";
}
cout<<endl;
cout<<"BLOCKTIME: \n";
for(i=0;i<5;i++)
{
cout<<jinc.BLOCKTIME[i]<<" ";
}
cout<<endl;
return ;
}
bool alltime(const Jincheng &jinc)
{
int m=0;
for(int i=0;i<5;i++)
{
m+=jinc.ALLTIME[i];
}
if(m<=0)
return false;
else
return true;
}
[解决办法]
mark一下,有时间看看
[解决办法]
mark ,so long
[解决办法]
无语啊,没有注释让人怎么看!!!!,养成好习惯
[解决办法]
不错,你哪个学校的?
比我学校的实验报告难多了.哈哈.
这样才好嘛....加油.