Friday, April 4, 2014

Implement producer-consumer algorithm using multi-threading concept

SOFTWARE LABORATORY

 
Code :
#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<pthread.h>

pthread_mutex_t mutex;
sem_t full,empty;

int buffer[5],cnt=0,data;

int produce()
{
    if(cnt<5)
    {
        buffer[cnt]=rand();
        cnt++;
    }
    else
        return(0);
    return(1);
}
int consume()
{
    if(cnt>0)
    {
        data=buffer[cnt-1];
        cnt--;
    }
    else
        return(0);
    return(1);
}
void * producer(void * no)
{
    int flag=0;
    printf("\n\t$$Wake up call to producer %d $$",(int)no);
    sem_wait(&empty);
    printf("\n\t\tWait by producer %d ",(int)no);
    pthread_mutex_lock(&mutex);
    printf("\n\t\tproducer %d is in critical section",(int)no);
    flag=produce();
    if(flag)
        printf("\n\t\tProducer %d has produce item =   %d",(int)no,buffer[cnt-1]);
    else
        printf("\n\t\t*****Buffer is full wait*****");
    //sleep(1);
    pthread_mutex_unlock(&mutex);
    printf("\n\t\tproducer %d Leaving critical section....",(int)no);
    sem_post(&full);
    printf("\n\t$$Signal by produce %d $$\n",(int)no);
   
}

void * consumer(void * no)
{
    int flag=0;
    printf("\n\t$$Wake up call to consumer %d $$",(int)no);
    sem_wait(&full);
    printf("\n\t\tWait by consumer %d ",(int)no);
    pthread_mutex_lock(&mutex);
    printf("\n\t\tEntering %d consumer in critical section",(int)no);
    flag=consume();
    if(flag)
        printf("\n\t\tConsumer %d consumed data =   %d ",(int)no,data);
    else
        printf("\n\t\t*****Wait buffer is empty***** ");
    //sleep(1);
    printf("\n\t\tConsumer %d leaving critical section",(int)no);
    pthread_mutex_unlock(&mutex);
    sem_post(&empty);
    printf("\n\t$$Signal by consumer %d $$\n",(int)no);
}

int main()
{
    int pno,cno,i,ch;
    printf("\n\tEntre no of producer to be generate : ");
    scanf("%d",&pno);
    printf("\n\tEntre no of consumer to be generate : ");
    scanf("%d",&cno);

    pthread_t p[pno],c[cno];
    sem_init(&full,0,0);
    sem_init(&empty,0,5);
   
    for(i=0;i<pno;i++)
    {
        pthread_create(&p[i],NULL,producer,(void *)i);
        sleep(1);
    }
    for(i=0;i<cno;i++)
    {
        pthread_create(&c[i],NULL,consumer,(void *)i);
        sleep(1);
    }

    sleep(5);
    printf("\n\t****FINISH****\n");
   
}
/*        op
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/producer consumer# gcc prcn.c -lpthread
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/producer consumer# ./a.out

    Entre no of producer to be generate : 3

    Entre no of consumer to be generate : 5

    $$Wake up call to producer 0 $$
        Wait by producer 0
        producer 0 is in critical section
        Producer 0 has produce item =   1804289383
        producer 0 Leaving critical section....
    $$Signal by produce 0 $$

    $$Wake up call to producer 1 $$
        Wait by producer 1
        producer 1 is in critical section
        Producer 1 has produce item =   846930886
        producer 1 Leaving critical section....
    $$Signal by produce 1 $$

    $$Wake up call to producer 2 $$
        Wait by producer 2
        producer 2 is in critical section
        Producer 2 has produce item =   1681692777
        producer 2 Leaving critical section....
    $$Signal by produce 2 $$

    $$Wake up call to consumer 0 $$
        Wait by consumer 0
        Entering 0 consumer in critical section
        Consumer 0 consumed data =   1681692777
        Consumer 0 leaving critical section
    $$Signal by consumer 0 $$

    $$Wake up call to consumer 1 $$
        Wait by consumer 1
        Entering 1 consumer in critical section
        Consumer 1 consumed data =   846930886
        Consumer 1 leaving critical section
    $$Signal by consumer 1 $$

    $$Wake up call to consumer 2 $$
        Wait by consumer 2
        Entering 2 consumer in critical section
        Consumer 2 consumed data =   1804289383
        Consumer 2 leaving critical section
    $$Signal by consumer 2 $$

    $$Wake up call to consumer 3 $$
    $$Wake up call to consumer 4 $$
    ****FINISH****
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/producer consumer#

*/

Write a program to implement Banker’s Algorithm


SOFTWARE LABORATORY

Code :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int avilable[20];
int max[20][20];
int allocation[20][20];
int need[20][20];

