More on SemaphoresMore on Semaphores
Andy WangAndy Wang
Operating SystemsOperating Systems
COP 4610 / CGS 5765COP 4610 / CGS 5765
The Pigeon Network ScenarioThe Pigeon Network Scenario
Pigeons are good message carriersPigeons are good message carriersReasonably reliableReasonably reliableRelatively fast for less developed rural areasRelatively fast for less developed rural areasCan sense magnetic field linesCan sense magnetic field lines
Here is the Story…Here is the Story…
There are two towns—Mars and VenusThere are two towns—Mars and VenusMars has all male pigeonsMars has all male pigeonsVenus has all female pigeonsVenus has all female pigeons
Each town delivers messages to the otherEach town delivers messages to the otherBy sending a pigeon through the shared flying By sending a pigeon through the shared flying
pathpathAnd waiting for the same pigeon to fly back as And waiting for the same pigeon to fly back as
an acknowledgementan acknowledgement
Here is the Story…Here is the Story…
Based on experienceBased on experienceWhenever both towns send messages Whenever both towns send messages
simultaneously, the reliability drops simultaneously, the reliability drops significantlysignificantly
Pigeons of opposite genders decide to take Pigeons of opposite genders decide to take excursions excursions
Goals of a pigeon network:Goals of a pigeon network:EfficiencyEfficiencyFairnessFairness
Developing the SolutionDeveloping the Solution
Can we map it to already solved Can we map it to already solved problems?problems?
Standard synchronization problems:Standard synchronization problems:Bounded buffer (producers and consumers)Bounded buffer (producers and consumers)Fairness (readers and writers)Fairness (readers and writers)Resource allocation (dining philosophers)Resource allocation (dining philosophers)
Pigeon network is under the reader-writer Pigeon network is under the reader-writer categorycategory
Step 1: VisualizationStep 1: Visualization
Identify Identify Shared resourcesShared resourcesScope of shared resourcesScope of shared resources
Mars Venus
flying path
Step 1: VisualizationStep 1: Visualization
Identify Identify Shared resource: flying pathShared resource: flying pathScope of the shared resource: global Scope of the shared resource: global
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
something you don’t see everyday…
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
P(flyingPath);P(flyingPath);
// send the message// send the message
V(flyingPath);V(flyingPath);
Mars Venus
flying path
Simplest ImplementationSimplest Implementation
+ Simple+ Simple
+ Fair+ Fair
- Not efficient- Not efficientOnly one pigeon can fly at a timeOnly one pigeon can fly at a timeVenusians love to fly in groups… Venusians love to fly in groups…
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
Resources and scopes: flying path Resources and scopes: flying path (global), a counter for Venusians in transit (global), a counter for Venusians in transit (Venus)(Venus)
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
int VenusiansInTransit = 0;int VenusiansInTransit = 0;
++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
int VenusiansInTransit = 0;int VenusiansInTransit = 0;
++VenusiansInTransit; // == 1++VenusiansInTransit; // == 1if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
int VenusiansInTransit = 0;int VenusiansInTransit = 0;
++VenusiansInTransit; // == 2++VenusiansInTransit; // == 2if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
int VenusiansInTransit = 0;int VenusiansInTransit = 0;
++VenusiansInTransit; // == 2++VenusiansInTransit; // == 2if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
int VenusiansInTransit = 0;int VenusiansInTransit = 0;
++VenusiansInTransit; // == 2++VenusiansInTransit; // == 2if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
int VenusiansInTransit = 0;int VenusiansInTransit = 0;
++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
int VenusiansInTransit = 0;int VenusiansInTransit = 0;
++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in TransitTransit
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
int VenusiansInTransit = 0;int VenusiansInTransit = 0;
++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}
Mars Venus
flying path
Date? Sure.
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit RevisedTransit Revised
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit RevisedTransit Revised
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit RevisedTransit Revised
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit RevisedTransit Revised
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}
// send the message// send the message
--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Wait!
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
semaphore flyingPath = 1;semaphore flyingPath = 1;
P(flyingPath);P(flyingPath);// send the message// send the messageV(flyingPath);V(flyingPath);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Mars Venus
flying path
Allowing Multiple Venusians in Allowing Multiple Venusians in Transit Revised AgainTransit Revised Again
Efficient for VenusiansEfficient for VenusiansNot fair for MartiansNot fair for Martians
Allowing Multiple Venusians and Allowing Multiple Venusians and Martians in TransitMartians in Transit
semaphore flyingPath = 1;semaphore flyingPath = 1;semaphore MartianLock = 1;semaphore MartianLock = 1;int MartiansInTransit = 0;int MartiansInTransit = 0;
P(MartianLock);P(MartianLock);++MartiansInTransit;++MartiansInTransit;if (MartiansInTransit == 1) {if (MartiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(MartianLock);V(MartianLock);// send the message// send the messageP(MartianLock);P(MartianLock);--MartiansInTransit;--MartiansInTransit;if (MartiansInTransit == 0) {if (MartiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(MartianLock);V(MartianLock);
semaphore VenusianLock = 1;semaphore VenusianLock = 1;int VenusiansInTransit = 0;int VenusiansInTransit = 0;
P(VenusianLock);P(VenusianLock);++VenusiansInTransit;++VenusiansInTransit;if (VenusiansInTransit == 1) {if (VenusiansInTransit == 1) {
P(flyingPath);P(flyingPath);}}V(VenusianLock);V(VenusianLock);// send the message// send the messageP(VenusianLock);P(VenusianLock);--VenusiansInTransit;--VenusiansInTransit;if (VenusiansInTransit == 0) {if (VenusiansInTransit == 0) {
V(flyingPath);V(flyingPath);}}V(VenusianLock);V(VenusianLock);
Allowing Multiple Venusians and Allowing Multiple Venusians and Martians in TransitMartians in Transit
Both sides can transmit efficientlyBoth sides can transmit efficientlyOne side can completely block off the One side can completely block off the
traffic from the other sidetraffic from the other sideFair, since both sides are equally selfish…Fair, since both sides are equally selfish…Fortunately, pigeons do sleepFortunately, pigeons do sleepDaily cycles will break a starvation Daily cycles will break a starvation
condition…condition…
Proving the CorrectnessProving the Correctness
Safety (mutual exclusion)Safety (mutual exclusion): : At most one thread is in the critical section at At most one thread is in the critical section at
any timeany timeAll necessary locks are acquired at the All necessary locks are acquired at the
entrance of a critical sectionentrance of a critical sectionAll shared resources are protectedAll shared resources are protected
Proving the CorrectnessProving the Correctness
Liveness (progress)Liveness (progress):: If more than one thread is interested in If more than one thread is interested in
executing the critical section, some processes executing the critical section, some processes will eventually do so (deadlock free)will eventually do so (deadlock free)
Fairness (bounded waiting)Fairness (bounded waiting)::Every thread that wants to execute the critical Every thread that wants to execute the critical
section will eventually do so (no starvation)section will eventually do so (no starvation)