进程调度算法实验代码
好久没来了发个贴,这是老师的实验课题目。没有什么特别的算法,就按老师给的打代码但里面有好多的错误要自己改,下面是我改后的代码,毕竟是第一次写这么长的代码,就贴出来分享一下:程序代码:
#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(); }