int main()
{
    int n,m,i,j,cntr=0,allow=0,no,req1,req2,req3;
    int flag[20]={0},f=0;
    printf("\n\tEnter number of processes : ");
    scanf("%d",&n);
    printf("\n\tEnter number of Resources : ");
    scanf("%d",&m);
   
    printf("\nEnter allocation matrix : \n\t");
   
    for(i=0;i<n;i++)
    {
        printf("\n\t");
        for(j=0;j<m;j++)
        {
            scanf("%d",&allocation[i][j]);
        }
    }

    printf("\nEnter MAX matrix : \n\t");
   
    for(i=0;i<n;i++)
    {
        printf("\n\t");
        for(j=0;j<m;j++)
        {
            scanf("%d",&max[i][j]);
        }
    }

    printf("\n\tEnter Available : ");
    for(i=0;i<m;i++)
    {
        printf("\n\tEnter available value of resource %d : ",i);
        scanf("%d",&avilable[i]);
    }
    printf("\n\t Calculating need....");
   
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            need[i][j]=max[i][j]-allocation[i][j];
        }
    }
   
    printf("\n\tNeed calculation completed...");
    cntr=0;
    while(1)
    {
    for(i=0;i<n;i++)
    {
        allow=0;
        for(j=0;j<m;j++)
        {
        if(need[i][j]<= avilable[j]&&flag[i]==0)
            allow=1;
        else
        {
            break;
        }
        }
           
        if(allow==1)
        {
            printf("\n\t***process P%d is safe***",i);
            avilable[0]+=allocation[i][0];
            avilable[1]+=allocation[i][1];
            avilable[2]+=allocation[i][2];
            flag[i]=1;
            cntr++;
        }
    }
    if(cntr==n)
        break;
    }
   
    //Resource Request Allocation
    while(1)
    {
    printf("\nEnter Requested process : ");
    scanf("%d",&no);
    printf("\nEnter Requested resources : ");
    scanf("%d%d%d",&req1,&req2,&req3);
    if(req1<=need[no][0]&&req2<need[no][1]&&req3<need[no][2])
        if(req1< avilable[0]&&req2<avilable[1]&&req3< avilable[2])
        {
            printf("\n\t!!!!Granted requested!!!!!");
            avilable[0]=avilable[0]-req1;
            avilable[1]=avilable[1]-req2;
            avilable[2]=avilable[2]-req3;
            allocation[no][0]=allocation[no][0]+req1;
            allocation[no][1]=allocation[no][1]+req2;
            allocation[no][2]=allocation[no][2]+req3;
            need[no][0]=need[no][0]-req1;
            need[no][1]=need[no][1]-req2;
            need[no][2]=need[no][2]-req3;
        }
        else
            printf("\n!!!Process p %d must be waited!!!",no);
    else
        printf("\n\t ***Error...exceding request allocation ***");

    printf("\n\tDou want to continue(YES=1/No=0) : ");
    scanf("%d",&f);
    if(f==0)
        break;
    }       
}
/*        OUTPUT
prashant@prashant-OptiPlex-755:~$ gcc bank.c
prashant@prashant-OptiPlex-755:~$ ./a.out

    Enter number of processes : 5

    Enter number of Resources : 3

Enter allocation matrix :
   
    0 1 0

    2 0 0

    3 0 2

    2 1 1

    0 0 2

Enter MAX matrix :
   
    7 5 3

    3 2 2

    9 0 2

    2 2 2

    4 3 3

    Enter Available :
    Enter available value of resource 0 : 3

    Enter available value of resource 1 : 3

    Enter available value of resource 2 : 2

     Calculating need....
    Need calculation completed...
    ***process P1 is safe***
    ***process P3 is safe***
    ***process P4 is safe***
    ***process P0 is safe***
    ***process P2 is safe***
Enter Requested process : 0

Enter Requested resources : 1 1 1

    !!!!Granted requested!!!!!
    Dou want to continue(YES=1/No=0) : 1

Enter Requested process : 2

Enter Requested resources : 1 1 1

     ***Error...exceding request allocation ***
    Dou want to continue(YES=1/No=0) : 1

Enter Requested process : 1

Enter Requested resources : 1 0 0

    !!!!Granted requested!!!!!
    Dou want to continue(YES=1/No=0) : 0
prashant@prashant-OptiPlex-755:~$
*/

Write a program to implement Reader-writer problem using mutex/ semaphore


SOFTWARE LABORATORY

Code :
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>

