Process Scheduling and Synchronization
Critical Section Problem
Process Synchronization is
a technique used to coordinate multiple processes so they can safely share
resources (like memory, files, variables) without causing errors or
inconsistencies.
Critical Section Problem (Operating Systems)
The Critical Section Problem is about designing a
protocol so that multiple processes can safely access shared resources (like
variables, files, memory) without causing errors.
The Critical Section Problem is a fundamental concept
in Operating Systems that deals with how multiple processes can safely share
resources without causing errors.
What is a Critical Section?
A critical section is the part of a process where it
accesses shared data.
A critical section is the part of a program where a
process accesses shared data/resources (like variables, files, memory).
Structure of a Process:
while(true) {
Entry Section // request access
Critical Section // access shared resource
Exit Section // release resource
Remainder Section // other work
}
The Problem
When multiple processes enter their critical sections
at the same time, it can lead to:
Race Condition
Incorrect results
Data inconsistency
Example
Shared variable: count = 5
Process P1: count++
Process P2: count--
If both execute simultaneously, final value may be
wrong (not 5).
Requirements (Solution Conditions)
To solve the critical section problem, a
solution must satisfy:
1. Mutual Exclusion
Only one process at a time can execute in the critical
section
2. Progress
If no process is in the critical section,
One of the waiting processes should be allowed to
enter
Decision should not be delayed indefinitely
3. Bounded Waiting
A process should not wait forever
There must be a limit on how many times others can
enter before it
Solutions to Critical Section Problem
1. Software Solutions
Peterson’s Algorithm (for 2 processes)
Uses shared variables like flag and turn
Ensures mutual exclusion without hardware
2. Hardware Solutions
Test-and-Set instruction
Compare-and-Swap
These provide atomic operations.
3. High-Level Solutions
Mutex (Lock)
lock()
critical section
unlock()
Semaphore
wait(S)
critical section
signal(S)
Monitor
High-level construct (used in Java, etc.)
Automatically handles synchronization
Key Issues
Busy Waiting (wastes CPU time)
Deadlock (processes wait forever)
Starvation (some processes never get access)
Summary
Critical section problem ensures safe access to shared
resources
Prevents race conditions
Requires:
Mutual Exclusion
Progress
Bounded Waiting
Solved using algorithms, hardware instructions, and
synchronization tools
Critical Section Problem – Example 2
Let’s understand the Critical Section Problem
with a simple and clear example.
Example: Shared Bank Account 💰
Assume two processes are accessing the same bank
account balance.
Initial Balance = 1000
Process P1 (Deposit ₹500)
read balance (1000)
balance = balance + 500 → 1500
write balance (1500)
Process P2 (Withdraw ₹300)
read balance (1000)
balance = balance - 300 → 700
write balance (700)
What Goes Wrong? (Race Condition)
If both processes execute at the same time,
this may happen:
1.
P1 reads balance
= 1000
2.
P2 reads balance
= 1000
3.
P1 writes 1500
4.
P2 writes 700
Final Balance = 700 (WRONG ❌)
Correct answer should be 1200 (✔)
Where is the Critical Section?
The critical section is where the shared
variable (balance) is accessed:
read balance
modify balance
write balance
Both processes execute this part → conflict occurs.
Solution Using Mutual Exclusion
We ensure only one process at a time accesses
the balance.
Using Mutex Lock
lock()
read balance
modify balance
write balance
unlock()
Correct Execution (After Fix)
1.
P1 enters →
updates balance to 1500 → exits
2.
P2 enters →
updates balance to 1200 → exits
Final Balance = 1200 (Correct ✔)
Key Takeaways
- Critical section =
code accessing shared data
- Problem occurs due
to simultaneous access
- Leads to race
condition
- Solution: Mutual
Exclusion (locks, semaphores, etc.)
Another Quick Example (Counter)
count = 0
P1: count++
P2: count++
Expected result = 2
But due to race condition → result may be 1
Classical Synchronization Problems
Described by Dutch computer scientist Edsger W. Dijkstra in mid
1960.
(Producer-Consumer, Readers-Writers, Dining Philosophers)
Classical
Synchronization Problems are standard
problems used to understand how processes coordinate and share resources
safely without conflicts.
1.
Producer–Consumer Problem (Bounded Buffer Problem)
Concept
A producer creates data and puts it into a buffer
A consumer takes data from the buffer
Buffer has limited size
Problem
Producer should not add data if buffer is full
Consumer should not remove data if buffer is empty
Solution
Use
Semaphore: (we can use semaphores to keep track of the number of empty
and full slots in the buffer.)
Mutex
→ for mutual exclusion
Full
→ number of filled slots
Empty
→ number of empty slots
Mutual
Exclusion (Mutex) is a concept used
in operating systems to ensure that only one process or thread can access a
shared resource (critical section) at a time.
Mutual exclusion is a technique that prevents multiple
processes from entering the critical section simultaneously.
2. Dining Philosophers
Problem 1965
The Dining Philosopher
Problem is a classic synchronization problem introduced by Edsger Dijkstra in
1965. It illustrates the challenges of resource sharing in concurrent
programming, such as deadlock, starvation, and mutual exclusion.
Concept
6
Pphilosophers sit around a
circular table.
Each philosopher
alternates between thinking and eating.
There is one
chopstick between each philosopher (total K chopsticks).
A philosopher must
pick up two chopsticks (left and right) to eat.
Only one
philosopher can use a chopstick at a time.
The challenge: Design a synchronization mechanism so that philosophers
can eat without causing deadlock (all waiting
forever) or starvation (some never
get a chance to eat).
Issues in the Problem
If all pick one chopstick →
1.
Deadlock: If every philosopher picks up their left chopstick first,
no one can pick up the right one circular wait.
2.
Starvation: Some philosophers may never get a chance to eat if others
keep eating.
3.
Concurrency Control: Must ensure no two adjacent philosophers eat
simultaneously.
deadlock
occurs (A deadlock is a situation in which two or more processes are unable to
proceed because each is waiting for a resource held by another process.)
Solution
Resource hierarchy
Resource
Hierarchy is a technique used to prevent
deadlock by assigning an order (number) to resources and forcing processes
to request them in that order.
Idea
behind It
Each resource (chopstick) is given a unique
number
A philosopher must always pick the lower-numbered
chopstick first, then the higher-numbered one
this breaks circular wait, so deadlock cannot occur
Example (Dining
Philosophers)
Assume:
5
philosophers: P1, P2, P3, P4, P5
5
chopsticks numbered: C1, C2, C3, C4, C5
Arrangement:
P1
→ C1 & C2
P2
→ C2 & C3
P3
→ C3 & C4
P4
→ C4 & C5
P5
→ C5 & C1
Rule
Applied
Each
philosopher picks:
First lower-numbered chopstick, then higher-numbered
So:
P1
→ picks C1 then C2
P2
→ picks C2 then C3
P3
→ picks C3 then C4
P4
→ picks C4 then C5
P5
→ picks C1 then C5 (since C1 < C5)
Why
Deadlock is Avoided?
No
circular waiting chain is formed
At
least one philosopher can always eat
Circular wait condition is eliminated
Limit number of philosophers
Basic Idea
If
there are N philosophers, allow only N − 1 philosophers to sit (or pick
chopsticks) at a time
Example:
Total
philosophers = 5
Only
4 philosophers can try to eat at once
Why does it work?
At
least one philosopher will always be able to get both chopsticks
This
breaks circular wait condition so deadlock cannot occur
Example
- Philosophers: P1, P2, P3, P4, P5
- Only 4 allowed to pick chopsticks
Suppose:
- P1, P2, P3, P4 are trying to eat
- P5 is waiting
Since one philosopher is not competing:
One of the active philosophers will get both chopsticks and eat
Then resources are released → others proceed
Use semaphores or monitors
3. Readers–Writers
Problem
Concept
Multiple
processes:
Readers
→ only read data
Writers
→ modify data
Problem
Multiple
readers can access at same time
Ensure that only
one writer writes at a time.
Prevent readers
from reading while a writer is writing.
Writer
needs exclusive access
Solution
Readers Preference – give readers priority, making writers wait.
Writers Preference – give writers priority, ensuring timely updates.
Use read-write locks / semaphores (The reader-writer problem using semaphores manages concurrent access to a shared
resource, allowing multiple readers to read simultaneously but giving writers
exclusive access. (exclusive-not to be shared) It utilizes a mutex (for updating reader count, (
mutex - to prevent
multiple threads from accessing shared resources simultaneously)) and a wrt semaphore (for locking the resource) to prevent data
inconsistency, ensuring that while a writer is active, no reader or other
writer can enter)
Allow multiple readers
Block writers when readers active
Semaphores & Mutex
Both semaphores and mutex are used for process
synchronization and to control access to shared resources.
1.
Semaphore
What is a Semaphore?
A semaphore is a signaling mechanism used to control
access to multiple resources.
Types
Binary Semaphore (0 or 1)
Counting Semaphore (0, 1, 2, …)
Operations
wait (P) → decrease value
signal (V) → increase value
Example
wait(S);
// critical section
signal(S);
2. Mutex (Mutual Exclusion)
What
is a Mutex?
A mutex is a locking mechanism used to ensure that
only one process/thread accesses a resource at a time.
It is like a lock/unlock system
Example
lock(mutex);
// critical section
unlock(mutex);
Key
Differences
|
Feature |
Semaphore |
Mutex |
|
Meaning |
Signaling mechanism |
Locking mechanism |
|
Values |
Integer (0,1,2,…) |
Only 0 or 1 |
|
Usage |
Multiple resources |
Single resource |
|
Ownership |
No ownership |
Has ownership |
|
Operations |
wait() / signal() |
lock() / unlock() |
Similarities
Used for synchronization
Prevent race conditions
Control access to critical section
Advantages
Efficient resource management
Ensures data consistency
Disadvantages
Can cause deadlock if misused
Difficult to implement correctly
Short
Answer (Exam Ready)
Semaphore is a signaling mechanism used to manage
multiple resources, while mutex is a locking mechanism used to allow only one
process to access a resource at a time.
No comments:
Post a Comment