0% found this document useful (0 votes)
21 views14 pages

15 Synchronization Hardware 21082024 115748am 24042025 092355am

The document discusses synchronization hardware and methods for implementing critical section code, focusing on locking mechanisms such as mutex locks and semaphores. It explains the use of atomic hardware instructions like test_and_set for mutual exclusion in multiprocessor environments and describes semaphore operations for process synchronization. Additionally, it highlights the challenges of busy waiting and presents solutions to minimize it through semaphore implementation with waiting queues.

Uploaded by

armarking654
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
21 views14 pages

15 Synchronization Hardware 21082024 115748am 24042025 092355am

The document discusses synchronization hardware and methods for implementing critical section code, focusing on locking mechanisms such as mutex locks and semaphores. It explains the use of atomic hardware instructions like test_and_set for mutual exclusion in multiprocessor environments and describes semaphore operations for process synchronization. Additionally, it highlights the challenges of busy waiting and presents solutions to minimize it through semaphore implementation with waiting queues.

Uploaded by

armarking654
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 14

Synchronization Hardware

 Many systems provide hardware support for implementing the


critical section code.
 All solutions below based on idea of locking
 Protecting critical regions via locks
 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
Solution to Critical-section Problem Using Locks

do {
acquire lock
critical section
release lock
remainder section
} while (TRUE);
test_and_set Instruction

In a single processor environment the processes do not execute


concurrently. The mutual exclusion in this environment can be
obtained by preventing the process that is executing in its critical
section from being interrupted. This can be done by disabling the
interrupts before the process enter its critical section and enabling
the interrupts only after the process has exited from the critical
section. This is shown below:
Process Pi:
disable interrupts
<critical section>
enable interrupts
<remainder section>
Solution using test_and_set()

This means when a process is executing in its critical section it


cannot be interrupted and thus mutual exclusion is achieved.
But this solution cannot be used in multiprocessor environment
because several processes are executing concurrently on
different processors. Here in order to disable the interrupts the
instruction is to be sent to all processors. This is really time
consuming process that decreases the efficiency of the system
and also not a very practical solution. To solve this problem
and achieve mutual exclusion in multiprocessor system Test
and set instruction are used.
test_and_set()

Test and set instruction are simple hardware instructions that


solves the critical section problem by providing mutual
exclusion in an easy and efficient way in a multiprocessor
environment.
test_and_set Instruction

Definition:
boolean test_and_set (boolean *target)
{
boolean rv = *target;
*target = TRUE;
return rv:
}
1. Executed atomically
2. Returns the original value of passed parameter
3. Set the new value of passed parameter to “TRUE”.
Solution using test_and_set()
 Shared Boolean variable lock, initialized to FALSE
 Solution:
do {
while (test_and_set(&lock))
; /* do nothing */
/* critical section */
lock = false;
/* remainder section */
} while (true);
Mutex Locks
 Previous solutions are complicated and generally inaccessible
to application programmers
 OS designers build software tools to solve critical section
problem
 Simplest is mutex lock
 Protect a critical section by first acquire() a lock then
release() the lock
 Boolean variable indicating if lock is available or not
 Calls to acquire() and release() must be atomic
 Usually implemented via hardware atomic instructions
 But this solution requires busy waiting
 This lock therefore called a spinlock
acquire() and release()
 acquire() {
while (!available)
; /* busy wait */
available = false;
}
 release() {
available = true;
}
 do {
acquire lock
critical section
release lock
remainder section
} while (true);
Semaphore
 Synchronization tool that provides more sophisticated ways (than Mutex locks) for
process to synchronize their activities.
 Semaphore S – integer variable
 Can only be accessed via two indivisible (atomic) operations
wait() and signal()
 Originally called P() and V()

 Definition of the wait() operation

wait(S) {
while (S <= 0)
; // busy wait
S--;
}
 Definition of the signal() operation
signal(S) {
S++;
}
Semaphore Usage
 Counting semaphore – integer value can range over an unrestricted
domain
 Binary semaphore – integer value can range only between 0 and 1
 Same as a mutex lock
 Can solve various synchronization problems
 Consider P1 and P2 that require S1 to happen before S2
Create a semaphore “synch” initialized to 0
P1:
S1;
signal(synch);
P2:
wait(synch);
S2;
 Can implement a counting semaphore S as a binary semaphore
Semaphore Implementation
 Must guarantee that no two processes can execute the wait()
and signal() on the same semaphore at the same time
 Thus, the implementation becomes the critical section problem
where the wait and signal code are placed in the critical
section
 Could now have busy waiting in critical section
implementation
 But implementation code is short
 Little busy waiting if critical section rarely occupied
 Note that applications may spend lots of time in critical sections
and therefore this is not a good solution
Semaphore Implementation with no Busy waiting

 With each semaphore there is an associated waiting queue


 Each entry in a waiting queue has two data items:
 value (of type integer)
 pointer to next record in the list
 Two operations:
 block – place the process invoking the operation on the
appropriate waiting queue
 wakeup – remove one of processes in the waiting queue
and place it in the ready queue
 typedef struct{
int value;
struct process *list;
} semaphore;
Implementation with no Busy waiting (Cont.)

wait(semaphore *S) {
S->value--;
if (S->value < 0) {
add this process to S->list;
block();
}
}

signal(semaphore *S) {
S->value++;
if (S->value <= 0) {
remove a process P from S->list;
wakeup(P);
}
}

You might also like