int data=0,rdcnt=0;
sem_t mutex,writeblock;
void * reader(void * no)
{
    printf("\n\tReader %d is executing ",(int)no);
    sem_wait(&mutex);
    printf("\n\tWait  to mutex by %d reader",(int)no);
    rdcnt++;
    if(rdcnt==1)
    {
        sem_wait(&writeblock);
        printf("\n\tWait  to writerblock by %d reader",(int)no);
    }
    //sleep(2);
    printf("\n\t***Reader %d read data = %d ",(int)no,data);
    if(rdcnt==1)
    {
        sem_post(&writeblock);
        printf("\n\tSignal to writerblock by %d reader",(int)no);
    }
    sem_post(&mutex);
    printf("\n\tSignal to mutex by %d reader\n",(int)no);
}
void * writer(void * no)
{
    printf("\n\tWriter %d is executing ",(int)no);
    sem_wait(&writeblock);
    printf("\n\tWait  to writerblock by %d writer",(int)no);
    //sleep(2);
    data+=5;
    printf("\n\t***Writer %d write data = %d ",(int)no,data);
    sem_post(&writeblock);
    printf("\n\tSignal to writer by %d writer\n",(int)no);
}
int main()
{
    int no,i,ir=0,iw=0,ch;
    sem_init(&mutex,0,1);
    sem_init(&writeblock,0,1);
    printf("\nEnter no of readers and writers to create : ");
    scanf("%d",&no);
   
    pthread_t r[no],w[no];
   
   
    /*for(i=0;i<no;i++)
    {
        pthread_create(&r[i],NULL,reader,(void *)i);
        pthread_create(&w[i],NULL,writer,(void *)i);
    }*/
   
    /*for(i=0;i<no;i++)
    {
        pthread_join(r[i],NULL);
        pthread_join(w[i],NULL);
    }*/
    do
    {
        printf("\n\t1.Reader\n\t2.Writer\n\t3.terminate\n\tYour choice : ");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1: pthread_create(&r[ir],NULL,reader,(void *)ir);
                    pthread_join(r[ir++],NULL);
                    break;
            case 2: pthread_create(&w[iw],NULL,writer,(void *)iw);
                    pthread_join(w[iw++],NULL);
                    break;
        }
    }while(ch!=3);
   
    sem_destroy(&mutex);
    sem_destroy(&writeblock);
}


OUTPUT :

use -lpthread while compiling .. see following lines

root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/reader writer# gcc rdwr.c -lpthread
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/reader writer# ./a.out

Enter no of readers and writers to create : 2

    1.Reader
    2.Writer
    3.terminate
    Your choice : 1

    Reader 0 is executing
    Wait  to mutex by 0 reader
    Wait  to writerblock by 0 reader
    ***Reader 0 read data = 0
    Signal to writerblock by 0 reader
    Signal to mutex by 0 reader

    1.Reader
    2.Writer
    3.terminate
    Your choice : 2

    Writer 0 is executing
    Wait  to writerblock by 0 writer
    ***Writer 0 write data = 5
    Signal to writer by 0 writer

    1.Reader
    2.Writer
    3.terminate
    Your choice : 3
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/reader writer#

Write a program to implement following scheduling algorithms: 1. Least Recently Used 2. Optimal page replacement

SOFTWARE LABORATORY


CODE :
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int rs[20],fsz,no,hit=0,miss=0,fr[20],lru=0,used[20]={0},max;
    int i,j,k,ch;
    do{
    printf("\n\t1.LRU\n\t2.Optimal\n\t3.Exit\n\tEnter choice : ");
    scanf("%d",&ch);
    switch(ch)
    {
        case 1:
                printf("\n\tEnter size of reference string : ");
                scanf("%d",&no);
                printf("\n\tEnter String : ");
                for(i=0;i<no;i++)
                    scanf("%d",&rs[i]);
                printf("\n\tEnter frame size : ");
                scanf("%d",&fsz);
                for(i=0;i<fsz;i++)
                    fr[i]=-1;
                for(i=0;i<no;i++)
                {
                    for(j=0;j<fsz;j++)
                    {
                        if(fr[j]==rs[i])
                        {
                            hit++;
                            printf("\n\t***Page hit ***: Frame = ");
                                for(k=0;k<fsz;k++)
                                    printf(" %d ",fr[k]);
                            break;
                        }
                    }
                    if(j==fsz)
                    {
                      
                        for(j=0;j<fsz;j++)
                        {
                            if(fr[j]==-1)
                            {
                                miss++;
                                fr[j]=rs[i];
                                printf("\n\tPage miss : Frame = ");
                                for(k=0;k<fsz;k++)
                                    printf(" %d ",fr[k]);
                                break;
                            }
                        }
                      
                    }
                    if(j==fsz)
                    {
                        miss++;
                        printf("\n\tPage miss : Frame Before = ");
                        for(k=0;k<fsz;k++)
                        {
                            printf(" %d ",fr[k]);
                            used[k]=0;
                            for(j=i-1;j<0;j--)
                            {
                                if(fr[k]==rs[j])
                                    break;
                                used[k]++;
                            }
                        }
                        max=0;
                        for(j=0;j<fsz;j++)
                        {
                            if(max<used[j])
                            {
                                    max=used[j];
                                    lru=j;
                            }
                        }
                        fr[lru]=rs[i];
                        printf("\tAfter = ");
                        for(k=0;k<fsz;k++)
                            printf(" %d ",fr[k]);
                    }
                }
                printf("\n\t No of miss = %d and no of hit = %d ",miss,hit);
                break;
        case 2:
                printf("\n\tEnter size of reference string : ");
                scanf("%d",&no);
                printf("\n\tEnter String : ");
                for(i=0;i<no;i++)
                    scanf("%d",&rs[i]);
                printf("\n\tEnter frame size : ");
                scanf("%d",&fsz);
                for(i=0;i<fsz;i++)
                    fr[i]=-1;
                hit=miss=0;
                for(i=0;i<no;i++)
                {
                    for(j=0;j<fsz;j++)
                    {
                        if(fr[j]==rs[i])
                        {
                            hit++;
                            printf("\n\t***Page hit ***: Frame = ");
                                for(k=0;k<fsz;k++)
                                    printf(" %d ",fr[k]);
                            break;
                        }
                    }
                    if(j==fsz)
                    {
                      
                        for(j=0;j<fsz;j++)
                        {
                            if(fr[j]==-1)
                            {
                                miss++;
                                fr[j]=rs[i];
                                printf("\n\tPage miss : Frame = ");
                                for(k=0;k<fsz;k++)
                                    printf(" %d ",fr[k]);
                                break;
                            }
                        }
                      
                    }
                    if(j==fsz)
                    {
                        miss++;
                        printf("\n\tPage miss : Frame Before = ");
                        for(k=0;k<fsz;k++)
                        {
                            printf(" %d ",fr[k]);
                            used[k]=0;
                            for(j=i+1;j<no;j++)
                            {
                                if(fr[k]==rs[j])
                                    break;
                                used[k]++;
                            }
                        }
                        max=0;
                        for(j=0;j<fsz;j++)
                        {
                            if(max<used[j])
                            {
                                    max=used[j];
                                    lru=j;
                            }
                        }
                        fr[lru]=rs[i];
                        printf("\tAfter = ");
                        for(k=0;k<fsz;k++)
                            printf(" %d ",fr[k]);
                    }
                }
                printf("\n\t No of miss = %d and no of hit = %d ",miss,hit);
                break;
    }
    }while(ch!=3);
   
}

