A semaphore is simply an integer variable that is shared between multiple threads.
We can also say A semaphore is a data structure with an initialization operation and two usage operations. The data structure consists of a counter and a queue for picking up blocked processes. The concept comes from Dijkstra and was presented in 1965. Semaphores serve as a solution to the critical section problem. This is to avoid race conditions. It is a part of code that gets access to a resource. Semaphore is used to figure out the problem of mutual exclusion, race condition, and process synchronization.
Semaphore in Operating System
A semaphore is essentially a variable or abstract data type used to signal between processes or threads. The operating system or a kernel module typically provides semaphore operations. These operations are atomic, meaning they are executed as a single, indivisible operation to ensure data integrity. The two primary operations are:
- Wait (P operation or
wait()
): If the semaphore’s value is greater than 0, it decreases the value and proceeds. If it’s already 0, the process is put into a wait state until the semaphore’s value is incremented by another process. - Signal (V operation or
signal()
): Increments the semaphore’s value and, if there are any processes waiting on the semaphore, one is removed from the wait queue and resumed.
There are two types of semaphores
1. Binary Semaphore
Nature: Binary semaphores, also known as mutex locks, have only two values, 0 and 1. They are used to manage access to a single resource, acting essentially as a lock.
Usage: A process must acquire the semaphore (decrement from 1 to 0) before accessing the shared resource and release it (increment back to 1) after use. If another process tries to acquire the semaphore while it is locked (value is 0), it will be put to sleep until the semaphore is released.
2. Counting Semaphore
Nature: Counting semaphores can have an unrestricted value and are used to manage access to multiple instances of a resource.
Usage: The semaphore’s value represents the number of available resources. Processes wait on the semaphore if the count is zero (indicating no available resources) and proceed when it becomes positive. As resources are acquired or released, the semaphore’s value is decremented or incremented accordingly. This allows multiple processes to access the same resource pool without interference, up to the maximum limit defined by the semaphore’s value.
Limitations of Semaphores
1. Complexity in Usage
Semaphores require careful programming and a deep understanding of their operation to avoid common pitfalls such as deadlocks, where two or more processes are waiting indefinitely for each other to release a semaphore. Misuse can lead to complex bugs that are hard to detect and fix.
2. Risk of Deadlocks
Improper use of semaphores can easily lead to deadlocks, especially in complex systems with multiple semaphores and processes interacting in intricate ways. A deadlock occurs when processes hold resources while waiting for other resources, causing a cycle of dependencies that prevent any of them from proceeding.
3. Priority Inversion
Priority inversion happens when a higher-priority task is waiting for a lower-priority task to release a semaphore. If a medium-priority task preempts the lower-priority task, the higher-priority task can be indirectly blocked by the medium-priority task, leading to inefficient scheduling and potentially missed deadlines in real-time systems.
4. Busy Waiting
Depending on the implementation, semaphores can lead to busy waiting, where a process repeatedly checks if the semaphore is available, consuming CPU cycles. This can degrade system performance, especially if many processes are involved in the waiting loop.
5. Lack of Fairness
Semaphore implementations may not guarantee fairness or the order in which waiting processes acquire the semaphore. This can lead to starvation, where some processes may wait indefinitely while others proceed, especially in systems with heavy load or many competing processes.
6. Difficulty in Error Handling
When a process that has acquired a semaphore fails or terminates unexpectedly without releasing the semaphore, it can leave the system in an inconsistent state or cause deadlock. Proper error handling and recovery mechanisms need to be in place, complicating the system design.
7. Limited to Synchronization
Semaphores are primarily designed for synchronization and do not directly support communication between processes, such as exchanging data or messages. Other mechanisms, like message queues or shared memory, are needed for inter-process communication (IPC).
Similar Reads
-
Advantages and Disadvantage of User level and Kernel Level Threads
User-Level Threads Advantages of User-Level Threads Speed and Efficiency: Operations such as thread creation, switching, and destruction are faster because… -
Difference Between User-level and kernel-level thread
User-level and kernel-level threads represent two approaches to thread management in operating systems. Both have some differences Difference Between User-level… -
What is Deadlock in OS? Explain with the help of a diagram.
A deadlock is a condition where each of the processes is waiting for a resource which is allotted to other… -
Preemptive and Non-Preemptive Algorithm in Operating System
Preemptive Scheduling Algorithm Here, a scheduler can preempt a running low-priority process at any time when a high-priority process enters… -
CPU scheduling algorithms Criteria in Operating System
There are different criteria for the CPU scheduling algorithm. CPU scheduling algorithms Criteria are CPU utilization: The main purpose of… -
Sleeping Barber Problem of Synchronization in Operating System
It is a synchronization and inter-process communication problem. This problem is based on a barbershop. A barbershop has a single… -
Reader-Writer Problem in Operating System with Code
The readers and writers problem based on an object like a file which is shared in different processes. Some processes… -
Discuss the Classical problem of synchronization
Using semaphores for synchronization is the traditional way to present the solutions. There are four types of the classical problem… -
Mutual exclusion in Operating System with its four conditions
When a process is executed in a critical section, then no other process can be executed in their critical section.… -
Critical Section Problem in Operating System
A contention situation arises if two independent programs or processes want to access common data, and this can lead to…