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

📄 kos.c

📁 用C语言模拟操作系统的队列及时间片分配 简单
💻 C
字号:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define LENR sizeof(struct ready)
#define LENW sizeof(struct wait)

/*仓库*/
int cangku=0;
/*各进程时间片统计*/
int tpa=0;
int tpb=0;
int tca=0;
int tcb=0;
int tw=0;
int tr=0;
/*生产消费数量*/
int a_p=0;
int b_p=0;
int a_c=0;
int b_c=0;
/*信号量S*/
int s=1;

int j,k,i;

/*就绪队列结构*/
struct ready   
{
  int sign;
}rq[4];

/*等待队列结构*/
struct wait  
{
  int sign;
}wq[4];

/*P原语*/
int P(int s)
{
   if(s>0)
    { 
      s=s-1;
      return 1;
    }
    else return 0;
}

/*V原语*/
V(int s)
{
   if(s==0)
     {
       s=s+1;
     }
    else {};
}

/*生产者A管理进程*/
PA()
{
 tpa=tpa+1;
 j=0;
 while(wq[j].sign!=0&&j<4)
   {
    j=j+1;
   }
 if(wq[j].sign==0)
   {
    wq[j].sign=1;
   }
 else {};
}

/*B生产者管理进程*/
PB()
{
  tpb=tpb+1;
  j=0;
 while(wq[j].sign!=0&&j<4)
   {
    j=j+1;
   }
 if(wq[j].sign==0)
   {
    wq[j].sign=2;
   }
 else {};
}

/*消费者A管理进程*/
CA()
{
  tca=tca+1;
 j=0;
 while(wq[j].sign!=0&&j<4)
   {
    j=j+1;
   }
 if(wq[j].sign==0)
   {
    wq[j].sign=3;
   }
 else {};
}

/*消费者B管理进程*/
CB()
{
  tcb=tcb+1;
  j=0;
 while(wq[j].sign!=0&&j<4)
   {
    j=j+1;
   }
 if(wq[j].sign==0)
   {
    wq[j].sign=4;
   }
 else {};
}

/*等待队列进程*/
wait_tenor()
{
  tw=tw+1;
  if(wq[0].sign!=0)
   {
     j=0;
     while(rq[j].sign!=0&&j<4)
       {
          j=j+1;
       }
     if(rq[j].sign==0)
       {
          rq[j].sign=wq[0].sign;
          for(j=0;j<4;j++)
           {wq[j].sign=wq[j+1].sign;}
            wq[3].sign=0;
       }
     else {};
   } 
 else {};
}

/*就绪队列进程*/
ready_tenor()
{
   tr=tr+1;
   if(rq[0].sign!=0)
     {
       if(rq[0].sign==1)
         {
          produce(1);
          for(j=0;j<4;j++)
          {rq[j].sign=rq[j+1].sign;}
           rq[3].sign=0;
         }
       else if(rq[0].sign==2)
         {
          produce(2);
          for(j=0;j<4;j++)
          {rq[j].sign=rq[j+1].sign;}
           rq[3].sign=0;
         }
       else if(rq[0].sign==3)
         {
          custom(1);
          for(j=0;j<4;j++)
           {rq[j].sign=rq[j+1].sign;}
           rq[3].sign=0;
         }
       else { 
              custom(2);
              for(j=0;j<4;j++)
               {rq[j].sign=rq[j+1].sign;}
               rq[3].sign=0;
            }    
     }
   else {};
}

/*生产商品函数*/
produce(int j)
{
  if(j==1)
    {
      k=P(s);
      if(k)
        {
          if(cangku<3)
            {
             cangku=cangku+1;
             a_p=a_p+1;
             
            }
           else V(s);
        }
       else V(s);
    }
  else {
         k=P(s);
       if(k)
        {
          if(cangku<3)
            {
             cangku=cangku+1;
             b_p=b_p+1;
             
            }
           else V(s);
        }
       else V(s);
       }
}


/*消费商品函数*/
custom(int j)
{
  if(j==1)
    {
      k=P(s);
      if(k)
        {
          if(cangku>0)
            {
             cangku=cangku-1;
             a_c=a_c+1;
             V(s);
            }
           else V(s);
        }
       else V(s);
    }
  else {
        k=P(s);
      if(k)
        {
          if(cangku>0)
            {
             cangku=cangku-1;
             b_c=b_c+1;
             V(s);
            }
           else V(s);
        }
       else V(s);
      }
}

main_print()
{
   gotoxy(6,2);
   printf("product A:  %d/%d",a_p,tpa);
   gotoxy(6,3);
   printf("product B:  %d/%d",b_p,tpb);
   gotoxy(6,4);
   printf("custom  A:  %d/%d",a_c,tca);
   gotoxy(6,5);
   printf("custom  B:  %d/%d",b_c,tcb);
   gotoxy(6,6);
   printf("cangku   :  %d/3",cangku);
   gotoxy(6,7);
   printf("ready_tenor:%d  ",tr);
   for(j=0;j<4;j++)
    {
     if(rq[j].sign==1)
        printf(" product_A");
     else if(rq[j].sign==2)
        printf(" product_B");
     else if(rq[j].sign==3)
        printf(" custom_A ");
     else if(rq[j].sign==4)
        printf(" custom_B");
     else printf("   NULL   ");     
    } 
   gotoxy(6,15);
   printf("wait_tenor: %d  ",tw);
   for(j=0;j<4;j++)
    {
     if(wq[j].sign==1)
        printf(" product_A");
     else if(wq[j].sign==2)
        printf(" product_B");
    else if(wq[j].sign==3)
        printf(" custom_A ");
    else if(wq[j].sign==4)
        printf(" custom_B");
     else printf("   NULL   ");     
    } 
   
   if(i==0) {gotoxy(1,7);printf("cpu->");}
       else {gotoxy(1,7);printf("     ");}
   if(i==1) {gotoxy(1,15);printf("cpu->");}
       else {gotoxy(1,15);printf("     ");}
   if(i==2) {gotoxy(1,2);printf("cpu->");}
       else {gotoxy(1,2);printf("     ");}
   if(i==3) {gotoxy(1,3);printf("cpu->");}
       else {gotoxy(1,3);printf("     ");}
   if(i==4) {gotoxy(1,4);printf("cpu->");}
       else {gotoxy(1,4);printf("     ");}
   if(i==5) {gotoxy(1,5);printf("cpu->");}
       else {gotoxy(1,5);printf("     ");}
}   

main()
{
   
   time_t t;
   srand((unsigned) time(&t));
   i=rand() % 6;

do 
  {
    if(i==0) {
               ready_tenor();
               main_print();
               i=rand() % 6;
             }
else if(i==1) {
               wait_tenor();
               main_print();
               i=rand() % 6;
              }
else if(i==2) {
               PA();
               main_print();
               i=rand() % 6;
              }
else if(i==3) {
               PB();
               main_print();
               i=rand() % 6;
              }
else if(i==4) {
               CA();
               main_print();
               i=rand() % 6;
              }
        else {
               CB();
               main_print();
               i=rand() % 6;
             }
    getch();
  }while(getch()!='e');

}

⌨️ 快捷键说明

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