OUTPUT :

root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/cpu scheduling# cd ..
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs# cd page\ replacement/
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/page replacement# gcc p_pr.croot@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/page replacement# ./a.out

    1.LRU
    2.Optimal
    3.Exit
    Enter choice : 1

    Enter size of reference string : 5

    Enter String : 2 3 2 1 4

    Enter frame size : 2

    Page miss : Frame =  2  -1
    Page miss : Frame =  2  3
    ***Page hit ***: Frame =  2  3
    Page miss : Frame Before =  2  3     After =  1  3
    Page miss : Frame Before =  1  3     After =  4  3
     No of miss = 4 and no of hit = 1
    1.LRU
    2.Optimal
    3.Exit
    Enter choice : 2

    Enter size of reference string : 10

    Enter String : 1 3 2 4 5 7 2 5 3 1

    Enter frame size : 3

    Page miss : Frame =  1  -1  -1
    Page miss : Frame =  1  3  -1
    Page miss : Frame =  1  3  2
    Page miss : Frame Before =  1  3  2     After =  4  3  2
    Page miss : Frame Before =  4  3  2     After =  5  3  2
    Page miss : Frame Before =  5  3  2     After =  5  7  2
    ***Page hit ***: Frame =  5  7  2
    ***Page hit ***: Frame =  5  7  2
    Page miss : Frame Before =  5  7  2     After =  3  7  2
    Page miss : Frame Before =  3  7  2     After =  1  7  2
     No of miss = 8 and no of hit = 2
    1.LRU
    2.Optimal
    3.Exit
    Enter choice : 3
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/page replacement# 

First Come First Serve, Shortest Job First (Preemptive), Priority/Round-Robin (Non- Preemptive).

SOFTWARE LABORATORY


Code :
#include<stdio.h>

struct templet
{
    char name[8];
    int at,st,pt,ft,tat,wt,priority,remain,flag;
}p[20],temp;

