Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  kcsj
Language: C/C++
Code:
#include "stdio.h"
#include "malloc.h"
#include "string.h"
int m1, m2, i, ep, num;
typedef struct list
{
  int id;
  int size;
  char txt[200];
  struct list *next;
} btype;
struct
{
  int id;
  char status;
  int waiter1;
  int priority;
  char stack[5];
  int total;
  btype *front;
  btype *rear;
} pcb[4];
struct
{
  int value;
  int waiter2;
} sem[3];
char addr;

init()
{
  int j, k;
  for (j = 1; j <= 3; j++)
  {
    pcb[j].id = j;
    pcb[j].status = 'r';
    pcb[j].waiter1 = 0;
    pcb[j].priority = j;
    for (k = 0; k <= 4; k++)
      pcb[j].stack[k] = '0';
    pcb[j].total = 0;
    pcb[j].front = NULL;
    pcb[j].rear = NULL;
  }
  for (j = 1; j <= 2; j++)
  {
    sem[j].value = 0;
    sem[j].waiter2 = 0;
  }
  i = 0;
  ep = 0;
  addr = '0';
  m2 = 0;
  m1 = 0;
}





scheduler()
{
  int pd;
  for (;;)
  {
    pd = find();
    if (pd == 0)
      return (0);
    if (ep == 0)
    {
      pcb[pd].status = 'e';
      ep = pd;
    }
    else if (pcb[pd].priority < pcb[ep].priority)
    {
      pcb[ep].status = 'r';
      printf("process%d ready\n", ep);
      pcb[pd].status = 'e';
      ep = pd;
    }
    else
      return (1);
    printf("process%d executing\n", ep);
    i = pcb[pd].stack[1];
    addr = pcb[pd].stack[2];
    switch (pd)
    {
      case 1:
        process1();
        break;
      case 2:
        process2();
        break;
      case 3:
        process3();
        break;
      default:
        printf("pd error\n");
    }
  }
}

find()
{
  int j;
  for (j = 1; j <= 3; j++)
    if (pcb[j].status == 'r')
      return (j);
  return (0);
}

p(se, p, ad)int se;
int p;
char ad;
{
  int w;
  sem[se].value--;
  if (sem[se].value >= 0)
    return (1);
  else
  {
    printf("process%d blocked\n", p);
    ep = 0;
    pcb[p].status = 'w';
    pcb[p].waiter1 = 0;
    w = sem[se].waiter2;
    if (w == 0)
      sem[se].waiter2 = p;
    else
    {
      while (pcb[w].waiter1 != 0)
        w = pcb[w].waiter1;
      pcb[w].waiter1 = p;
    }
    pcb[p].stack[1] = i;
    pcb[p].stack[2] = ad;
    return (0);
  }
}

v(se, p, ad)int se;
int p;
char ad;
{
  int w;
  sem[se].value++;
  if (sem[se].value > 0)
    return (1);
  else
  {
    w = sem[se].waiter2;
    sem[se].waiter2 = pcb[w].waiter1;
    pcb[w].status = 'r';
    printf("wakeup process%d\n", w);
  }
  pcb[p].stack[1] = i;
  pcb[p].stack[2] = ad;
  return (0);
}

void send(int rec_id, char a[], int n)
{
  btype *p;
  p = (btype*)malloc(sizeof(btype));
  p->id = rec_id;
  p->size = n;
  p->next = NULL;
  strcpy(p->txt, a);
  if (pcb[rec_id].total <= 0)
  {
    pcb[rec_id].front = p;
    pcb[rec_id].rear = p;
    pcb[rec_id].total++;
  }
  else
  {
    pcb[rec_id].rear->next = p;
    pcb[rec_id].rear = p;
    pcb[rec_id].total++;
  }
}

void ordering(char *a,int n)
{
    int i,j,temp;
    for(i=1;i<n;i++) {
        temp=a[i];
        j=i-1;
        while(j>=0&&temp<a[j]) {
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=temp;
    }
}


int receive(int rec_id, char b[])
{
  btype *p;
  if (pcb[rec_id].total <= 0)
  {
    printf("no message!!\n");
    return 0;
  }
  else
  {
    p = pcb[rec_id].front;
    pcb[rec_id].total--;
    pcb[rec_id].front = pcb[rec_id].front->next;
    strcpy(b, p->txt);
    free(p);
    if (pcb[rec_id].front == NULL)
      pcb[rec_id].rear = NULL;
    return 1;
  }
}

process1()
{
  char t[100];
  if (addr == 'm')
    goto m;
  i = 1;
  m1 = 1;
  a: printf("process1 calls p on sem1!\n");
  printf("do you want to send data ?(y/n)");
  char flag = getchar();
  if (flag == 'y' || flag == 'Y')
  {
    printf("input data:");
    scanf("%s", t);
    int len = strlen(t);
    send(1, t, len);
    printf("\n");
  }
   printf("\n  process1 printing m1=%d\n\n",m1);
  if (p(1, 1, 'm') == 0)return (0);
  m: printf("\n=>process1 i=%d\n\n", i);
  i = i + 5;
  goto a;
}

process2()
{
  char t[100];
  if (addr == 'm')
    goto m;
  if (addr == 'n')
    goto n;
  i = 1;
  a: printf("\n process2 printing m1=%d\n", m1);
  m2 = 2 * m1;
  printf("Do you want to receive message?(y/n)");
  getchar();
  char flag = getchar();
  if (flag == 'y' || flag == 'Y')
  {
    if (receive(1, t) == 0)
    {
      getchar();
    }
    else
    {
      int len = strlen(t);
      ordering(t, len);
      printf("\n%s\n\n", t);
      send(2, t, len);
    }
  }
  printf("process2 call p on sem2\n");
  if (p(2, 2, 'm') == 0)
    return (0);
  m: printf("process2 call v on sem1!\n");
  if (v(1, 2, 'n') == 0)
    return (0);
  n: printf("\n=>process2 i=%d\n\n", i);
  i = i + 10;
  goto a;
}

process3()
{
  char t[100];
  if (addr == 'm')
    goto m;
  if (addr == 'n')
    goto n;
  i = 1;
  a: printf("\n=>process3 i=%d\n", i);
  if (i >= num)
    goto b;
  printf("\n process3 printing 2^i=%d\n\n", m2);
  m1 = m2;
  if (receive(2, t))
  {
    printf("==>ORDERED RESULT:%s\n\n", t);
    getchar();
  }
  else
  {
    getchar();
  }
  getchar();
  printf("process3 call v on sem2!\n");
  if (v(2, 3, 'm') == 0)
    return (0);
  m: i++;
  goto a;
  b: if (receive(2, t))
  {
    printf("==>RESULT:%s\n\n", t);
    getchar();
  }
  else
  {
    printf("==>RESULT:\n\n");
    getchar();
  }
  printf("\nprocess3 calls p on sem2\n");
  if (p(2, 3, 'n') == 0)
    return (0);
  n: ;
}

main()
{
  printf("\n  intput num. == ");
  scanf("%d", &num);
  printf("\n\n==>we begin manage of process\n");
  printf("==============================\n\n");
  getchar();
  init();
  if (scheduler() == 0)
  {
    printf("\n\n===>result printing 2^i=%d\n", m2);
    getchar();
    exit(0);
  }
}
Comments: