More on Semaphores Andy Wang Operating Systems COP 4610 / CGS 5765

Preview:

Citation preview

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)