void fcfs();
void sjf();
void rr();
void prio();
int main()
{
    int ch;
    do{
    printf("\n\t1.FCFS\n\t2.SJF\n\t3.Round Robin\n\t4.Priority\n\t5.exit");
    printf("\n\tEnter choice : ");
    scanf("%d",&ch);
    switch(ch)
    {
        case 1:fcfs();
                break;
        case 2:sjf();
                break;
        case 3: rr();
                break;
        case 4: prio();
                break;
    }}while(ch!=5);
}
void fcfs()
{
    int no,i,j,fcnt=0,scnt=0;
    printf("\n\tEnter no of processes : ");
    scanf("%d",&no);
    for(i=0;i<no;i++)
    {
        printf("\n\tEnter process name : ");
        scanf("%s",p[i].name);
        printf("\n\tEnter Burst time : ");
        scanf("%d",&p[i].pt);
    }
    printf("\n\t Grant Chart : \n\t\t");
    for(i=0;i<no;i++)
    {
        p[i].st=fcnt;
        fcnt+=p[i].pt;
        p[i].wt=fcnt-p[i].pt;
        p[i].tat=fcnt;
        printf("%s -->",p[i].name);
    }
    printf("Finish");
    fcnt=0;
    printf("\n\tProcess \t burst time \t waiting time \t turn around time");
    for(i=0;i<no;i++)
    {
        printf("\n\t%s\t\t\t%d\t\t%d\t \t%d",p[i].name,p[i].pt,p[i].wt,p[i].tat);
        fcnt+=p[i].wt;
        scnt+=p[i].tat;
    }
    printf("\n\n\t\t\t\tAverage : \t %d\t   \t%d",fcnt/no,scnt/no);
}
void sjf()
{
    int no,i,j,fcnt=0,scnt=0;
    printf("\n\tEnter no of processes : ");
    scanf("%d",&no);
    for(i=0;i<no;i++)
    {
        printf("\n\tEnter process name : ");
        scanf("%s",p[i].name);
        printf("\n\t Enter Arrival time : ");
        scanf("%d",&p[i].at);
        printf("\n\tEnter Burst time : ");
        scanf("%d",&p[i].pt);
        p[i].remain=p[i].pt;
        p[i].flag=0;
    }
    for(i=0;i<no;i++)
    {
        for(j=0;j<no;j++)
        {
            if(p[i].at<p[j].at)
            {
                temp=p[i];
                p[i]=p[j];
                p[j]=temp;
            }
        }
    }
    printf("\n\t Grant Chart : \n\t\t");
   
    i=0;
    scnt=p[i].at;
    while(1)
    {
        if(p[i].flag==0)
        {
            printf("%s ",p[i].name);
            p[i].remain--;
            scnt++;
            if(p[i].remain>0)
            {
                for(j=0;j<no;j++)
                {
                    if(p[j].at<=scnt && p[j].flag==0)
                    {
                        if(p[i].remain>p[j].remain)
                        {
                            i=j;
                            printf("- ");
                        }
                    }
                }
            }
            else
            {
                p[i].wt=scnt-p[i].pt-p[i].at;
                p[i].tat=scnt-p[i].at;
                p[i].flag=1;
                fcnt++;
                printf("+");
                if(fcnt==no)
                    break;
                if(i<no-1)
                    i++;
                else
                    i=0;
                for(j=i;j>0;j--)
                        if(p[j].remain < p[i].remain && p[j].flag==0)
                            i=j;
            }
        }
        else
            i++;
    }
   
    printf("Finish");
    fcnt=0,scnt=0;
    printf("\n\tProcess \t burst time \t waiting time \t turn around time");
    for(i=0;i<no;i++)
    {
        printf("\n\t%s\t\t\t%d\t\t%d\t \t%d",p[i].name,p[i].pt,p[i].wt,p[i].tat);
        fcnt+=p[i].wt;
        scnt+=p[i].tat;
    }
    printf("\n\n\t\t\t\tAverage : \t %d\t   \t%d",fcnt/no,scnt/no);
}

void rr()
{
    int no,i,j,fcnt=0,scnt=0,interval;
    printf("\n\tEnter no of processes : ");
    scanf("%d",&no);
    for(i=0;i<no;i++)
    {
        printf("\n\tEnter process name : ");
        scanf("%s",p[i].name);
        printf("\n\tEnter Burst time : ");
        scanf("%d",&p[i].pt);
        p[i].remain=p[i].pt;
        p[i].flag=0;
    }
    printf("\n\t Enter interval  : ");
    scanf("%d",&interval);
   
    printf("\n\t Grant Chart : \n\t\t");
   
    i=0;
    while(1)
    {
        for(i=0;i<no;i++)
        {
        if(p[i].flag==0)
        {
            if(p[i].remain<=interval)
            {
                printf("-- %s (C)--",p[i].name);
                scnt+=p[i].remain;
                p[i].wt=scnt-p[i].pt;
                p[i].tat=scnt;
                p[i].flag=1;
                fcnt++;
            }
            else
            {
                printf("-- %s --",p[i].name);
                p[i].remain-=interval;
                scnt+=interval;
            }
        }
        }
        if(fcnt==no)
            break;
    }
   
    printf("Finish");
    fcnt=0,scnt=0;
    printf("\n\tProcess \t burst time \t waiting time \t turn around time");
    for(i=0;i<no;i++)
    {
        printf("\n\t%s\t\t\t%d\t\t%d\t \t%d",p[i].name,p[i].pt,p[i].wt,p[i].tat);
        fcnt+=p[i].wt;
        scnt+=p[i].tat;
    }
    printf("\n\n\t\t\t\tAverage : \t %d\t   \t%d",fcnt/no,scnt/no);
}

void prio()
{
    int no,i,j,fcnt=0,scnt=0;
    printf("\n\tEnter no of processes : ");
    scanf("%d",&no);
    for(i=0;i<no;i++)
    {
        printf("\n\tEnter process name : ");
        scanf("%s",p[i].name);
        printf("\n\tEnter Burst time : ");
        scanf("%d",&p[i].pt);
        printf("\n\tEnter priority : ");
        scanf("%d",&p[i].priority);
    }
    for(i=0;i<no;i++)
    {
        for(j=0;j<no;j++)
        {
            if(p[i].priority<p[j].priority)
            {
                temp=p[i];
                p[i]=p[j];
                p[j]=temp;
            }
        }
    }
    printf("\n\t Grant Chart : \n\t\t");
    for(i=0;i<no;i++)
    {
        p[i].st=fcnt;
        fcnt+=p[i].pt;
        p[i].wt=fcnt-p[i].pt;
        p[i].tat=fcnt;
        printf("%s -->",p[i].name);
    }
    printf("Finish");
    fcnt=0;
    printf("\n\tProcess \t burst time \t waiting time \t turn around time");
    for(i=0;i<no;i++)
    {
        printf("\n\t%s\t\t\t%d\t\t%d\t \t%d",p[i].name,p[i].pt,p[i].wt,p[i].tat);
        fcnt+=p[i].wt;
        scnt+=p[i].tat;
    }
    printf("\n\n\t\t\t\tAverage : \t %d\t   \t%d",fcnt/no,scnt/no);
}

