A file is to be shared among different processes, each of which has a unique number. The file can beaccessed simultaneously by several processes, subject to the following constraint: the sum of all uniquenumbers associated with all the processes currently accessing the file must be less than n. Write amonitor to coordinate access to the file.Your solution should use condition variables. Assume abroadcast()operation can be invoked on acondition variable c to resume all processes suspended on c. Hint: Your monitor should contain twofunctions: one function is called before a process accesses a file and the other function is called after aprocess accesses a file.

Respuesta :

Answer:

int sumid=0;    /* Shared var that contains the sum of the process ids currently accessing the file */

int waiting=0;   /* Number of process waiting on the semaphore OkToAccess */

semaphore mutex=1;   /* Our good old Semaphore variable ;) */

semaphore OKToAccess=0;    /* The synchronization semaphore */

get_access(int id)

{

    sem_wait(mutex);

    while(sumid+id > n) {

        waiting++;

        sem_signal(mutex);

        sem_wait(OKToAccess);

        sem_wait(mutex);

    }

    sumid += id;

    sem_signal(mutex);

}

release_access(int id)

{

    int i;

    sem_wait(mutex);

    sumid -= id;

    for (i=0; i < waiting;++i) {

        sem_signal(OKToAccess);

    }

    waiting = 0;

    sem_signal(mutex);

}

main()

{

    get_access(id);

    do_stuff();

    release_access(id);

}

Some points to note about the solution:

release_access wakes up all waiting processes. It is NOT ok to wake up the first waiting process in this problem --- that process may have too large a value of id. Also, more than one process may be eligible to go in (if those processes have small ids) when one process releases access.

woken up processes try to see if they can get in. If not, they go back to sleep.

waiting is set to 0 in release_access after the for loop. That avoids unnecessary signals from subsequent release_accesses. Those signals would not make the solution wrong, just less efficient as processes will be woken up unnecessarily.

ACCESS MORE