Os Unit-2 IPC
Os Unit-2 IPC
Os Unit-2 IPC
Inter-process Communication
• 1.Process Creation
• 2.Process Termination
Inter process communication
• Race condition
• Critical regions
• Mutual exclusion with busy waiting
• Sleep and wakeup
• Semaphores
• Mutexes
• Monitors
• Message passing
• Barriers
• Classical IPC problems
• Dining philosophers problem
• Readers and writers problem
Critical-section Problem
• The critical-section problem is to design a protocol that
the processes can use to synchronize their activity so as
to cooperatively share data.
• Each process must request permission to enter its
critical section.
• The section of code implementing this request is the
entry section.
• The critical section may be followed by an exit section.
• The remaining code is the remainder section.
• At a given point in time, many kernel-mode processes may be active in the
operating system.
• As a result, the code implementing an operating system (kernel code) is subject to
several possible race conditions.
• Consider as an example a kernel data structure that maintains a list of all open
files in the system.
• This list must be modified when a new file is opened or closed (adding the file to
the list or removing it from the list).
• If two processes were to open files simultaneously, the separate updates to this list
could result in a race condition.
Race condition
• Race condition occurs when two or more processes (which are
executing concurrently) can access shared data and they try to change
it at the same time.
• Because the process scheduling algorithm can swap between process
at any time, you don't know the order in which the processes will
attempt to access the shared data.
• Therefore, the result of the change in data is dependent on the process
scheduling algorithm,
• i.e. both processes are "racing" to access/change the data.
Race Condition – Producer & Consumer Problem
• Concurrent access to shared data may result in data inconsistency
• Maintaining data consistency requires mechanisms to ensure the
orderly execution of cooperating processes
• Suppose that we wanted to provide a solution to the consumer-
producer problem that fills all the buffers.
• We can do so by having an integer count that keeps track of the
number of full buffers.
• Initially, count is set to 0.
• It is incremented by the producer after it produces a new buffer and
• It is decremented by the consumer after it consumes a buffer.
Producer
The producer produces the buffer until the size is full (reaches n)
while (true)
{
/* produce an item and put in nextProduced */
while (count == BUFFER_SIZE)
; // do nothing
buffer [in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
count++;
}
Consumer
The consumer consumes the buffer until the size is 0 (reaches 0)
while (true)
{
while (count == 0)
; // do nothing
nextConsumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
/* consume the item in nextConsumed
}
Race Condition
• count++ could be implemented as
register1 = count
register1 = register1 + 1
count = register1
• count-- could be implemented as
register2 = count
register2 = register2 - 1
count = register2
• Consider this execution interleaving with “count = 5” initially:
S0: producer execute register1 = count {register1 = 5}
S1: producer execute register1 = register1 + 1 {register1 = 6}
S2: consumer execute register2 = count {register2 = 5}
S3: consumer execute register2 = register2 - 1 {register2 = 4}
S4: producer execute count = register1 {count = 6 }
S5: consumer execute count = register2 {count = 4}
Race Condition when assigning a PID
• Processes P0 and P1 simultaneously calls fork(), the next available pid
is 2615 assigned to both children. (that should not be happened)
Solution to Critical-Section Problem
Requirements:
1. Mutual Exclusion - If process Pi is executing in its critical section, then no
other processes can be executing in their critical sections.
2. Progress - If no process is executing in its critical section and there exist
some processes that wish to enter their critical section, then the selection of
the processes that will enter the critical section next cannot be postponed
indefinitely.
3. Bounded Waiting - A bound must exist on the number of times that other
processes are allowed to enter their critical sections after a process has
made a request to enter its critical section and before that request is
granted.
Assume that each process executes at a nonzero speed
No assumption concerning relative speed of the N processes
Peterson’s Solution
• Two process solution
• Assume that the LOAD and STORE instructions are atomic; that is,
cannot be interrupted.
• The two processes share two variables:
• int turn;
• Boolean flag[2]
• The variable turn indicates whose turn it is to enter the critical section.
do {
flag[i] = TRUE;
turn = j;
while (flag[j] && turn == j);
critical section
flag[i] = FALSE;
remainder section
} while (TRUE);
Synchronization Hardware
• Many systems provide hardware support for critical section code
• Uniprocessors – could disable interrupts
• Currently running code would execute without preemption
• Generally too inefficient on multiprocessor systems
• Operating systems using this not broadly scalable
• Modern machines provide special atomic hardware instructions
• Atomic = non-interruptible
• Either test memory word and set value
• Or swap contents of two memory words