OUTPUT:
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs# cd cpu\ scheduling/
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/cpu scheduling# gcc p_pr1.c
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/cpu scheduling# ./a.out

    1.FCFS
    2.SJF
    3.Round Robin
    4.Priority
    5.exit
    Enter choice : 1

    Enter no of processes : 4

    Enter process name : p1

    Enter Burst time : 30

    Enter process name : p2

    Enter Burst time : 40

    Enter process name : p3

    Enter Burst time : 2

    Enter process name : p4

    Enter Burst time : 15

     Grant Chart :
        p1 -->p2 -->p3 -->p4 -->Finish
    Process      burst time      waiting time      turn around time
    p1            30        0         30
    p2            40        30         70
    p3            2        70         72
    p4            15        72         87

                Average :      43           64
    1.FCFS
    2.SJF
    3.Round Robin
    4.Priority
    5.exit
    Enter choice : 2

    Enter no of processes : 4

    Enter process name : p1

     Enter Arrival time : 3

    Enter Burst time : 50

    Enter process name : p2

     Enter Arrival time : 1

    Enter Burst time : 10

    Enter process name : p3

     Enter Arrival time : 15

    Enter Burst time : 12

    Enter process name : p4

     Enter Arrival time : 10

    Enter Burst time : 30

     Grant Chart :
        p2 p2 p2 p2 p2 p2 p2 p2 p2 p2 +p1 - p4 p4 p4 - p3 p3 p3 p3 p3 p3 p3 p3 p3 p3 p3 p3 +p1 - p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 p4 + +Finish
    Process      burst time      waiting time      turn around time
    p2            10        0         10
    p1            50        0         30
    p4            30        15         45
    p3            12        0         12

                Average :      3           24
    1.FCFS
    2.SJF
    3.Round Robin
    4.Priority
    5.exit
    Enter choice : 3

    Enter no of processes : 3

    Enter process name : p1

    Enter Burst time : 10

    Enter process name : p2

    Enter Burst time : 30

    Enter process name : p3

    Enter Burst time : 20

     Enter interval  : 10

     Grant Chart :
        -- p1 (C)---- p2 ---- p3 ---- p2 ---- p3 (C)---- p2 (C)--Finish
    Process      burst time      waiting time      turn around time
    p1            10        0         10
    p2            30        30         60
    p3            20        30         50

                Average :      20           40
    1.FCFS
    2.SJF
    3.Round Robin
    4.Priority
    5.exit
    Enter choice : 4

    Enter no of processes : 3

    Enter process name : p1

    Enter Burst time : 20

    Enter priority : 0

    Enter process name : p2

    Enter Burst time : 10

    Enter priority : 5

    Enter process name : p3

    Enter Burst time : 40

    Enter priority : 1

     Grant Chart :
        p1 -->p3 -->p2 -->Finish
    Process      burst time      waiting time      turn around time
    p1            20        0         20
    p3            40        20         60
    p2            10        60         70

                Average :      26           50
    1.FCFS
    2.SJF
    3.Round Robin
    4.Priority
    5.exit
    Enter choice : 5
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/cpu scheduling#

Write a program for pass-II of a two-pass macro-processor. The output of assignment-3 (MNT, MDT and file without any macro definitions) should be input for this assignment


SOFTWARE LABORATORY

First of all we will require ala.txt , mnt.txt , mdt.txt , output.txt generated by macro pass I . Put all this file in same folder where MII.c will be

To see more about mnt.txt , mdt.txt,ala.txt and output.txt visit this link

code for MII.c

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

struct mdtab
{
    char def[40];
}mdt[20];
struct mntab
{
    char name[8];
    int address,argcnt;
}mnt[5];
struct ALA
{
    char formal[10];
    char actual[10];
}ala[20];
int imnt=0,imdt=0,iala=0;

int main()
{
    FILE * fp;
    char buffer[40],s1[10],s2[10],s3[16],s4[16];
    char ap1[8],ap2[8],ap3[8];
    int i,j,k,cnt;
    fp=fopen("mdt.txt","r");
    while(fgets(buffer,40,fp)!=0)
    {
        strcpy(mdt[imdt++].def,buffer);
    }
    fclose(fp);
    fp=fopen("mnt.txt","r");
    while(fgets(buffer,40,fp)!=0)
    {
        sscanf(buffer,"%s%s%s",s1,s2,s3);
        strcpy(mnt[imnt].name,s1);
        mnt[imnt].address=atoi(s2);
        mnt[imnt++].argcnt=atoi(s3);
    }
    fclose(fp);
    fp=fopen("ala.txt","r");
    while(fgets(buffer,40,fp)!=0)
    {
        sscanf(buffer,"%s%s",s1,s2);
        strcpy(ala[iala].formal,s1);
        strcpy(ala[iala++].actual,s2);
    }
    fclose(fp);
   
    fp=fopen("output.txt","r");
    while(fgets(buffer,40,fp)!=0)
    {
        for(j=0;j<strlen(buffer);j++)
                if(buffer[j]==',')
                    buffer[j]=' ';
        sscanf(buffer,"%s%s%s%s",s1,s2,s3,s4);
        i=(s1[1]-65)%5;
        if(strcmp(mnt[i].name,s1)==0)
        {
            //printf("\nMacro call..... %s",buffer);
            i=mnt[i].address;
            sscanf(mdt[i++].def,"%s%s%s%s",s1,s2,s3,s4);
            //printf("\n\t\t %s %d %d %d",s1,atoi(s2),atoi(s3),atoi(s4));
            printf("\n\t %s ",buffer);
            cnt=sscanf(buffer,"%s%s%s%s",s1,ap1,ap2,ap3);
            //printf("\nAfter scan %s %s %s %s",s1,ap1,ap2,ap3);
            if(cnt>1)
                strcpy(ala[atoi(s2)].actual,ap1);
            if(cnt>2)
                strcpy(ala[atoi(s3)].actual,ap2);
            if(cnt>3)
                strcpy(ala[atoi(s4)].actual,ap3);
            while(1)
            {
                sscanf(mdt[i++].def,"%s%s%s",s1,s2,s3);
                if(strcmp(s1,"MEND")==0)
                    break;
                printf("\n\t+%s",s1);
                printf("\t%s\t%s",ala[atoi(s2)].actual,ala[atoi(s3)].actual);
            }
        }
        else
            printf("\n\t %s ",buffer);
    }
    fclose(fp);
    return(0);
}

Design suitable data structures and implement pass-I of a two-pass macro-processor.

SOFTWARE LABORATORY

First of all you will need a.asm file in same folder where your maro pass I program will be

a.asm
 
MACRO
INCR &X,&Y,&REG1=AREG
MOVER &REG1,&X
ADD &REG1,&Y
MOVEM &REG1,&X
MEND
MACRO
DECR &A,&B,&REG2=BREG
MOVER &REG2,&A
SUB &REG2,&B
MOVEM &REG2,&A
MEND
START 100
READ N1
READ N2
DECR N1,N2
STOP
N1 DS 1
N2 DS 2
END

now actual code :

MI.c


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

struct mntab
{
    char name[8];
    int address;
    int argcnt;
} mnt[5];

struct mdtab
{
    char def[40];
}mdt[20];

struct ALA
{
    char formal[10];
    char actual[10];
    char keyword[10];
}ala[20];

