[gclist] A problem with the Baker treadmill.

David Petrie Stoutamire david@stoutamire.com
Tue, 14 Jan 1997 12:35:14 -0800

James McCartney wrote:
> >I can confirm that writing your own spinlocks is the
> >right thing to do.
> It doesn't matter if the lock is only for a few instructions if the
> scheduler decides your time slice is up at that moment.
> If you are trying to do anything real time on a multitasking system
> you can't afford a spin lock. If a suspended thread holds the lock
> then you will wind up spinning for your entire CPU time slice.
> The only place where I could see using a spin lock would be on
> a multiprocessor system where each processor runs single threaded.

This is true for timesliced, real time processes.  However, by
default threads in Solaris aren't time sliced - they don't get
preempted until some synchronization event, signal, or process
swap occurs.  Of course they could be, but empirically they just
aren't for Sparcs under Solaris 2.{3,4,5}.

If they were, there are other, weirder tricks that could be played,
like catching the LWP signal that actually causes preemption.

The devil is in the details, and I agree the tradeoffs can be made
to go the other way.  Here are some microbenchmark results for a 4
cpu SS10 @ 40Mhz, times in usecs:

   Uncontested lock                   1.33
   Uncontested semaphore              6.29
   Uncontested spinlock               0.31
   Lock ping-pong                   256.06
   Semaphore ping-pong              254.04
   Spinlock ping-pong                 2.03

These are spinlocks with exponential backoff to avoid congesting 
the bus.  (I realize these numbers don't deal with my claim about
preemption not mattering, but I happened to have them handy.)

   - Dave

David Stoutamire