Prerequisites – Process Synchronization
A lock variable provides the simplest synchronization mechanism for processes. Some noteworthy points regarding Lock Variables are-
- Its a software mechanism implemented in user mode, i.e. no support required from the Operating System.
- Its a busy waiting solution (keeps the CPU busy even when its technically waiting).
- It can be used for more than two processes.
When Lock = 0 implies critical section is vacant (initial value ) and Lock = 1 implies critical section occupied.
The pseudocode looks something like this –
Entry section - while(lock != 0); Lock = 1; //critical section Exit section - Lock = 0;
A more formal approach to the Lock Variable method for process synchronization can be seen in the following code snippet :
Here we can see a classic implementation of the reader-writer’s problem. The buffer here is the shared memory and many processes are either trying to read or write a character to it. To prevent any ambiguity of data we restrict concurrent access by using a lock variable. We have also applied a constraint on the number of readers/writers that can have access.
Now every Synchronization mechanism is judged on the basis of three primary parameters :
- Mutual Exclusion.
- Bounded Waiting.
Of which mutual exclusion is the most important of all parameters. The Lock Variable doesn’t provide mutual exclusion in some cases. This fact can be best verified by writing its pseudo-code in the form of an assembly language code as given below.
1. Load Lock, R0 ; (Store the value of Lock in Register R0.) 2. CMP R0, #0 ; (Compare the value of register R0 with 0.) 3. JNZ Step 1 ; (Jump to step 1 if value of R0 is not 0.) 4. Store #1, Lock ; (Set new value of Lock as 1.) Enter critical section 5. Store #0, Lock ; (Set the value of lock as 0 again.)
Now let’s suppose that processes P1 and P2 are competing for Critical Section and their sequence of execution be as follows (initial alue of Lock = 0) –
- P1 executes statement 1 and gets pre-empted.
- P2 executes statement 1, 2, 3, 4 and enters Critical Section and gets pre-empted.
- P1 executes statement 2, 3, 4 and also enters Critical Section.
Here initially the R0 of process P1 stores lock value as 0 but fails to update the lock value as 1. So when P2 executes it also finds the LOCK value as 0 and enters Critical Section by setting LOCK value as 1. But the real problem arises when P1 executes again it doesn’t check the updated value of Lock. It only checks the previous value stored in R0 which was 0 and it enters critical section.
This is only one possible sequence of execution among many others. Some may even provide mutual exclusion but we cannot dwell on that. According to murphy’s law “Anything that can go wrong will go wrong“. So like all easy things the Lock Variable Synchronization method comes with its fair share of Demerits but its a good starting point for us to develop better Synchronization Algorithms to take care of the problems that we face here.
This article is contributed by Siddhant Bajaj 2. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to email@example.com. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
- Mutex lock for Linux Thread Synchronization
- Python | How to lock Critical Sections
- Lock Based Concurrency Control Protocol in DBMS
- Process Synchronization | Set 2
- Semaphores in Process Synchronization
- Critical Section in Synchronization
- Synchronization in Distributed Systems
- Mutual Exclusion in Synchronization
- Introduction of Process Synchronization
- Monitors in Process Synchronization
- Peterson's Algorithm in Process Synchronization
- Bakery Algorithm in Process Synchronization
- Dekker's algorithm in Process Synchronization
- Sleeping Barber problem in Process Synchronization
- Classical problems of Synchronization with Semaphore Solution