⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jinchengtongbu.txt

📁 一个操作系统进程同步的程序
💻 TXT
字号:
#include <stdio.h>
#include <string.h>
#include <time.h>                /*time及stdlib:产生随机数*/
#include <stdlib.h>
#include <conio.h>


typedef int semaphore;
typedef char products;


typedef struct _proc
{
   char name[32];           /*进程名*/
   int state;               /*状态 1:运行 2:就绪 3:等待 4:完成*/
   char reason;             /*等待原因*/
   int inter;               /*断点*/
}PROC;


semaphore s1=10,s2=0;
int PC;

PROC *pnow;                 /*一组全局变量*/
PROC proc[2];
products B[10];
char cc,xx;



/*下面是程序子函数*/
void print()
{

switch(pnow->state)
{
case 1:{printf("pnow->state:  run\n");break;}
case 2:{printf("pnow->state:  ready\n");break;}
case 3:{printf("pnow->state:  wait\n");break;}
case 4:{printf("pnow->state:  finish\n");break;}
}
}

products produce (char SRC[])       /*关于product: 与提示不同 在此我用来自动(非手动)判断生产者结束条件*/
{                                   /*本子函数用来:从给出的字符串中读入一个字符 很简单*/
products c;
static int count=0;
int length;

length=strlen(SRC);

if(count<length)
{ proc[0].state=2;

   c=SRC[count];

   count+=1;

   return c;
}

else

{proc[0].state=4;return 0;}     /*若越界 即生产者任务结束*/


}

void P(semaphore *S,char C)        /*p操作函数*/
{
*S=*S-1;

printf("P_S%c : %d\n",C,*S);
if (*S<0)                          /*若S自减一后 S值小于0 则将调用p(s)的进程置为等待信号量s的状态 否则将调用p(s)的进程置为就绪*/
{
pnow->state=3;
pnow->reason=C;

printf("pnow->reason: s%c\n",C);

}
else 
pnow->state=2;

print();
}

void PUT(products C)             /*PUT函数 将produce产生的产品(一个字符)放到B[]缓冲里*/
{
static IN=0;

B[IN]=C;


printf("B[IN] : %c\n",B[IN]);


IN=(IN+1)%10;

}

void V(semaphore *S,char C)     /*V操作 若s增一后不大于0 则找一个等待s信号量的进程置为就绪态 最后将调用v(s)的进程置为就绪*/
{

*S=*S+1;
printf("V_S%c : %d\n",C,*S);
printf("reason: s%c\n",C);

if (*S<=0)
{
if(proc[0].state==3&&proc[0].reason==C)
proc[0].state=2;
else if(proc[1].state==3&&proc[1].reason==C)
proc[1].state=2;
}

pnow->state=2;
print();

}


products GET()                 /*GET函数 从缓冲区中依次取出一个产品*/
{
static OUT=0;
products x;

x=B[OUT];
OUT=(OUT+1)%10;


return x;


}


void consume(products X)      /*消费产品 即将得到的字符打印出来*/
{

printf("product :%c",X);


}



void init()                 /*初始化函数 初始化两个进程 由于进程数较少 用数组方式*/
{



strcpy(proc[0].name,"producer");
proc[0].state=2;
proc[0].inter=0;


strcpy(proc[1].name,"consumer");
proc[1].state=2;
proc[1].inter=0;


pnow=&proc[0];
PC=0;


}



void zlzx()               /*指令执行函数 核心是一个switch函数 和j的计算*/
{
int i,j;

char c1;
char x;
char src[]="ILOVEYOU!";


x=src[strlen(src)-1];


i=PC;

PC=(i+1)%4;

if (strcmp(pnow->name,proc[0].name)==0)

j=i;

else j=i+4;             /*以上为j的计算 若是生产者进程 j取0~3 分别对应produce P PUT V 若是消费者进程 j取4~7 分别对应P GET V consume */



switch(j)
{
case 0: { cc=produce(src); printf("case 0:produce()   cc=%c\n",cc); getchar();   break;}

case 1: { printf("case 1  P(s1)\n");P(&s1,'1');getchar();    break;}

case 2: { printf("case 2  PUT()\n");printf("cc= %c\n",cc); PUT(cc); pnow->state=2;getchar();    break;}

case 3: {printf("case 3 V(s2)\n");V(&s2,'2'); getchar();    break;}

case 4: { printf("case 4 p(s2)\n");P(&s2,'2'); getchar();    break;}

case 5: {printf("case 5 GET()\n");xx=GET(); printf("xx :%c\n",xx); pnow->state=2;getchar();     break;}

case 6: { printf("case 6 V(s1)\n"); V(&s1,'1'); getchar();   break;}

case 7: {printf("case 7 consume()\n"); consume(xx); pnow->state=2; getchar();    break;}

default: {printf("error!");}


}

/*生产者运行结束? 置完成状态 手动 不过本人已在produce函数中解决了此问题 故不再在使用*/


/*if(K!='y')
{
printf("kill produce?\n y-yes    n-no");

if(strcmp(c1=getchar(),'y')==0)
{K='y';proc[0].state=4;}
}

else

proc[0].state=4;*/




}



void clqdd()            /*处理器调度函数*/
{


while(1)                /*一个大while循环 结束条件为生产者和消费者状态均不是就绪*/
{
int rdm;
pnow->inter=PC;
randomize();            /*随机选择就绪的进程*/
rdm=random(2);

printf("\n");
printf("rdm= :%d\n",rdm);


if (proc[rdm].state==2)
{pnow=&proc[rdm];

printf("pnow->name :%s\n",pnow->name);}

else if (proc[0].state==2)
pnow=&proc[rdm];
else if (proc[1].state==2)
pnow=&proc[rdm];
else
{
printf("GAME OVER! \n \t\t\tby 01 ");    /*若已经没有就绪进程 则结束本程序 署作者名:01*/
sleep(3);
return -1;
}

pnow->state=1;

PC=pnow->inter;


getchar();

zlzx();                     /*调用指令执行函数*/
}

}
void paper()
{ int i; 
   gotoxy(1,25);        
   printf("press enter to see the result......\n");   
   getch();                      
   clrscr();                     
   gotoxy(1,1);             
   textcolor(GREEN);   
   textbackground(RED);   
   gotoxy(10,2);          
   putch(0xc12);        
   for(i=1;i<44;i++)
      putch(0xcd);    
   putch(0xbb);            
   for(i=3;i<20;i++)
   {
      gotoxy(10,i);putch(0xba);  
      gotoxy(54,i);putch(0xba);
   }  
   gotoxy(10,20);putch(0xc8);  
   for(i=1;i<44;i++)
      putch(0xcd);     
   putch(0xbc);                 
   window(11,6,60,21);       
   clrscr();             
  
   textbackground(BLACK);   
   window(1,1,80,25);      
   gotoxy(10,21);      
}





void main()
{
paper();

init();
clqdd();

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -