进程调度算法实验代码
好久没来了发个贴,这是老师的实验课题目。没有什么特别的算法,就按老师给的打代码但里面有好多的错误要自己改,下面是我改后的代码,毕竟是第一次写这么长的代码,就贴出来分享一下:
程序代码:#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define END 0
#define BLOCKING 1
#define AREADY 2
#define RUNNING 3
int m=1;
void jiemian();
typedef struct node
{
char name[6];
int status;
int ax;
int pc;
int psw;
struct node *next;
}pcb;
pcb *head;
pcb *createprocess(pcb *head1)
{
pcb *p,*q;
int a,n,u=1,v,r,y;
char ID[6],s,cache[50],cache2[50];
q=NULL;
printf("\n 请输入所创建的pcb的内容:\n");
printf("\n pcb的id是(最多5个字符):\n");
scanf("%50s",cache);
for(v=0;v<5;v++)
ID[v]=cache[v];
ID[5]='\0';
printf("\n pcb的时间片是(0-99的整数): ");
scanf("%d",&a);
getchar();
printf("\n pcb的优先数是(0-99的整数): ");
scanf("%d",&n);
getchar();
while(u!=0)
{
p=(pcb *)malloc(sizeof(pcb));
for(r=0;r<6;r++)
p->name [r]=ID[r];
p->ax =a;
p->pc =m++;
p->psw =n;
p->status =AREADY;
if(head1==NULL)
head1=p;
else
q->next=p;
q=p;
printf("\n 已创建一个新的进程!!!\n");
do
{
printf("\n 要继续创建新的进程吗?(y需要/n退出)");
scanf("%c",&s);
getchar();
if(s=='n')
goto point;
}while(s!='y');
printf("\n 请输入所创建进程pcb的内容:\n");
printf("\n pcb的id是(最多5个字符):\n");
scanf("%50s",cache2);
for(y=0;y<5;y++)
ID[y]=cache2[y];
ID[5]='\0';
printf("\n pcb的所需时间片个数是(1-99整数):");
scanf("%d",&a);
getchar();
printf("\n pcb的优先数十(1-9整数):");
scanf("%d",&n);
getchar();
}
point: if(q!=NULL)
q->next =NULL;
q=head1;
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
while(q)
{
printf(" ");
printf("%6s",q->name );
printf(" 进程就绪");
printf("%6d",q->psw );
printf("%8d",q->pc );
printf("%8d",q->ax );
printf("\n");
printf(" ");
q=q->next ;
}
return head1;
}
void processview(pcb *head3)
{
pcb *q;
q=NULL;
if(q!=NULL)
q->next=NULL;
q=head3;
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
while(q)
{
printf(" ");
printf("%6s",q->name);
printf(" 进程就绪");
printf("%6d",q->psw);
printf("%8d",q->pc);
printf("%8d",q->ax);
printf("\n");
printf(" ");
q=q->next;
}
printf("\n 请按<ENTER>返回主界面>>>>>\n");
getchar();
jiemian();
}
void processfifo(pcb *head2)
{
pcb *p;
int i=0,g=0,d=0,l=1,count=0,w,u,t,hh,z;
char h,check;
pcb fafs[MAX],fempx[MAX],fafsz[4];
p=head2;
printf("\n 进程调度采用先来先服务算法\n");
printf("\n 运行进程序列如下\n");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
while(p!=NULL)
{
printf(" ");
printf("%6s",p->name );
printf(" 进程就绪");
printf("%6d",p->psw );
printf("%8d",p->pc );
printf("%8d",p->ax );
printf("\n");
p=p->next;
}
p=head2;
while(p!=NULL)
{
for(w=0;w<6;w++)
fafs[i].name[w]=p->name[w];
fafs[i].status=p->status;
fafs[i].psw=p->psw;
fafs[i].pc=p->pc;
fafs[i].ax=p->ax;
i++;
p=p->next;
}
while(l!=0) //队列运行
{
for(u=0;u<i;u++)
{
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
fafs[u].status=RUNNING;
printf(" ");
printf("%6s",fafs[u].name);
printf(" 正在运行");
printf("%6d",fafs[u].psw );
printf("%8d",fafs[u].pc );
printf("%8d",fafs[u].ax );
printf("\n");
do
{
printf("\n 请按<Y>模拟进程运行,按<N>推出模拟:\n");
scanf("%c",&check);
getchar();
if(check=='n')
jiemian();
}while(check!='y');
fafs[u].status=rand()%3;
printf("\n ");
printf("%6s",fafs[u].name);
if(fafs[u].status==END)
printf(" 进程结束");
else if(fafs[u].status==AREADY)
{
printf(" 进程就绪");
fempx[g]=fafs[u];
g++;
}
else
{
printf(" 进程阻塞");
fafsz[d]=fafs[u];
d++;
}
printf("%6d",fafs[u].psw );
printf("%8d",fafs[u].pc );
printf("%8d",fafs[u].ax );
printf("\n");
if(d>=4)
{
fempx[g]=fafsz[0];
g++;
fafsz[0]=fafsz[1];
fafsz[1]=fafsz[2];
fafsz[2]=fafsz[3];
d=3;
}
}
if(count==3)
{
if(d!=0)
{
fempx[g]=fafsz[0];
g++;
for(hh=0;hh<(d-1);hh++)
{
fafsz[hh]=fafsz[hh+1];
}
d--;
count=0;
}
}
if(g==0)
i=g;
else
for(i=0;i<g;i++)
fafs[i]=fempx[i];
g=0;
printf("\n 结束本次调度后的就绪队列如下:\n");
printf(" -------------------------");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
printf(" ----------------------\n");
for(t=0;t<i;t++)
{
printf(" ");
printf("%6s",fafs[t].name);
printf(" 进程就绪");
printf("%6d",fafs[t].psw );
printf("%8d",fafs[t].pc );
printf("%8d",fafs[t].ax );
printf("\n");
}
printf("\n 请按<ENTER>浏览阻塞队列:\n");
getchar();
printf("\n 结束本次调度后的阻塞队列如下:\n");
printf(" -------------------------");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
printf(" ----------------------\n");
for(z=0;z<d;z++)
{
printf(" ");
printf("%6s",fafsz[z].name);
printf(" 进程阻塞");
printf("%6d",fafsz[z].psw );
printf("%8d",fafsz[z].pc );
printf("%8d",fafsz[z].ax );
printf("\n");
}
if(d>=1)
count++;
if(count==4)
count=3;
if(i==0&&d==0)
{
printf("\n 模拟完毕!请按<ENTER>返回主界面>>>\n");
getchar();
jiemian();
}
do
{
printf("\n 请按<Y>继续模拟进程运行,按<N>推出模拟:\n");
scanf("%c",&h);
getchar();
if(h=='n')
jiemian();
}while(h!='y');
}
jiemian();
}
void youxian(pcb *head4) //优先级法
{
pcb *p;
pcb temp;
int i=0,g=0,d=0,l=1,count=0,a,b,kk,t,w,z,hh,k,f;
pcb ffs[MAX],tempx[MAX],ffsz[4];
char h,check;
p=head4;
printf("\n 进程调度采用优先级算法>\n");
printf(" 将对如下进程队列进行调度:\n");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
while(p!=NULL)
{
printf(" ");
printf("%6s",p->name);
printf(" 进程就绪");
printf("%6d",p->psw);
printf("%8d",p->pc);
printf("%8d",p->ax);
printf("\n");
p=p->next;
}
p=head4;
while(p!=NULL)
{
for(w=0;w<6;w++)
ffs[i].name[w]=p->name[w];
ffs[i].status=p->status;
ffs[i].psw=p->psw;
ffs[i].pc=p->pc;
ffs[i].ax=p->ax;
i++;
p=p->next;
}
while(l!=0) //排序
{
for(a=1;a<i;a++)
{
for(b=0;b<i-1-a;b++)
{
if(ffs[b].psw>ffs[b+1].psw)
{
temp=ffs[b];
ffs[b]=ffs[b+1];
ffs[b+1]=temp;
}
}
}
do
{
printf("\n 请按<ENTER>模拟进程运行,按<N>退出模拟:\n");
scanf("%c",&check);
getchar();
if(check=='n')
jiemian();
}while(check!='y');
printf(" 按优先数排序后的状态:\n");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
for(k=0;k<i;k++)
{
printf(" ");
printf("%6s",ffs[k].name);
printf(" 进程就绪");
printf("%6d",ffs[k].psw);
printf("%8d",ffs[k].pc);
printf("%8d",ffs[k].ax);
printf("\n");
}
do
{
printf("\n 请按<Y>模拟进程运行,按<N>退出模拟");
scanf("%c",&h);
getchar();
if(h=='n')
jiemian();
}while(h!='y');
for(f=0;f<i;f++)
{
ffs[f].psw=(rand()%9+1);
ffs[f].status=rand()%3;
if(ffs[f].status==AREADY)
{
tempx[g]=ffs[f];
g++;
}
else if(ffs[f].status==BLOCKING)
{
ffsz[d]=ffs[f];
d++;
if(d>=4)
{
tempx[g]=ffsz[0];
g++;
ffsz[0]=ffsz[1];
ffsz[1]=ffsz[2];
ffsz[2]=ffsz[3];
d=3;
}
}
}
if(count==3)
{
if(d!=0)
{
tempx[g]=ffsz[0];
g++;
for(hh=0;hh<(d-1);hh++)
{
ffsz[hh]=ffsz[hh+1];
}
d--;
count=0;
}
}
printf("\n 结束本次优先数排序运行后的状态如下:\n");
printf("\n 进程名|进程状态|优先数|序号|时间片个数:\n");
for(kk=0;kk<i;kk++)
{
printf(" ");
printf("%6s",ffs[kk].name);
if(ffs[kk].status==END)
printf(" 进程结束");
else
{
if(ffs[kk].status==BLOCKING)
printf(" 进程阻塞");
else
printf(" 进程就绪");
}
printf("%6d",ffs[kk].psw);
printf("%8d",ffs[kk].pc);
printf("%8d",ffs[kk].ax);
printf("\n");
}
printf(" 浏览结束请按<ENTER>继续运行:\n");
getchar();
if(g==0)
i=g;
else
{
for(i=0;i<g;i++)
ffs[i]=tempx[i];
}
g=0;
printf(" 结束本次优先数排序运行后的就绪队列如下:\n");
printf(" --------------------------------------");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
printf(" ---------------------------------------\n");
for(t=0;t<i;t++)
{
printf(" ");
printf("%6s",ffs[t].name);
printf(" 进程就绪");
printf("%6d",ffs[t].psw);
printf("%8d",ffs[t].pc);
printf("%8d",ffs[t].ax);
printf("\n");
}
printf("\n 请按<ENTER>浏览阻塞队列");
getchar();
printf("\n 结束本次优先数排序运行后的阻塞队列如下:\n");
printf(" ----------------------------");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
printf(" --------------------------\n");
for(z=0;z<d;z++)
{
printf(" ");
printf("%6s",ffsz[z].name);
printf(" 进程阻塞");
printf("%6d",ffsz[z].psw);
printf("%8d",ffsz[z].pc);
printf("%8d",ffsz[z].ax);
printf("\n");
}
if(d>=1)
count++;
if(i==0&&d==0)
{
printf("\n 模拟完毕!请按<ENTER>返回主界面>>>\n");
getchar();
jiemian();
}
}
printf("\n 模拟完毕!请按<ENTER>返回主界面>>>\n");
getchar();
jiemian();
}
void rr(pcb *head8) //轮转法
{
pcb *p;
int temp=0,i=0,g=0,d=0,l=1,no=0,z,t,w,y,k,e,hh;
char check;
pcb rrf[MAX],tempx[MAX],rrfz[4];
p=head8;
printf("\n 进程调度采用轮转算法\n");
printf(" 将对如下进程队列进程进行调度:\n");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
while(p!=NULL)
{
printf(" ");
printf("%6s",p->name);
printf(" 进程就绪");
printf("%6d",p->psw);
printf("%8d",p->pc);
printf("%8d",p->ax);
printf("\n");
p=p->next;
}
p=head8;
while(p!=NULL)
{
for(w=0;w<6;w++)
rrf[i].name[w]=p->name[w];
rrf[i].status=p->status;
rrf[i].psw=p->psw;
rrf[i].pc=p->pc;
rrf[i].ax=p->ax;
i++;
p=p->next;
}
while(l!=0)
{
do
{
printf("\n 请按<Y>模拟进程运行,按<N>推出模拟");
scanf("%c",&check);
getchar();
if(check=='n')
jiemian();
}while(check!='y');
for(y=0;y<i;y++)
{
rrf[y].ax=rrf[y].ax-1;
if(rrf[y].ax<=0)
{
rrf[y].status=0;
rrf[y].ax=0;
}
else
rrf[y].status=(rand()%2+1);
}
printf("\n 结束本次轮转后的状态如下:\n");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
for(k=0;k<i;k++)
{
printf(" ");
printf("%6s",rrf[k].name);
if(rrf[k].status==0)
printf(" 进程结束");
else
{
if(rrf[k].status==1)
printf(" 进程阻塞");
else
printf(" 进程就绪");
}
printf("%6d",rrf[k].psw);
printf("%8d",rrf[k].pc);
printf("%8d",rrf[k].ax);
printf("\n");
}
for(e=0;e<i;e++)
{
if(rrf[e].status==2)
{
tempx[g]=rrf[e];
g++;
}
else
{
if(rrf[w].status==1)
{
rrfz[g]=rrf[e];
d++;
}
if(d>=4)
{
tempx[g]=rrf[e];
g++;
rrfz[0]=rrfz[1];
rrfz[1]=rrfz[2];
rrfz[2]=rrfz[3];
d=3;
}
}
}
if(no==3)
{
if(d!=0)
{
tempx[g]=rrfz[0];
g++;
for(hh=0;hh<(d-1);hh++)
{
rrfz[hh]=rrfz[hh+1];
}
d--;
no=0;
}
}
if(g==0)
i=g;
else
for(i=0;i<g;i++)
rrf[i]=tempx[i];
g=0;
temp=0;
printf("\n 请按<ENTER>浏览就绪队列");
getchar();
printf("\n 结束本次轮转后的就绪队列如下:\n");
printf(" -----------------------");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n");
printf(" ---------------------------------\n");
for(t=0;t<i;t++)
{
printf(" ");
printf("%6s",rrf[t].name);
printf(" 进程就绪");
printf("%6d",rrf[t].psw);
printf("%8d",rrf[t].pc);
printf("%8d",rrf[t].ax);
printf("\n");
}
printf("\n 请按<ENTER>浏览阻塞队列:");
getchar();
printf("\n 结束本次轮转后的阻塞队列如下:\n");
printf(" -----------------------");
printf("\n 进程名|进程状态|优先数|序号|时间片个数\n ");
printf(" ------------------\n");
for(z=0;z<d;z++)
{
printf(" ");
printf("%6s",rrfz[z].name);
printf(" 进程阻塞");
printf("%6d",rrfz[z].psw);
printf("%8d",rrfz[z].pc);
printf("%8d",rrfz[z].ax);
printf("\n");
}
if(d>=1)
no++;
if(no==4)
no=3;
if(i==0&&d==0)
{
printf("\n 模拟完毕!请按<ENTER>返回主界面.>>>\n");
getchar();
jiemian();
}
}
jiemian();
}
void jiemian()
{
char choice;
printf(" =============================================\n");
printf(" || \n");
printf(" || 操作系统课程实验设计 \n");
printf(" || \n");
printf(" || 进程调度模拟 \n");
printf(" || \n");
printf(" || \n");
printf(" || 宝德学院计算机系 \n");
printf(" || \n");
printf(" || heishu \n");
printf(" || \n");
printf(" || 2012.11 \n");
printf(" =============================================\n");
printf("\n 操作菜单:\n");
printf("\n 1.创建一个进程:\n");
printf("\n 2.按先来先服务法完成进程调度.\n");
printf("\n 3.按优先级发完成进程调度.\n");
printf("\n 4按轮转法完成进程调度.\n");
printf("\n 5.查看进程序列.\n");
printf("\n 0.推出进程.\n");
printf("\n 请输入操作序号(0-5):");
do
{
choice=getchar();
getchar();
switch(choice)
{
case '1':
head=createprocess(head);
printf("\n 请按<ENTER>返回主界面>>>>\n");
getchar();
jiemian();
break;
case '2':
processfifo(head);
break;
case '3':
youxian(head);
break;
case '4':
rr(head);
break;
case '5':
processview(head);
break;
case '0':
exit(0);
}
}while(1);
}
void main()
{
head=NULL;
jiemian();
}







