Banker's Algorithm in C

Implementation of bankers algorithm using C language, pthreads and mutex locks.


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define NUMBER_OF_RESOURCES 3
#define NUMBER_OF_CUSTOMERS 5
int i = 0;
int j = 0;
pthread_mutex_t mutex; //mutex lock to lock global variables
int initResourceVector [NUMBER_OF_RESOURCES];

//available, max, allocation, need
int available [NUMBER_OF_RESOURCES];
int allocation [NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES] = {{1,1,0},{1,3,0},{0,0,2},{0,1,1},{0,2,0}};
int max [NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES] = {{5,5,5},{3,3,6},{3,5,3},{7,1,4},{7,2,2}};
int need [NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES];

int requestResource(int processID,int request[]);
int releaseResource(int processID,int releaseVector[]);
int ifGreaterThanNeed(int processID,int request[]);
int ifEnoughToRelease(int processID,int releaseVector[]);
int ifInSafeMode();
int ifEnoughToAlloc();
void printNeed();
void printAllocation();
void printAvailable();
void printReqOrRelVector(int vec[]);
void *customer(void* customerID);

int main(int argc, char const *argv[])
{
            if(argc != NUMBER_OF_RESOURCES + 1)
            {
                        printf("Number of parameters is not correct.\n");
                        return -1;
            }
            for(i = 0; i < NUMBER_OF_RESOURCES; i++)
            {
                        //argv[0] is the name of the program
                        initResourceVector[i] = atoi(argv[i+1]);
                        available[i] = initResourceVector[i];
            }

            //initializing need matrix
            for (i = 0; i < NUMBER_OF_CUSTOMERS; ++i)
            {
                        for (j = 0; j < NUMBER_OF_RESOURCES; ++j)
                        {
                                    need[i][j] = max[i][j] - allocation[i][j];
                        }
            }

            printf("Available Vector is:\n");
            printAvailable();

            printf("Allocation Matrix is:\n");
            printAllocation();

            printf("Need Matrix is:\n");
            printNeed();

            pthread_mutex_init(&mutex,NULL);
            pthread_attr_t attrDefault;
            pthread_attr_init(&attrDefault);
            pthread_t *tid = malloc(sizeof(pthread_t) * NUMBER_OF_CUSTOMERS);

            int *pid = malloc(sizeof(int) * NUMBER_OF_CUSTOMERS); // process ID 

            //initialize pid and create pthreads
            for(i = 0; i < NUMBER_OF_CUSTOMERS; i++)
            {
                        *(pid + i) = i;
                        pthread_create((tid+i), &attrDefault, customer, (pid+i));
            }

            //join threads
            for(i = 0; i < NUMBER_OF_CUSTOMERS; i++)
            {
                        pthread_join(*(tid+i),NULL);
            }
            return 0;
}

void *customer(void* customerID)
{
            int processID = *(int*)customerID;
int c=0;
            while(c<3)
            {
                        //generate random requests
                        sleep(1);
                        int request[NUMBER_OF_RESOURCES];

                       
                        pthread_mutex_lock(&mutex);

                        //initialize need vector
                        for(i = 0; i < NUMBER_OF_RESOURCES; i++)
                        {
                                    if(need[processID][i] != 0)
                                    {
                                     request[i] = rand() % need[processID][i];
                                    }
                                    else
                                    {
                                                request[i] = 0;
                                    }
                        }


printf("Process %d is requiring resources:\n",processID);
                        printReqOrRelVector(request);

                        requestResource(processID,request);

pthread_mutex_unlock(&mutex);
           
//generate random release vector            
sleep(1);
int releaseVector[NUMBER_OF_RESOURCES];
                       
pthread_mutex_lock(&mutex);

//inicialize release vector
for(i = 0; i < NUMBER_OF_RESOURCES; i++)
{
if(allocation[processID][i] != 0)
            {
                        releaseVector[i] = rand() % allocation[processID][i];
            }
            else
            {
                        releaseVector[i] = 0;
            }
}


printf("Process %d is releasing resources:\n",processID);
                        printReqOrRelVector(releaseVector);
                       
releaseResource(processID,releaseVector);
//unlock
pthread_mutex_unlock(&mutex);

c++;
            }
}

