100 likes | 114 Views
Explore critical sections, semaphore usage, mutex, atomic instructions, and sequencing events in operating systems for efficient resource access.
E N D
Synchronization III:Summary CPE 261403 - Operating Systems http://www.e-cpe.org/moodle
Synchronization Topics • Critical Section • Limiting Concurrent Resource Access • Sequencing Events
int Mutex = 1; while (Mutex == 0); Mutex--; // Critical Section Mutex++; Semaphore Mutex = 1; Wait (Mutex); // Critical Section Signal(Mutex); What’s wrong the code on the left?
Non-Atomic instruction • Register1 = Mutex • Decrease register1 • Mutex = register1 • Register2 = Mutex • Decrease register2 • Mutex = register2 • Register1 = Mutex • Register2 = Mutex • Decrease register2 • Mutex = register2 • Decrease register1 • Mutex = register1
Wait(s) Signal(s) Semaphore
Busy Waiting while (Mutex == 0); Wait (Mutex); Very high CPU load!
Semaphore mutex=1; int count=0; void add() { wait(mutex); count++; signal(mutex); } int count=0; Monitor doStuff { Void add() { count++; } } Critical Section
Semaphore db=3; void connectDb() { wait(db); connect(); signal(db); } int MaxDb=3; Monitor doStuff { Void connectDb() { if (MaxDb > 0){ MaxDb--; connect(); MaxDb++; } } } Limiting Concurrent Resource Access
Semaphore buffer=0; void consume() { wait(buffer); removeItem(); } Void Produce() { addItem(); signal(buffer); } Monitor doStuff { Condition buffer; Void consume() { if (bufferLen==0) buffer.wait(); removeItem(); } Void Produce() { addItem(); buffer.signal() } } Sequencing Events