C Programming Tutorial

 
 
 
 

Image

# include <stdio.h>
# include <math.h>
# include \"/usr/include/sys/types.h\"
# include \"/usr/include/sys/shm.h\"
# include \"/usr/include/sys/ipc.h\"
# include \"/usr/include/sys/sem.h\"
# include \"forkjoin.h\"
# include \"sharedlib.h\"
# include \"spinlock.h\"


int main()
{
    int arr[100];
    int arrSize;        //Size of array
    int iCount;        //Counter Variable
    int id;            //Process ID
    int nProc=3;        //number of Processes
        float sum=0;

    float *deviation,*avg;  // Shared Variables
    int *lock;        // Shared Variable for Spinlock

    int shmidavg,shmidlock,shmiddeviation;    // Shmid for Shared Variables

    printf(\"Enter the Size of an Array :\");
    scanf(\"%d\",&arrSize);

    for(iCount=0;iCount<arrSize;iCount++)
    {
        printf(\"Enter arr[%d] :\",iCount);
        scanf(\"%d\",&arr[iCount]);
    }

    /* Allocate Shared memory */
    avg=(float*)sshared(sizeof(float),&shmidavg);
    deviation=(float*)sshared(sizeof(float),&shmiddeviation);
    lock=(int*)sshared(sizeof(int),&shmidlock);

    spin_lock_init(lock);        // Spin Lock Initialization
    *avg=0;

    id=process_fork(nProc);        // Forking Processes


    /* Partial Sum using Loop Spliting */
    for(iCount=id;iCount<arrSize;iCount=iCount+nProc)
    {
        sum = sum + arr[iCount];
    }

    spin_lock(lock);
        /* Critical Region */
        *avg = *avg + ( sum /arrSize);    // Calculate Average from Partial Sums
    spin_unlock(lock);

    /*
    ---------------------------------------------------------------------------
    Barrier Should be here, So that all Processes have to wait until Final
    Average is Calculated.
    ---------------------------------------------------------------------------
    */

    sum=0;
    /* Calculate Sum(Xi - Mean) Using Loop Spliting */    
    for(iCount=id;iCount<arrSize;iCount=iCount+nProc)
    {        
        sum = sum + pow(((float)arr[iCount] - *avg),2);
    }

    spin_lock(lock);
        /* Critical Region */
        *deviation = *deviation + (sum / arrSize-1); // Calculate Final Deviation
    spin_unlock(lock);


    process_join(nProc,id);        // Joining the Process

    *deviation=sqrt(*deviation);
    printf(\"Deviation : %f\\n\",*deviation);

    /* Cleaning the Shared Region */
    cleanup_memory(&shmidavg);
    cleanup_memory(&shmidlock);
    cleanup_memory(&shmiddeviation);    
    return 0;
}