int requestResource(int processID,int request[])
{
            if (ifGreaterThanNeed(processID,request) == -1)
            {
                        printf("Number of requested resources is more than needed.\n");
                        return -1;
            }
            printf("Resources are being allocated...\n");

            if(ifEnoughToAlloc(request) == -1)
            {
                        printf("Not enough resources.\n");
                        return -1;
            }

        
            for (i = 0; i < NUMBER_OF_RESOURCES; ++i)
            {
                        need[processID][i] -= request[i];
                        allocation[processID][i] += request[i];
                        available[i] -= request[i];
            }
            printf("Checking is the state is safe...\n");
           
            if (ifInSafeMode() == 0)
            {
                        printf("Safe Mode. Resources Allocated \n Matrica Available \n");
                        printAvailable();
                        printf("Matrica Allocated:\n");
                        printAllocation();
                        printf("Matrica Need:\n");
                        printNeed();
                        return 0;
            }
            else
            {           
                        printf("State is not safe.\n");
                        for (i = 0; i < NUMBER_OF_RESOURCES; ++i)
                        {
                                    need[processID][i] += request[i];
                                    allocation[processID][i] -= request[i];
                                    available[i] += request[i];
                        }
                   
                        return -1;
            }
}

int releaseResource(int processID,int releaseVector[])
{          

            if(ifEnoughToRelease(processID,releaseVector) == -1)
            {
                        printf("Not enought resources.\n");
                        return -1;
            }
            for(i = 0; i < NUMBER_OF_RESOURCES; i++)
            {
                        allocation[processID][i] -= releaseVector[i];
                        need[processID][i] += releaseVector[i];
                        available[i] += releaseVector[i];
            }
            printf("Released.\nMatrica Available:\n");
            printAvailable();
            printf("Matrica Allocated:\n");
            printAllocation();
            printf("Matrica Need:\n");
            printNeed();
            return 0;
}


int ifEnoughToRelease(int processID,int releaseVector[])
{          
            for (i = 0; i < NUMBER_OF_RESOURCES; ++i)
            {
                        if (releaseVector[i] <= allocation[processID][i])
                                    { continue; }
                        else
                                    { return -1;}
            }
            return 0;
}

int ifGreaterThanNeed(int processID,int request[])
{

            for (i = 0; i < NUMBER_OF_RESOURCES; ++i)
            {
                        if (request[i] <= need[processID][i])
                                    {  continue; }
                        else
                        { return -1; }
            }
            return 0;
}

int ifEnoughToAlloc(int request[])
{

            for (i = 0; i < NUMBER_OF_RESOURCES; ++i)
            {
                        if (request[i] <= available[i])
                                    { continue; }
                        else
                        { return -1; }
            }
            return 0;
}

void printNeed()
{
            for (i = 0; i < NUMBER_OF_CUSTOMERS; ++i)
            {
                        printf("{ ");
                        for (j = 0; j < NUMBER_OF_RESOURCES; ++j)
                        {
                                    printf("%d, ", need[i][j]);
                        }
                        printf("}\n");
            }
            return;
}

void printAllocation()
{
            for (i = 0; i < NUMBER_OF_CUSTOMERS; ++i)
            {
                        printf("{ ");
                        for (j = 0; j < NUMBER_OF_RESOURCES; ++j)
                        {
                                    printf("%d, ", allocation[i][j]);
                        }
                        printf("}\n");
            }
            return;
}

void printAvailable()
{
            for (i = 0; i < NUMBER_OF_RESOURCES; ++i)
            {
                        printf("%d, ",available[i]);
            }
            printf("\n");
            return;
}


void printReqOrRelVector(int vec[])
{
            for (i = 0; i < NUMBER_OF_RESOURCES; ++i)
            {
                        printf("%d, ",vec[i]);
            }
            printf("\n");
            return;
}


int ifInSafeMode()
{
            int finish[NUMBER_OF_CUSTOMERS] = {0};

            //inicialize Work=Available
            int work[NUMBER_OF_RESOURCES];

            for(i = 0; i < NUMBER_OF_RESOURCES; i++)
            {
                       work[i] = available[i];
            }

            int k;
            for(i = 0; i < NUMBER_OF_CUSTOMERS; i++)
            {
                        if (finish[i] == 0)
                        {
                                    for(j = 0; j < NUMBER_OF_RESOURCES; j++)
                                    {
                                                if(need[i][j] <= work[j])
                                                {
                                                            if(j == NUMBER_OF_RESOURCES – 1)                                                                                                            {
                                                                        finish[i] = 1;
                                                            for (k = 0; k < NUMBER_OF_RESOURCES; ++k)
                                                                        {
                                                                                    work[k] += allocation[i][k];
                                                                                 
                                                                        }
                                                                       
                                   
i = -1;
break;
            }
else
                        { continue; }
}
else
                        { break; }
}
}
else
{  continue; }
}
           
            for(i = 0; i < NUMBER_OF_CUSTOMERS; i++)
            {
                        if (finish[i] == 0)
                        {
                                    
                                    return -1;
                        }
                        else
                        { continue; }
            }
            
            return 0;

}

Comments

Popular posts from this blog

Configure IP address on Oracle Linux

Oracle Directory Object

CyclicRotation:Rotate an array to the right by a given number of steps.