Home » 
        Operating System
    
    Classical Synchronization Problem in Operating System
    
    
    
    
        In this tutorial, we will learn about the classical synchronization problem in Operating System with its solution.
        
            By Prerana Jain Last updated : May 07, 2023
        
    
    Classical Synchronization Problem
    In this section, we present a number of different philosopher synchronization problems that are important mainly because they are examples for a large class of concurrency- control problems. These problems are used for testing nearly every new proposed synchronization scheme. 
    Bounded buffer problem/ producer- consumer problem
    Bounded buffer problem or producer-consumer problem is a classical synchronization problem where we have a buffer with n cells or n slots and there are 2 process producers and consumers can produce and consume one article at a time.
    Write a solution using a semaphore to ensure overflow condition for producers underflow for consume and a critical section for the buffer.
    Here we have pool of n buffers.
    Mutex - Semaphore for mutual exclusion to access buffer pool, initialized to 1.
    Empty - Semaphore to count empty buffer N.
    Full - Semaphore to count fill buffer 0.
    
        
            | Producer | Consumer | 
        
            | 
Wait (empty)
Wait (mutex)
Critical section
Signal (mutex)
Signal (full)
 | 
Wait (empty)
Wait (mutex)
Critical section
Signal (mutex)
Signal (empty)
 | 
    
    
    We have used 3 semaphore e- empty cells, as well as underflow f- fixed cells as well as overflow mutex, is used for the critical section.
Example:
    
        
            | P | C | 
        
            | 
while(1)
{
    produce();
    wait(e)
    wait(mutex)
    append()
    signal(mutex)
    signal(f)
}
 | 
while(1)
{
    wait(p)
    wait(mutex)
    pick();
    signal(mutex)
    signal(e)
    consume();
}
 | 
    
    1. Reader/writer Problem
    
        - There is a shared piece of text and 2 types of process in accessing this text reader and writer.
- There is no clash between reader and reader therefore when a reader is inside critical section then other readers may get an only entry but when a write is inside critical section then neither the reader nor the writer gets an entry.
- Hence in the solution, we have used 3 resources a semaphore mutex for synchronization between writer and reader-writer.
- While read count (RC) is a simple integer variable which is given security by reading semaphore which works for synchronization between reader- reader.
Writer
while(1)
{  
	wait(mutex)
	write
	signal(mutex)
}
    Reader
while(1)
{  
	wait(Read)
	Rc = Rc + 1;
	
	if(Rc = = 1)
	{  
		wait (mutex)
	} 
	
	wait(Read)
	Rc = Rc-1
	
	if(Rc ==0)
	{ 
		signal(mutex)
	}
	
	signal(Read)
}
    2. Dining Philosopher Problem
    In this problem, there is a circular table and number of philosopher a sitting on the table. There is a chop-stick placed between every philosopher. Philosopher prior only 2 processes either they think or eat (using 2 chop-stick).
    
Pi()
while(1)
{ 
	think
	P(s)
	Wait (chop-stick[i])
	Wait (chop-stick(i+1 % 5)
	V(s)
	Eat
	Signal( chop-stick[i]
	Signal (chop-stick(i+1 % 5)
	Think
}
    Solution using semaphore for philosopher synchronization
    Solution suffers from dead-lock and the following modification can be done:
    
        - Allow n-1 philosopher to sit on the table.
- Allow n+1 chop-stick to be put on the table.
- n-1 philosopher picks the left chop-stick first(the right and then the last philosopher pick the right first and left or vice-versa.
- Division can be done between add an even number philosopher.
- Take one more semaphore and consider 2 wait operation as a critical section.
Improved implementation
    Here, there will be  2 improvements:
    
        - The implementation will become effective as there is no wastage of CPU clock cycles.
- The bounded wait will also be ensured as it uses strictly follow First come first serve.
        
            | 
P(s)
{
    s = s-1
    if (s<0)
    {
        block();
        Add it to the queue();
    }
}
 | 
V(s)
{
    s = s+1
    if (s<1)
    {
        dequeue();
        resume();
    }
}
 | 
    
	
    
    
    
    
    
    
  
    Advertisement
    
    
    
  
  
    Advertisement