plan
play

Plan Project: Due CSCI [4|6]730 After Exam 1. Next Week - PDF document

Plan Project: Due CSCI [4|6]730 After Exam 1. Next Week Operating Systems Deadlock, finish synchronization Exam 1. Course Progress: Synchronization Part 2 History, Structure, Processes, Threads, IPC,


  1. Plan • Project: Due CSCI [4|6]730 – After Exam 1. • Next Week – Operating Systems – Deadlock, finish synchronization – Exam 1. • Course Progress: Synchronization Part 2 – History, Structure, Processes, Threads, IPC, Synchronization • Exam 1. Will cover these topics. – + all papers (25% of exam content). – Remainder: Deadlock, • Memory and File • Disk Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Process Synchronization Part II Hardware Primitives • How does hardware facilitate synchroniza3on? Many modern operating systems provide special synchronization hardware to provide more powerful atomic operations • What are problems of the hardware primi3ves? • testAndSet( lock ) • What is a spin lock and when is it appropriate? – atomically reads the original value of lock and then sets it to true. • What is a semaphore and why are they needed? • Swap( a, b ) – atomically swaps the values • Classical synchroniza3on problems? • compareAndSwap( a, b ) – What is the Dining Philosophers Problem and what is ‘a good’ – atomically swaps the original value of lock and sets it to true when they values are different solu3on? • fetchAndAdd( x, n ) – atomically reads the original value of x and adds n to it. Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Hardware: testAndSet(); Hardware: Swap(); void Swap( boolean *a, boolean *b ) boolean testAndSet ( boolean *lock ) { { // initialization boolean temp = *a ; boolean old_lock = lock ; lock = false ; // global shared -- lock is available *a = *b; lock = true; // initialization void deposit( int amount ) *b = temp; return old_lock; lock = false ; // shared -- lock is available { } } void deposit( int amount ) // entry critical section - get local variable key { key = true; // key is a local variable // entry to critical section - get the lock while( key == true ) Swap( &lock, &key ); while( testAndSet( &lock ) == true ) {} ; balance += amount // critical section balance += amount // critical section // exit critical section - release the lock // exit critical section - release the lock lock = false; lock = false; } } • Two Parameters: a global and local (when lock is available (false) • If someone has the lock (it returns TRUE) and wait until it get local key (false)). • Atomicity guaranteed - even on multiprocessors is available (until some-one gives it up, sets it to false). • Bounded waiting? • Atomicity guaranteed - even on multiprocessors – No! How to provide? Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA

  2. Hardware with Bounded Waiting Hardware with Bounded Waiting // initialization lock = false ; // shared -- lock is available • Need to create a waiting line. waiting[0.. n-1] = {false} ; // shared -- no one is waiting void deposit( int amount ) • Idea: � Dressing Room � is the critical { // entry to critical section section, only one person can be in the room waiting[tid] = true; // signal tid is waiting at one time, and one waiting line outside key = true; // local variable while( ( waiting[tid] == true ) and ( key == true ) ) dressing room that serves customer first key = testAndSet( &lock ); waiting[tid] = false; // got lock done waiting come first serve. balance += amount // critical section – waiting[n] : Global shared variable // exit critical section - release the lock – lock : Global shared variable j = (tid + 1) mod n; // j is possibly waiting next in line • Entry get a local variable � key � and check while( ( j != tid ) and ( waiting[j] == false ) ) j = (j + 1) mod n; // check next if waiting via testAndSet() if someone is � in � the if( j == tid ) // no one is waiting unlock room lock = false; dressing room else waiting[j] = false // hand over the key to j } Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Hardware Solution: Proof Synchronization Layering � Intuition � • Build higher-level synchronization primitives in OS • Mutual Exclusion: – Operations that ensure correct ordering of instructions across – A thread enters only if it is waiting or if the dressing room is threads unlocked • Motivation: Build them once and get them right • First thread to execute testAndSet( &lock ) gets the lock all others will wait – Don � t make users write entry and exit code • Waiting becomes false only if the thread with the lock leaves its CS and only one waiting is set to false. • Progress: Monitors *Locks – Since an exiting thread either unlocks the dressing room or hands the � lock � to another thread progress is guaranteed because both allow a waiting thread access to the dressing Condition Variables *Semaphores room • Bounded Waiting: Loads Test&Set – Leaving threads scans the waiting array in cyclic order thus Stores any waiting thread enters the critical section within n-1 turns. Disable Interrupts Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Locks Lock Examples • Goal: Provide mutual exclusion (mutex) • After lock has been allocated and initialized – The other criteria for solving the critical section problem may be violated void deposit( int amount ) • Three common operations: { pthread_mutex_lock( &my_lock ); Allocate and Initialize balance += amount; // critical section pthread_mutex_unlock( &my_lock ); pthread_mutex_t mylock; } mylock = PTHREAD_MUTEX_INITIALIZER; Acquire ● One lock for each bank account (maximize Acquire exclusion access to lock; Wait if lock is not available concurrency) pthread_mutex_lock( &mylock ); Release void deposit( int account_tid, int amount ) { Release exclusive access to lock pthread_mutex_lock( &locks[account_tid] ); pthread_mutex_unlock( &mylock ); balance[account_tid] += amount; // critical section pthread_mutex_unlock( &locks[account_tid] ); } Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA

  3. Implementing Locks: Implementing Locks: Atomic loads and stores Hardware Instructions (now) typedef boolean lock_s; typedef struct lock_s void acquire( lock_s *lock ) bool lock[2] = {false, false}; while( true == testAndSet( theLock ) ) {} ; // wait int turn = 0; void release( lock_s lock ) void acquire( lock_s *lock ) lock = false; lock->lock[tid] = true; turn = 1-tid; while( lock->lock[1-tid] && lock->turn ==1-tid ) • Advantage: Supported on multiple processors • Disadvantages: void release( lock_s lock ) – Spinning on a lock may waste CPU cycles lock->lock[tid] = false; – The longer the CS the longer the spin • Greater chance for lock holder to be interrupted too! • Disadvantage: Two threads only Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Implementing Locks: Spin Locks and Disabling Disable/Enable Interrupts Interrupts • Spin locks and disabling interrupts are useful only for short and simple critical sections (not computational or I/O intensive): void acquire( lock_s *lock ) disableInterrupts(); – Wasteful otherwise – These primitives are primitive -- don ’ t do anything besides mutual void release( lock_s lock ) exclusion (doesn’t ‘solve’ the critical section problem). enableInterrupts(); • Need a higher-level synchronization primitives that: • Block waiters • Leave interrupts enabled within the critical section • Advantage: Supports mutual exclusion for many threads – All synchronization requires atomicity (prevents context switches) • So we’ll use our � atomic � locks as primitives to implement them • Disadvantages: – Not supported on multiple processors, – Too much power given to a thread (may not release lock_ – May miss or delay important events Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Semaphores Blocking in Semaphores • Idea: Associated with each semaphore is a queue of waiting processes (typically the ones that want to get into the critical • Semaphores are another data structure that section) provides mutual exclusion to critical sections • wait() tests (probes) the semaphore (DOWN) (wait to get – Described by Dijkstra in the THE system in 1968 in). – Key Idea: A data structure that counts number of � wake- – If semaphore is open, thread continues ups � that are saved for future use. – If semaphore is closed, thread blocks on queue • signal() opens (verhogen) the semaphore (UP): (lets • Block waiters, interrupts enabled within CS others in) • Semaphores have two purposes: – If a thread is waiting on the queue, the thread is unblocked – Mutual Exclusion: Ensure threads don � t access critical – If no threads are waiting on the queue, the signal is remembered section at same time for the next thread (i.e., it stores the � wake-up � ). – Scheduling constraints (ordering) Ensure thhat threads • signal() has history execute in specific order (implemented by a waiting • This � history � is a counter queue). Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA Maria Hybinette, UGA

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend