SEMAPHORE By: Wilson Lee Concurrency Task Synchronization Example of semaphore Language Support Concurrency First is instruction level Second is statement level executing two or more statement instructions simultaneously Third is unit level executing two or more machine instructions simultaneously usually handled by optimizing compiler executing two or more machine subprogram units simultaneously Fourth is programming level executing two or more machine program simultaneously usually handled by the operating system Concurrency Execution It can be physical on separate processor (single or multiple processors) It can be logical in some time-sliced method on a single processor computer system Task Task is a unit of a program that can be in concurrent execution with other units of the same program. Each task in a program can provide one thread of control. A task can communicate with other tasks through shared non-local variables, through message passing, or through parameters. Because tasks often work together to solve problems, they must use some form of communication to either synchronize their executions or shard data. Synchronization Two kind of synchronization cooperation synchronization when task A must wait for task B to complete some specific activity before task A can continue its execution. competition synchronization when two tasks require the use of some resource that cannot be simultaneously used Synchronization alternatives: 1. Semaphores 2. Monitors 3. Message Passing Facts about semaphore It is a mechanism that can be used to provide synchronization of tasks. It is a low level synchronization mechanism. It was devised in 1965 by Edsger Dijkstra to provide competition synchronization and also cooperation synchronization. It is a data structure that contains an integer and a queue that store tasks descriptors. Semaphore has only two operations. They are pass/wait and release. Originally named P and V by Dijkstra, after two Dutch words passeren (to pass) and vrygeren (to release). Two semaphore operations wait (aSemaphore) if aSemaphore’s counter > 0 then decrement aSemaphore’s counter else put the caller in aSemaphore’s queue attempt to transfer control to some ready task (if the task ready queue is empty, deadlock occurs) End release(aSemaphore) if aSemaphore’s queue is empty (no task is waiting) then increment aSemaphore’s counter else put the calling task in the task ready queue transfer control to a task from aSemaphore’s queue end Example of semaphore Producer and consumer problem The producer should stop producing when the warehouse is full. The consumer should stop consuming when the warehouse is empty Retrieving databases For example, we would initialize a semaphore to the number of database connections available. As each thread acquires the semaphore, the number of available connections is decremented by one. Upon consumption of the resource, the semaphore is released, incrementing the counter . Language Support PL/I and ALGOL 68 are the only languages that support semaphore ALGOL 68 has a data type name sema Java has no built in semaphore mechanism. Although, it is possible to construct one. (hand out) Famous quote from Per Brinch Hansen “The semaphore is an elegant synchronization tool for an ideal programmer who never makes mistakes.” Unfortunately, programmers of that kind are rare.[1] [1] Concepts of Programming Language, Robert W. Sebesta, Addison Wesley, 2002 pg. 528 http://www.informatik.unistuttgart.de/ipvr/bv/cppvm/onlinedoc/node53.html http://www.javaworld.com/javaworld/ja vaqa/1999-11/02-qa-semaphore.html