Wednesday 3 April 2019


Dining Philosophers Problem in Operating System in C 






What is Dining Philosophers Problem?
There are some Philosophers whose work is just thinking and eating. Let there are 5 (for example) philosophers. They sat at a round table for dinner. To complete dinner each must need two Forks (spoons). But there are only 5 Forks available (Forks always equal to no. of Philosophers) on table. They take in such a manner that, first take left Fork and next right Fork. But problem is they try to take at same time. Since they are trying at same time, Fork 1, 2, 3, 4, 5 taken by Philosopher 1, 2, 3, 4, 5 respectively (since they are left side of each). And each one tries to ta ke right side Fork. But no one found available Fork. And also that each one thinks that someone will release the Fork and then I can eat. This continuous waiting leads to Dead Lock situation.
Dining Philosophers Problem

Source Code:

#include<stdio.h>
#include<conio.h>
#define n 4

int compltedPhilo = 0,i;

struct fork{
    int taken;
}ForkAvil[n];

struct philosp{
    int left;
    int right;
}Philostatus[n];

void goForDinner(int philID){
int otherFork; //same like threads concept here cases implemented
    if(Philostatus[philID].left==10 && Philostatus[philID].right==10)
printf("Philosopher %d completed his dinner\n",philID+1);
    //if already completed dinner
    else if(Philostatus[philID].left==1 && Philostatus[philID].right==1){
    //if just taken two forks
    printf("Philosopher %d completed his dinner\n",philID+1);

    Philostatus[philID].left = Philostatus[philID].right = 10; //remembering that he completed dinner by assigning value 10
     otherFork = philID-1;

    if(otherFork== -1)
otherFork=(n-1);

    ForkAvil[philID].taken = ForkAvil[otherFork].taken = 0; //releasing forks
    printf("Philosopher %d released fork %d and fork %d\n",philID+1,philID+1,otherFork+1);
    compltedPhilo++;
}
else if(Philostatus[philID].left==1 && Philostatus[philID].right==0){ //left already taken, trying for right fork
if(philID==(n-1)){
    if(ForkAvil[philID].taken==0){ //KEY POINT OF THIS PROBLEM, THAT LAST PHILOSOPHER TRYING IN reverse DIRECTION
ForkAvil[philID].taken = Philostatus[philID].right = 1;
printf("Fork %d taken by philosopher %d\n",philID+1,philID+1);
    }else{
printf("Philosopher %d is waiting for fork %d\n",philID+1,philID+1);
    }
}else{ //except last philosopher case
    int dupphilID = philID;
    philID-=1;

    if(philID== -1)
philID=(n-1);

    if(ForkAvil[philID].taken == 0){
ForkAvil[philID].taken = Philostatus[dupphilID].right = 1;
printf("Fork %d taken by Philosopher %d\n",philID+1,dupphilID+1);
    }else{
printf("Philosopher %d is waiting for Fork %d\n",dupphilID+1,philID+1);
    }
}
    }
    else if(Philostatus[philID].left==0){ //nothing taken yet
    if(philID==(n-1)){
if(ForkAvil[philID-1].taken==0){ //KEY POINT OF THIS PROBLEM, THAT LAST PHILOSOPHER TRYING IN reverse DIRECTION
    ForkAvil[philID-1].taken = Philostatus[philID].left = 1;
    printf("Fork %d taken by philosopher %d\n",philID,philID+1);
}else{
    printf("Philosopher %d is waiting for fork %d\n",philID+1,philID);
}
    }else{ //except last philosopher case
if(ForkAvil[philID].taken == 0){
    ForkAvil[philID].taken = Philostatus[philID].left = 1;
    printf("Fork %d taken by Philosopher %d\n",philID+1,philID+1);
}else{
    printf("Philosopher %d is waiting for Fork %d\n",philID+1,philID+1);
}
    }
}else{}
}

int main(){
clrscr();
    for(i=0;i<n;i++)
ForkAvil[i].taken=Philostatus[i].left=Philostatus[i].right=0;

    while(compltedPhilo<n){
/* Observe here carefully, while loop will run until all philosophers complete dinner
Actually problem of deadlock occur only thy try to take at same time
This for loop will say that they are trying at same time. And remaining status will print by go for dinner function
*/
for(i=0;i<n;i++)
    goForDinner(i);
printf("\nTill now num of philosophers completed dinner are %d\n\n",compltedPhilo);
    }
     getch();
    return 0;
}

Screenshot


No comments:

Post a Comment