Screen Version
School of Computer Science & Engineering
University of New South Wales

 Advanced Operating Systems 
 COMP9242 2002/S2 
next up previous
Next: Dangers of Locking: Priority Up: 10-smp Previous: Mutual Exclusion Techniques

Subsections

Spin locks

void lock (volatile lock_t *l) {
   while (test_and_set(l)) ;
}
void unlock (volatile lock_t *l) {
   *l = 0;
}

Busy waits. Good idea?

Spin lock busy-waits until lock is released:

Generally restrict spin locking to:

Alternative: Conditional lock

bool cond_lock (volatile lock_t *l) {
   if (test_and_set(l))
      return FALSE; //couldn't lock
   else
      return TRUE;  //acquired lock
}



More appropriate mutex primitive:

void mutex_lock (volatile lock_t *l) {
   while (1) {
      for (int i=0; i<MUTEX_N; i++)
         if (!test_and_set(l))
            return;
      yield();
   }
}

Multiprocessor spin lock:

void mp_spinlock (volatile lock_t *l) {
   cli();    // prevent local contention
   while (test_and_set(l)) ;   // lock
}
void mp_unlock (volatile lock_t *l) {
   *l = 0;
   sti();
}

Multireader locks:

void rw_rdlock (volatile lock_ *l);
void rw_wrlock (volatile lock_ *l);


next up previous
Next: Dangers of Locking: Priority Up: 10-smp Previous: Mutual Exclusion Techniques
Gernot Heiser 2002-10-11