int imdt=0;
int imnt=0;
int iala=0;
int main()
{
    char fname[10],buffer[80],s1[8],s2[8],s3[16],s4[16],ref[10];
    int i,j,k,cnt,flag;
    FILE * fin,*fout,*fmnt,*fmdt,*fala;
    printf("\n\t Enter File Name (for Input code ) : ");
    scanf("%s",fname);
    fin= fopen(fname,"r");
    fout= fopen("output.txt","w+");
   
    while(fgets(buffer,40,fin)!=0)
    {
        cnt=sscanf(buffer,"%s%s%s%s",s1,s2,s3,s4);
        if(strcmp(s1,"MACRO")!=0)
            fputs(buffer,fout);
        else
        {
            printf("\n\tMacro fond...");
            printf("\n\tProcessing macro name table  ");
            fgets(buffer,40,fin);
            for(i=0;i<40;i++)
                if(buffer[i]==',')
                    buffer[i]=' ';
            cnt=sscanf(buffer,"%s%s%s%s",s1,s2,s3,s4);
            i=(s1[1]-65)%5;
            strcpy(mnt[i].name,s1);
            mnt[i].address=imdt;
            mnt[i].argcnt=cnt-1;
            printf("\n\tProcessing Argument List ");
           
            if(cnt>1)
            {
                j=(s2[1]-65)%20;
                strcpy(ala[j].formal,s2);
            }
            if(cnt>2)
            {
                flag=0;
                j=(s3[1]-65)%20;
                for(i=0;i<16;i++)
                {
                    if(s3[i]=='=')
                    {
                        s3[i]=' ';
                        sscanf(s3,"%s%s",ref,s3);
                        flag=1;
                        break;
                    }
                }
                if(flag==1)
                {
                    strcpy(ala[j].formal,ref);
                    strcpy(ala[j].actual,s3);
                }
                else
                    strcpy(ala[j].formal,s3);
            }
            if(cnt>3)
            {
                flag=0;
                j=(s4[1]-65)%20;
                for(i=0;i<16;i++)
                {
                    if(s4[i]=='=')
                    {
                        s4[i]=' ';
                        sscanf(s4,"%s%s",ref,s4);
                        flag=1;
                        break;
                    }
                }
                if(flag==1)
                {
                    strcpy(ala[j].formal,ref);
                    strcpy(ala[j].actual,s4);
                }
                else
                    strcpy(ala[j].formal,s4);
            }
            printf("\n\tProcessing macro defination table....");
            sscanf(buffer,"%s%s%s%s",s1,s2,s3,s4);
            i=(s2[1]-65)%20;
            j=(s3[1]-65)%20;
            k=(s4[1]-65)%20;
            sprintf(buffer,"%s %d %d %d",s1,i,j,k);
            strcpy(mdt[imdt++].def,buffer);
            printf("\n\t %d ",imdt);
            while(1)
            {
                flag=0;
                strcpy(s1,"");
                strcpy(s2,"");
                strcpy(s3,"");
                strcpy(s4,"");
                fgets(buffer,40,fin);
                for(i=0;i<40;i++)
                    if(buffer[i]==',')
                        buffer[i]=' ';
                sscanf(buffer,"%s%s%s",s1,s2,s3);
                if(s2[0]=='&')
                {
                    j=((s2[1]-65)%20);
                    flag=1;
                    sprintf(buffer,"%s %d %s",s1,j,s3);
                }
                if(s3[0]=='&')
                {
                    k=((s3[1]-65)%20);
                    if(flag==1)
                        sprintf(buffer,"%s %d %d",s1,j,k);
                    else
                        sprintf(buffer,"%s %s %d",s1,s2,k);
                }
                if(strcmp(s1,"MEND")!=0)
                    strcpy(mdt[imdt++].def,buffer);
                else
                {
                    strcpy(mdt[imdt++].def,"MEND");
                    break;
                }
            }
        }
    }
    fseek(fin,0,0);
    fseek(fout,0,0);

    printf("\n\t====IP====");
    while(fgets(buffer,40,fin)!=0)
        puts(buffer);
    fclose(fin);
    printf("\n\t====OP of pass I ====");
    while(fgets(buffer,40,fout)!=0)
        puts(buffer);
    fclose(fout);
    fmnt= fopen("mnt.txt","w");
    printf("\n\t==== MNT ====");
    for(i=0;i<5;i++)
    {
        printf("\n\t %s\t%d\t%d",mnt[i].name,mnt[i].address,mnt[i].argcnt);
        fprintf(fmnt,"%s\t%d\t%d\n",mnt[i].name,mnt[i].address,mnt[i].argcnt);
    }
    fclose(fmnt);
    fmdt= fopen("mdt.txt","w");
    printf("\n\t==== MDT ====");
    for(i=0;i<imdt;i++)
    {
        printf("\n%d\t%s",i,mdt[i].def);
        fprintf(fmdt,"%s\n",mdt[i].def);
    }
    fclose(fmdt);
    fala= fopen("ala.txt","w");
    printf("\n\t==== ALA ====");
    for(i=0;i<20;i++)
    {
        printf("\n\t%s\t%s",ala[i].formal,ala[i].actual);
        fprintf(fala,"\t%s\t%s\n",ala[i].formal,ala[i].actual);
    }
    fclose(fala);
}


Execute it :


root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/macro I# gcc MI.c
root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/macro I# ./a.out

     Enter File Name (for Input code ) : a.asm

    Macro fond...
    Processing macro name table 
    Processing Argument List
    Processing macro defination table....
     1
    Macro fond...
    Processing macro name table 
    Processing Argument List
    Processing macro defination table....
     6
    ====IP====MACRO

INCR &X,&Y,&REG1=AREG

MOVER &REG1,&X

ADD &REG1,&Y

MOVEM &REG1,&X

MEND

MACRO

DECR &A,&B,&REG2=BREG

MOVER &REG2,&A

SUB &REG2,&B

MOVEM &REG2,&A

MEND

START 100

READ N1

READ N2

DECR N1,N2

STOP

N1 DS 1

N2 DS 2

END


    ====OP of pass I ====START 100

READ N1

READ N2

DECR N1,N2

STOP

N1 DS 1

N2 DS 2

END


    ==== MNT ====
         0    0
         0    0
         0    0
     INCR    0    3
     DECR    5    3
    ==== MDT ====
0    INCR 3 4 17
1    MOVER 17 3
2    ADD 17 4
3    MOVEM 17 3
4    MEND
5    DECR 0 1 17
6    MOVER 17 0
7    SUB 17 1
8    MOVEM 17 0
9    MEND
    ==== ALA ====
    &A   
    &B   
       
    &X   
    &Y   
      
    &REG2    BREG
       
        root@prashant-HP-ENVY-4-Notebook-PC:~/SPOS Programs/macro I#


#################################################

On execution you will found ala.txt , mnt.txt ,mdt.txt , output.txt all this file require for macro pass II

ala.txt (actual and formal parameters list ala-aurgument list array)

    &A   
    &B   
       
    &X   
    &Y   
       
   &REG2    BREG
           
mdt.txt (Macro Defination Table)
INCR 3 4 17
MOVER 17 3
ADD 17 4
MOVEM 17 3
MEND
DECR 0 1 17
MOVER 17 0
SUB 17 1
MOVEM 17 0
MEND

mnt.txt (Macro Name Table)
    0    0
    0    0
    0    0
INCR    0    3
DECR    5    3

output.txt
START 100
READ N1
READ N2
DECR N1,N2
STOP
N1 DS 1
N2 DS 2
END

We will require this files while running macro pass II
+