报告.docx
- 文档编号:10844042
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:22
- 大小:85.99KB
报告.docx
《报告.docx》由会员分享,可在线阅读,更多相关《报告.docx(22页珍藏版)》请在冰豆网上搜索。
报告
#include
#include
#include
#include
#defineNULL0
structspcb
{
charname;
charstate;
charwhy;
intdd;
};
typedefstructspcbpcb;
pcbproducter,consumer,*process,*process1;
ints1,s2,i,j,in,out,pc,m;
chararray[10];
charc,x;
intpa[6],sa[6];
intp(ints)/*p操作原语*/
{s=s-1;if(s<0){process->state='B';/*B表示阻塞*/process->why='s';}
else{process->state='W';/*W表示就绪*/}return(s);}
intv(ints)/*v操作原语*/
{s=s+1;if(s<=0){process1->state='W';}process->state='W';return(s);
}
charRanChar()
{chararr[10]={'a','b','c','d','e','f','g','h','i','j'};returnarr[abs(rand()%10)];}
voidput()
{
//printf("\npleaseproductanychar!
");
//scanf("\n%c",&c);
Sleep(1000);array[in]=RanChar();in=(in+1)%10;printf("productacharis%c!
\n",array[in-1]);intk=0;
for(m=0;m<10;m++)
{if(array[m]!
='')
{printf("%c",array[m]);k=k+1;}
}printf("缓冲池中有%d个产品\n",k);}
voidget()
{Sleep(1000);x=array[out];
printf("\n%cgetacharfronbuffer",x);
printf("\n");
array[out]='';out=(out+1)%10;
intk=0;
for(m=0;m<10;m++)
{if(array[m]!
='')
{
printf("%c",array[m]);k=k+1;
}
}
printf("缓冲池中有%d个产品\n",k);}
voidgotol(){pc=0;}
voidnop(){;}
voiddisp()/*建立进程显示函数,用于显示当前进程*/
{printf("\nname\tstate\twhy\tdd\n");
printf("|%c\t",process->name);printf("|%c\t",process->state);
printf("|%c\t",process->why);printf("|%d\t",process->dd);
printf("\n");}
voidinit()/*初始化程序*/
{s1=10;/*s1表示空缓冲区的数量*/
s2=0;/*s2表示满缓冲区的数量*/producter.name='p';/*对生产者进程初始化*/
producter.state='W';producter.why='';producter.dd=0;
consumer.name='c';/*对消费者进程初始化*/consumer.state='W';consumer.why='';
consumer.dd=0;for(intk=0;k<10;k++)
{array[k]='';}}
voidbornpa()/*将生产者程序装入pa[]中*/
{for(i=0;i<=3;i++)
{pa[i]=i;
}}
voidbornsa()/*将消费者程序装入sa[]中*/
{for(i=0;i<=3;i++){sa[i]=i;}}
voiddiaodu()/*处理器调度程序*/
{while((producter.state=='W')||(consumer.state=='W'))
{x=rand();/*x随机获得一个数*/x=x%2;/*对X取于*/
if(x==0)/*若X等于零,则执行生产者进程,反之执行消费者进程*/
{process=&producter;/*process表示现行进程,将现行进程置为生产者进程*/
process1=&consumer;}else{process=&consumer;
process1=&producter;}pc=process->dd;i=pc;/*此时把PC的值付给I*/
if((process->name=='p')&&(process->state=='W'))
{j=pa[i];pc=i+1;switch(j){case0:
s1=p(s1);process->dd=pc;break;
case1:
put();process->state='W';process->dd=pc;break;
case2:
s2=v(s2);process->dd=pc;break;
case3:
gotol();process->state='W';process->dd=pc;}}
elseif((process->name=='c')&&(process->state=='W'))/*执行消费者进程且该进程处于就绪状态*/
{process->state='W';
j=sa[i];pc=i+1;switch(j)
{case0:
s2=p(s2);process->dd=pc;break;/*申请资源,若没有申请到则跳转*/
case1:
get();process->dd=pc;break;case2:
s1=v(s1);
process->dd=pc;break;
case3:
gotol();process->state='W';process->dd=pc;}}/*endelse*/}/*endwhile*/
printf("\nTheprogramisover!
\n");}
voidmain()
{init();bornpa();bornsa();
diaodu();}
#include
#include
#include
#include
intturn;
boolflag[2]={0,0};
//enumBoolean{FALSE=0,TRUE=1};
voidP0()
{
while(true)
{
flag[0]=true;
turn=1;
while(flag[1]&&turn==1)
/*donothing*/
/*criticalsection*/
flag[0]=false;
printf("0号");
/*reminder*/
}
}
voidP1()
{
while(true)
{
flag[1]=true;
turn=0;
while(flag[0]&&turn==0)
/*donothing*/
/*criticalsection*/
flag[1]=false;
printf("1号");
/*reminder*/
}
}
voidmain()
{
flag[0]=false;
flag[1]=false;
P0();
P1();
}
#include
#include
#include
#defineNULL0
intshumu=0;
//进程的内容结构体
structnode
{
inta;
charch;
};
//进程PCB结构体
structjincheng
{
intpid;
intyouxian;
floatluntime;
floatzhantime;
charzhuangtai;//a表示执行,b表示动态就绪
node*neirong;
structjincheng*next;
};
structjincheng*neijin,*neizhi,*p,*q;
//换出进程函数
voidhuanchu(inta)
{
p=neijin;
while(p->pid!
=a&&p!
=NULL)
{
q=p;
p=p->next;
}
if(p==NULL)
{
printf("该进程不在内存里!
\n");
return;
}
if(p==neijin)
{
neijin=neijin->next;
}
else
{
q->next=p->next;//把目标进程换出来,即把目标进程从就绪队列中移出来
}
}
//杀死正在运行进程函数
voidshasi()
{
neizhi->next=NULL;
printf("运行的进程已经杀死!
\n");
return;
}
//创建新进程后与正在运行进程比较优先级并根据优先级判断谁该占用处理机
intbijiao()
{
inti,j;
p=neijin;
while(p!
=NULL)
{
q=p;
p=p->next;//q指向进程的末尾,即新建的进程
}
i=q->youxian;//i代表新进进程的优先级
j=neizhi->next->youxian;//j代表正在执行进程的优先级
if(i>j)//如果新建的进程的优先级高于正在执行程序的优先级
{
p=neijin;
if(p==q)//就绪队列的进程中只有一个进程。
也就是那个新建的进程
{
neijin=neizhi->next;
p->neirong=(node*)malloc(sizeof(node));
p->neirong->a=9;
p->neirong->ch='c';
neizhi->next=p;//把处理机交给优先级高的新进程
return1;
}
else{
while(p->next!
=q)
{
p=p->next;
}//执行完后p指针在q指针前面
p->next=neizhi->next;//将正在执行的进程放置p的后面
q->neirong=(node*)malloc(sizeof(node));
q->neirong->a=9;
q->neirong->ch='c';
neizhi->next=q;//将q放置在正在执行列表中,把处理机交给优先级高的进程
neizhi->next->next=NULL;
return1;
}
}
else
return-1;
}
voidmain()
{
intzhixing();//定义函数
voidshasi();//定义函数
voidchakan();//定义函数
voidtongxing(int);//定义函数
neizhi=(jincheng*)malloc(sizeof(jincheng));
neizhi->next=NULL;
neijin=(jincheng*)malloc(sizeof(jincheng));
neijin->next=NULL;
neijin->pid=1;
neijin->youxian=6;
neijin->luntime=3.5;
neijin->zhantime=3;
neijin->neirong=(node*)malloc(sizeof(node));
neijin->neirong=NULL;
neijin->zhuangtai='b';
shumu++;
p=(jincheng*)malloc(sizeof(jincheng));
p->next=neijin->next;
neijin->next=p;
p->pid=2;
p->youxian=5;
p->luntime=3.5;
p->zhantime=3;
p->neirong=(node*)malloc(sizeof(node));
p->neirong=NULL;
p->zhuangtai='b';
shumu++;
q=(jincheng*)malloc(sizeof(jincheng));
q->next=p->next;
p->next=q;
q->pid=3;
q->youxian=4;
q->luntime=3.5;
q->zhantime=3;
q->neirong=(node*)malloc(sizeof(node));
q->neirong=NULL;
q->zhuangtai='b';
shumu++;
inti,n=1;
intk,j,s;
j=zhixing();
intcreat();
while(n==1)
{
printf("********************************************\n");
printf("*进程演示系统*\n");
printf("********************************************\n");
printf("1.创建新的进程2.查看运行进程\n");
printf("3.换出某个进程4.杀死运行进程\n");
printf("5.进程之间通信6.退出系统\n");
printf("********************************************\n");
printf("请选择(1~6)\n");
scanf("%d",&i);
switch(i)
{
case1:
k=creat();
if(k==1)
printf("进程创建成功!
\n");
if(neijin->next==NULL)
{
printf("由于只有一个进程所以为它分配处理机.\n");
neizhi->next=neijin;
neijin->neirong=(node*)malloc(sizeof(node));
neijin->neirong->a=3;
neijin->neirong->ch='c';
neijin=NULL;
continue;
}
k=bijiao();
if(k==1)
{
printf("由于新进程的优先级高于正在执行的进程所以正在执行的\n");
printf("进程让出处理机交给新进程,而它变为活动就绪!
\n");
}
if(k!
=1)
printf("新进程的优先级低于正在运行的进程所以它只有等待!
\n");
break;
case2:
if(neizhi->next==NULL)
{
printf("没有进程处于执行状态!
\n");
continue;
}
chakan();break;
case3:
if(neijin==NULL)
{
printf("内存中已经没有处于活动就绪的进程了请创建!
\n");
continue;
}
printf("已有处于活动就绪进程的名字为:
\n");
p=neijin;
printf("(");
while(p!
=NULL)
{
printf("%d",p->pid);
p=p->next;
}
printf(")\n");
printf("请输入要换出的处于活动就绪进程的名字\n");
scanf("%d",&s);
huanchu(s);
if(neijin==NULL)
printf("内存中已经没有活动就绪进程!
\n");
else
{
printf("已有处于活动就绪进程的名字为:
\n");
p=neijin;
printf("(");
while(p!
=NULL)
{
printf("%d",p->pid);
p=p->next;
}
printf(")\n");
}
break;
case4:
if(neizhi->next==NULL)
{
printf("没有处于执行状态的进程!
\n");
continue;
}
shasi();
if(neijin==NULL)
{
printf("已经没有处于活动就绪的进程请创建!
\n");
continue;
}
j=zhixing();
if(j==1)
{printf("已为一个动态就绪进程中优先级最高的进程分配处理器!
\n");
}
break;
case5:
if(neijin==NULL)
{
printf("内存中已经没有处于活动就绪的进程了请创建!
\n");
continue;
}
if(neizhi->next==NULL)
{
printf("没有处于执行状态的进程!
\n");
continue;
}
printf("请输入要与正在运行的进程进行进程通讯的进程名字\n");
scanf("%d",&s);
tongxing(s);
break;
case6:
exit(0);
default:
n=0;
}
}
}
//创建新的进程函数
intcreat()
{
inti;
if(shumu>20)
{
printf("内存已满请先换出进程!
\n");
i=-1;
returni;
}
else
{
if(neijin==NULL)//如果没有就绪队列中没有进程的话
{
p=(jincheng*)malloc(sizeof(jincheng));
printf("请输入新进程的名字(数字):
\n");
scanf("%d",&p->pid);
printf("请输入新进程的优先级:
(数字)\n");
scanf("%d",&p->youxian);
p->luntime=3.5;
p->zhantime=3;
p->neirong=(node*)malloc(sizeof(node));
p->neirong=NULL;
p->zhuangtai='b';//新建进程的状态设置为“就绪”
p->next=NULL;
neijin=p;
shumu++;
i=1;
}
else//如果就绪队列不是空队列
{
p=neijin;
while(p->next!
=NULL)
{
p=p->next;//p一直指向就绪队列的队尾
}
q=(jincheng*)malloc(sizeof(jincheng));
q->next=p->next;
p->next=q;//在就绪队列的队尾加入新建的进程
printf("请输入新进程的名字(数字):
\n");
scanf("%d",&q->pid);
printf("请输入新进程的优先级:
(数字)\n");
scanf("%d",&q->youxian);
q->luntime=3.5;
q->zhantime=3;
q->neirong=(node*)malloc(sizeof(node));
q->neirong=NULL;
q->zhuangtai='b';//新建进程的状态设置为就绪
shumu++;
i=1;
}
}
returni;
}
//从活动就绪进程队列中找到一个优先级最高的进程并为它分配处理机
intzhixing()
{
inti,j;
p=neijin;
if(neizhi->next!
=NULL)
{
return-1;
}
i=neijin->youxian;
p=neijin->next;
while(p!
=NULL)
{j=p->youxian;
if(i>=j)
{
p=p->next;
}
if(i { i=p->youxian; p=p->next; } } if(neijin->youxian==i) { neijin->neirong=(node*)malloc(sizeof(node)); neijin->neirong->a=9; neijin->neirong->ch='c'; neizhi->next=neijin; neijin=neijin->next; neizhi->next->next=NULL; } else { p=neijin; while(i! =p->youxian) { q=p; p=p->next; }//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 报告