We can divide processes in two Categories
1) Co-operative Processes
2) Independent Processes
Co-operative processes are those where the execution of one process affects or affected by other process and if they are not dependent than they are independent processes.
In this tutorial we will study :-
1) problems
2) Conditions to achieve synchronization
3) Solutions to achieve synchronization (which will cover both wrong & right solutions)
Lets Start with Problems which we faced during implementing Co-operative processes
Producer- Consumer Problem :
The problem describes two processes, the producer and the consumer, who share a common, fixed-size buffer used as a queue. The producer’s job is to generate a piece of data, put it into the buffer and start again. At the same time, the consumer is consuming the data (i.e., removing it from the buffer) one piece at a time. The problem is to make sure that the producer won’t try to add data into the buffer if it’s full and that the consumer won’t try to remove data from an empty buffer.
Consider the Following Program
Producer Code
Int Count =0;
Void producer(void){
int temp;
While(true){
Produe_item(itemp);
while(count==n);
buffer[in]=temp;
in=(in + 1)mod n ;
count=count+1;
}
}
Consumer Code
void consumer(void){
int itemc;
while(true)
{
while(count==0);
itemc=buffer[out];
out=(out+1)mod n;
count=count-1;
process.item(item c);
}
}
can you find any error in the above programs?
when we see these programs individually than these programs works fine but if both of these programs have to work on same data , same resources than they fail to achieve synchronization which results in inconsistency , loss of data and sometimes can cause DEADLOCK.
Now before continuing to the next Topic lets know some important terms
Critical Section :- The portion of program where shared resource or the shared variables is placed
Non Critical Section :- The portion of program which is independent to respective processes
Race Condition :- The condition in which the output of the process depends on execution sequence of statements
Conditions which are important to achieve Synchronization :
1) Mutual Exclusion :- No two processes may be simultaneously present inside the Critical Section at any point of time.
2) Progress :- No process running outside the critical section should block the other interested processes from entring into critical section when critical section is free.
3) Bounded waiting :- No process should have to wait forever to enter into critical section .i.e. their should be a bound on getting chance to enter into critical section .
(note : – if any solution which is not following bounded waiting than their is a possibility of starvation.)
4) No assumption related to hardware of the process or speed should be taken .
Continued …