Semaphores in Plan 9

Sape Mullender *All L=>oH=JoHEAI  &)nJMAHF,*AlCEKm

Russ Cox* M16+5)1L +=m>HE@CA,M=II=?DKIAJJI !'

1. Introduction 5Am=FDoHAI =HA noM moHA JD=n " OA=HI ol@. -@ICAH 9.,EjkIJH= @AI?HE>A@ JDAm En -9, %" [,EjkIJH=, '$# En ,KJ?D]. ) IAm=FDoHA EI = non-nAC=JELA EnJACAH MEJD JMo oFAH=JEonI on EJ, P =n@ V. 6DA oHECEn oB JDA n=mAI P =n@ V EI Kn?lA=H. 1n -9, %", ,Ejk­ IJH= ?=llI IAm=FDoHAI seinpalen ,KJ?D BoH IECn=llEnC FoIJI =n@ =IIo?E=JAI V MEJD verhoog En?HAmAnJ/En?HA=IA =n@ P MEJD prolaag, = non-MoH@ HAIAm>lEnC verlaag @A?HAmAnJ/@A?HA=IA. 0A ?onJEnKAI, ‘‘Opm. 2. Vele seinpalen nemen slechts de waarden 0 en 1 aan. In dat geval fungeert de V−operatie als ‘baanvak vrijgeven’; de P− operatie, de tentatieve passering, kan slechts voltooid worden, als de betrokken seinpaal (of seinpalen) op veilig staat en passering impliceert dan een op onveilig zetten.’’ ߢߢ4Am=Hk . M=nO IECn=lI =IIKmA onlO JDA L=lKAI  =n@ . 1n JD=J ?=IA JDA 8-oFAH=JEon BKn?JEonI =I ߢHAlA=IA >lo?kߣ; JDA 2-oFAH=JEon, JDA JAnJ=JELA F=IIEnC, ?=n onlO >A ?omFlAJA@, EB JDA IECn=l oH IECn=lI EnLolLA@ En@E?=JAI ?lA=H, =n@ F=IIEnC JDAn EmFlEAI IAJJEnC EJ Jo IJoF.ߣߣ 6DKI, EJ m=O >A JD=J P =n@ V MAHA EnIFEHA@ >O JDA H=ElM=O JAHmI passeer F=II=n@ verlaat lA=LA. 9A @EI?=H@ JDA H=ElM=O JAHmEnoloCO =n@ KIA JDA l=nCK=CA oB lo?kI: P EI semacquire =n@ V EI semrelease. 6DA + @A?l=H=JEonI=HA: int semacquire(long *addr, int block); long semrelease(long *addr, long count); Semacquire M=EJI BoH JDA IAm=FDoHA L=lKA *addr Jo >A?omA FoIEJELA =n@ JDAn @A?HA­ mAnJI EJ, HAJKHnEnC ; EB JDA block Bl= EI zAHo, semacquire HAJKHnI  H=JDAH JD=n M=EJ. 1B semacquire EI EnJAHHKFJA@, EJ HAJKHnI ߝ . Semrelease En?HAmAnJI JDA IAm=FDoHA L=lKA >O JDA IFA?EBEA@?oKnJ. 2l=n ' [2EkA AJ =l., ''#] D=I JH=@EJEon=llO KIA@ = @EBBAHAnJ IOn?DHonEz=JEon mA?D=­ nEIm, ?=llA@ HAn@AzLoKI. 4An@AzLoKI EI = IOmmAJHE? mA?D=nEIm; JD=J EI, EJ @oAI noJ =IIECn @EBBAHAnJ HolAI Jo JDA JMo FHo?AIIAI EnLolLA@. 6DA BEHIJ FHo?AII Jo ?=ll HAn­ @AzLoKI MEll >lo?k KnJEl JDA IA?on@ @oAI. 1n ?onJH=IJ, IAm=FDoHAI =HA =n =IOmmAJHE? mA?D=nEIm: JDA FHo?AII ANA?KJEnC semacquire ?=n >lo?k >KJ JDA FHo?AII ANA?KJEnC ______* NoM =J /ooClA, MoKnJ=En 8EAM, +=lEBoHnE= '""! semrelease EI CK=H=nJAA@ noJ Jo. 9A =@@A@ IAm=FDoHAI Jo 2l=n ' Jo FHoLE@A = M=O BoH = HA=l-JEmA FHo?AII Jo M=kA KF =noJDAH FHo?AII MEJDoKJ HKnnEnC JDA HEIk oB >lo?kEnC. 5En?A JDAn,MA D=LA =lIoKIA@IAm=FDoHAIBoHABBE?EAnJ FHo?AIIM=kAKF=n@lo?kEnC.

2. Hardware primitives 6DA EmFlAmAnJ=JEonI En JDEI F=FAH =IIKmA D=H@M=HA IKFFoHJ BoH =JomE? HA=@-mo@EBO- MHEJA oFAH=JEonI on = IEnClA mAmoHO lo?=JEon. 6DA BKn@=mAnJ=l oFAH=JEon EI ߢߢ?omF=HA =n@IM=F,ߣߣ MDE?D>AD=LAIlEkA JDEI+ BKn?JEon cas,>KJ ANA?KJAI=JomE?=llO: int cas(long *addr, long old, long new) { /* Executes atomically. */ if(*addr != old) return 0; *addr = new; return 1; } 1n onA =JomE? oFAH=JEon, cas ?DA?kI MDAJDAH JDA L=lKA *addr EI AGK=l Jo old =n@, EB Io, ?D=nCAIEJ Jo new. 1J HAJKHnI= Bl=CJAllEnCMDAJDAHEJ ?D=nCA@ *addr. OB ?oKHIA, cas EI noJ EmFlAmAnJA@ En +. 1nIJA=@, MA mKIJ EmFlAmAnJ EJ KIEnC IFA­ ?E=l D=H@M=HA EnIJHK?JEonI. )ll mo@AHn FHo?AIIoHI FHoLE@A = M=O Jo EmFlAmAnJ ?omF=HA =n@ IM=F. 6DA N&$ =H?DEJA?JKHA IEn?A JDA "&$ FHoLE@AI = @EHA?J ?omF=HA =n@ IM=F EnIJHK?JEon, +M2:+0/. OJDAH FHo?AIIoHIߞEn?lK@EnC JDA )lFD=, )4M, M125, =n@ 2oMAH2+ߞFHoLE@A = F=EH oB EnIJHK?JEonI ?=llA@ lo=@ lEnkA@ LL =n@ IJoHA ?on@EJEon=l 5+. 6DA LL EnIJHK?JEon HA=@I BHom = mAmoHO lo?=JEon, =n@ 5+ MHEJAI Jo = mAmoHO lo?=JEon onlO EB   EJ M=I JDA mAmoHO lo?=JEon KIA@ En JDA l=IJ LL EnIJHK?JEon, =n@   JD=J lo?=JEon D=I noJ >AAn ?D=nCA@ IEn?A JDA LL. On JDoIA IOIJAmI, ?omF=HA =n@ IM=F ?=n >A EmFlA­ mAnJA@EnJAHmIoB LL =n@ 5+. 6DA EmFlAmAnJ=JEonI =lIo KIA =n =JomE? =@@EJEon oFAH=JEon xadd JD=J =JomE?=llO =@@I Jo = L=lKA En mAmoHO, HAJKHnEnC JDA nAM L=lKA. 9A @onߣJ nAA@ =@@EJEon=l D=H@M=HA IKFFoHJ BoH xadd,IEn?A EJ ?=n>A EmFlAmAnJA@KIEnC cas: long xadd(long *addr, long delta) { long v;

for(;;){ v = *addr; if(cas(addr, v, v+delta)) return v+delta; } }

3. User−space semaphores 9A EmFlAmAnJA@ semacquire =n@ semrelease =I kAHnAl-FHoLE@A@ IOIJAm ?=llI. .oH ABBE?EAn?O, EJ EI KIABKl Jo D=LA = IAm=FDoHA EmFlAmAnJ=JEon JD=J, EB JDAHA EI no ?on­ JAnJEon, ?=n HKn AnJEHAlO En KIAH IF=?A, onlO =llEnC >=?k on JDA kAHnAl Jo D=n@lA ?on­ JAnJEon. .ECKHA CELAI JDA EmFlAmAnJ=JEon. 6DA KIAH IF=?A IAm=FDoHA, = Usem, ?on­ IEIJIoB = KIAH-lALAl IAm=FDoHA L=lKA u =n@= kAHnAl L=lKA k: typedef struct Usem Usem; struct Usem { long u; long k; }; 9DAn u EI non-nAC=JELA, EJ HAFHAIAnJI JDA =?JK=l IAm=FDoHA L=lKA. 9DAn u EI nAC=JELA, JDA IAm=FDoHA D=I L=lKA zAHo: =?GKEHAHI mKIJ M=EJ on JDA kAHnAl IAm=FDoHA k =n@ HAlA=IAHImKIJ M=kA JDAmKF. void usemacquire(Usem *s) { if(xadd(&s−>u, −1) < 0) while(semacquire(&s−>k, 1) < 0){ /* Interrupted, retry */ } }

void usemrelease(Usem *s) { if(xadd(&s−>u, 1) <= 0) semrelease(&s−>k, 1); } 1B JDA IAm=FDoHA EI Kn?onJAn@A@, JDA xadd En usemacquire MEll HAJKHn = non-nAC=JELA L=lKA, =LoE@EnC JDA kAHnAl ?=ll. 5EmEl=HlO, JDA xadd En usemrelease MEll HAJKHn = FoIEJELA L=lKA,=lIo=LoE@EnCJDA kAHnAl ?=ll.

4. Scheduling 1n JDA 2l=n ' JDHA=@ lE>H=HO, = FHoCH=m EI m=@A KF oB = ?ollA?JEon oB FHo?AIIAI ID=HEnC mAmoHO. ) JDHA=@ EI = ?oHoKJEnA =IIECnA@ Jo = F=HJE?Kl=H FHo?AII. 9EJDEn = FHo?AII, JDHA=@I I?DA@KlA ?ooFAH=JELAlO. -=?D FHo?AII m=n=CAI JDA JDHA=@I =IIECnA@ Jo EJ, =n@ JDA FHo?AII I?DA@KlAHI HKn =lmoIJ En@AFAn@AnJlO. 6DA onA AN?AFJEon EI JD=J = JDHA=@ En onA FHo?AII mECDJ Co Jo IlAAF BoH AN=mFlA, M=EJEnC on = ?D=nnAl oFAH=JEon =n@ >A MokAn KF >O = JDHA=@ En = @EBBAHAnJ FHo?AII. 6DA JMo FHo?AIIAI nAA@ = M=O Jo ?ooH@E­ n=JA, Io JD=J EB JDA BEHIJ D=I no HKnn=>lA JDHA=@I, EJ ?=n Co Jo IlAAF En JDA kAHnAl, =n@ JDAnJDA IA?on@FHo?AII?=nM=kA EJ KF. 6DA IJ=n@=H@ 2l=n ' JDHA=@ lE>H=HO KIAI HAn@AzLoKI Jo ?ooH@En=JA >AJMAAn FHo­ ?AIIAI. 6DA FHo?AIIAI ID=HA =??AII Jo A=?D oJDAHߣI I?DA@KlEnC GKAKAI: onA FHo?AII EI m=nEFKl=JEnC =noJDAHߣI HKn GKAKA. 6DA FHo?AIIAI mKIJ =lIo ID=HA = Bl=C FHoJA?JA@ >O = IFEn lo?k Jo ?ooH@En=JA, Io JD=J AEJDAH >oJD FHo?AIIAI @A?E@A Jo ?=ll HAn@AzLoKI oH nAE­ JDAH@oAI. .oH JDA HA=l-JEmA JDHA=@ lE>H=HO, MA M=nJA@ Jo HAmoLA =I m=nO IoKH?AI oB >lo?kEnC =I FoIIE>lA, En?lK@EnC JDAIA lo?kI. 9A HAFl=?A@ JDA lo?kA@ HKn GKAKA MEJD = non- >lo?kEnC =HH=O->=IA@ EmFlAmAnJ=JEon oB = FHo@K?AH/?onIKmAH GKAKA. 6D=J EmFlAmAn­ J=JEon EI >AOon@ JDA I?oFA oB JDEI F=FAH. )BJAH m=kEnC JD=J ?D=nCA, JDA onlO lo?k HAm=EnEnC En JDA I?DA@KlAH M=I JDA onA FHoJA?JEnC JDA ߢߢMDAJDAH Jo HAn@AzLoKIߣߣ Bl=C. 6o AlEmEn=JA JD=J onA, MA HAFl=?A@ JDA HAn@AzLoKI MEJD = KIAH-IF=?A IAm=FDoHA ?oKnJ­ EnCJDA nKm>AHoB JDHA=@IonJDA GKAKA. 6o M=EJ BoH = JDHA=@ Jo HKn, JDA FHo?AIIߣI I?DA@KlAH @A?HAmAnJI JDA IAm=FDoHA. 1B JDA HKn GKAKA EI AmFJO, JDA usemacquire MEll >lo?k KnJEl EJ EI noJ. 0=LEnC @onA Io, EJ EI CK=H=nJAA@JD=J JDAHA EI= JDHA=@onJDA HKnGKAKA: // Get next thread to run static Thread* runthread(void) { Proc *p;

p = thisproc(); usemacquire(&p−>nready); return qget(&p−>ready); } 5EmEl=HlO, Jo M=kA KF = JDHA=@ ALAn onA En =noJDAH FHo?AII, EJ IKBBE?AI Jo =@@ JDA JDHA=@JoEJIFHo?AIIߣIHKnGKAKA =n@JDAnEn?HAmAnJ JDA IAm=FDoHA: // Wake up thread t to run in its . static void wakeup(Thread *t) { Proc *p;

p = t−>p; qput(&p−>ready, t); usemrelease(&p−>nready); } 6DEI EmFlAmAnJ=JEon HAmoLAI JDA nAA@ BoH JDA Bl=C =n@ JDA lo?k; moHA EmFoHJ=nJlO, JDA FHo?AII ANA?KJEnC threadwakeup EI CK=H=nJAA@ nALAH Jo >lo?k, >A?=KIA EJ ANA?KJAI usemrelease,noJ usemacquire.

5. Replacing spin locks 6DA 2l=n'KIAH-lALAl EmFlAmAnJ=JEonEI =n =@=FJA@ LAHIEon oB JDA onA KIA@ En JDA kAHnAl. ) lo?k EI HAFHAIAnJA@ >O =n EnJACAH L=lKA:  EI Knlo?kA@, non-zAHo EI lo?kA@. ) FHo?AIIJHEAIJoCH=>JDA lo?k >O KIEnC = JAIJ-=n@-IAJ EnIJHK?JEon Jo ?DA?k MDAJDAH JDA L=lKA EI  =n@, EB Io, IAJ EJ Jo = non-zAHo L=lKA. 1B JDA lo?k EI Kn=L=El=>lA, JDA FHo?AII looFI, JHOEnC HAFA=JA@lO. 1n = mKlJEFHo?AIIoH kAHnAl, JDEI EI = BEnA lo?k EmFlAmAnJ=JEon: JDA lo?k EI DAl@ >O =noJDAH FHo?AIIoH, MDE?D MEll Knlo?k EJ Ioon. 1n KIAH IF=?A, JDEI EmFlAmAnJ=JEon D=I >=@ EnJAH=?JEonI MEJD JDA I?DA@KlAH: EB JDA lo?k EI DAl@ >O =noJDAH FHo?AII JD=J D=I >AAn FHAAmFJA@, IFEnnEnC BoH JDA lo?k MEll noJ =??omFlEID =nOJDEnC. 6DA KIAH-lALAl lo?k EmFlAmAnJ=JEon =@@HAIIAI JDEI >O HAI?DA@KlEnC EJIAlB MEJD (0) >AJMAAn =JJAmFJI =BJAH JDA BEHIJ JDoKI=n@ KnIK??AIIBKl =JJAmFJI. -LAnJK=llO EJ >=?kI oBB moHA,IlAAFEnCBoHmEllEIA?on@I=J = JEmA >AJMAAnlo?k =JJAmFJI. 9A HAFl=?A@ JDAIA IFEn lo?kI MEJD = IAm=FDoHA->=IA@ EmFlAmAnJ=JEon. 7IEnC IAm=FDoHAI =lloMI JDA FHo?AII Jo JAll JDA kAHnAl AN=?JlO MD=J EJ EI M=EJEnC BoH, =LoE@EnC >=@ EnJAH=?JEonI MEJD JDA I?DA@KlAH lEkA JDA onA =>oLA. 6DA IAm=FDoHA->=IA@ EmFlA­ mAnJ=JEonHAFHAIAnJI= lo?k =IJMoL=lKAI,= KIAH-lALAl kAO=n@= kAHnAl IAm=FDoHA: struct Lock { long key; long sem; }; 6DA key ?oKnJI JDA nKm>AH oB FHo?AIIAI EnJAHAIJA@ En Dol@EnC JDA lo?k, En?lK@EnC JDA onA JD=J @oAI Dol@ EJ. 6DKI EB key EI , JDA lo?k EI Knlo?kA@. 1B key EI , JDA lo?k EI DAl@. 1B key EI l=HCAH JD=n , JDA lo?k EI DAl@ >O onA FHo?AII =n@ JDAHA =HA keyߝ FHo?AIIAI M=EJEnCJo=?GKEHA EJ. 6DoIA FHo?AIIAIM=EJ onJDA IAm=FDoHA sem. void lock(Lock *l) { if(xadd(&l−>key, 1) == 1) return; // changed from 0 −> 1: we hold lock // otherwise wait in kernel while(semacquire(&l−>sem, 1) < 0){ /* interrupted; try again */ } }

void unlock(Lock *l) { if(xadd(&l−>key, −1) == 0) return; // changed from 1 −> 0: no contention semrelease(&l−>sem, 1); } LEkA JDA KIAH-lALAl IAm=FDoHA EmFlAmAnJ=JEon @AI?HE>A@ =>oLA, JDA lo?k EmFlAmAnJ=­ JEonD=n@lAIJDA Kn?onJAn@A@?=IA MEJDoKJ nAA@EnCJoAnJAHJDA kAHnAl. 6DA onA IECnEBE?=nJ @EBBAHAn?A >AJMAAn JDA KIAH-lALAl IAm=FDoHAI =>oLA =n@ JDA IAm=FDoHA->=IA@ lo?kI @AI?HE>A@ DAHA EI JDA EnJAHFHAJ=JEon oB JDA KIAH-IF=?A L=lKA. 2l=n ' ?onLAnJEon HAGKEHAI JD=J = zAHoA@ Lock IJHK?JKHA >A =n Knlo?kA@ lo?k. 1n ?on­ JH=IJ, = zAHoA@ Usem IJHK?JKHA EI =n=loCoKI Jo = lo?kA@ lo?k: = usemacquire on = zAHoA@ Usem MEll >lo?k.

6. Kernel Implementation of Semaphores 1nIE@A JDA 2l=n ' kAHnAl, JDAHA =HA JMo kEn@I oB lo?kI: JDA IFEn lo?k Lock IFEnI KnJEl JDA lo?k EI =L=El=>lA, =n@ JDA GKAKEnC lo?k QLock HAI?DA@KlAI JDA ?KHHAnJ FHo?AII KnJEl JDA lo?k EI =L=El=>lA. *A?=KIA =??AIIEnC KIAH mAmoHO mECDJ ?=KIA = lAnCJDO F=CA B=KlJ, JDA kAHnAl @oAI noJ =lloM = FHo?AII Jo Dol@ = Lock MDElA =??AIIEnC KIAH mAmoHO. 5En?A JDA IAm=FDoHA EI IJoHA@ En KIAH mAmoHO, JDAn, JDA o>LEoKI EmFlAmAnJ=JEon EI Jo =?GKEHA = QLock, FAHBoHm JDA IAm=FDoHA oFAH=JEonI, =n@ JDAn HAlA=IA EJ. 7nBoHJKn=JAlO, JDEI EmFlAmAnJ=JEon ?oKl@ ?=KIA semrelease Jo HAI?DA@KlA MDElA =?GKEHEnC JDA QLock, nAC=J­ EnC JDA m=En >AnABEJ oB IAm=FDoHAI BoH HA=l-JEmA FHo?AIIAI. ) moHA ?omFlAN EmFlA­ mAnJ=JEon EI nAA@A@. 6DEI IA?JEon @o?KmAnJI JDA EmFlAmAnJ=JEon. 1J EI noJ nA?AII=HO JoKn@AHIJ=n@JDA HAIJ oB JDA F=FAH=n@?=n>A IkEFFA@onBEHIJ HA=@EnC. -=?D semacquire ?=ll HA?oH@I EJI F=H=mAJAHI En = Sema @=J= IJHK?JKHA =n@ =@@I EJ Jo = lEIJ oB =?JELA ?=llI =IIo?E=JA@ MEJD = F=HJE?Kl=H Segment = ID=HA@ mAmoHO HACEon. 6DA Sema IJHK?JKHA ?onJ=EnI = kAHnAl Rendez BoH KIA >O IlAAF =n@ M=kAKF IAA [2EkA AJ =l., '' ],JDA =@@HAII,=n@= waiting Bl=C: struct Sema { Rendez; long *addr; int waiting; Sema *next; Sema *prev; }; 6DA lEIJ EI FHoJA?JA@ >O = Lock, MDE?D ?=nnoJ ?=KIA JDA FHo?AII Jo HAI?DA@KlA. 6DA IAm=FDoHA L=lKA *addr EI IJoHA@ En KIAH mAmoHO. 6DKI, MA ?=n =??AII JDA lEIJ onlO MDAn Dol@EnC JDA lo?k =n@ MA ?=n =??AII JDA IAm=FDoHA L=lKA onlO MDAn noJ Dol@EnC JDA lo?k. 6DA DAlFAHBKn?JEonI void semqueue(Segment *s, long *addr, Sema *p); void semdequeue(Segment *s, long *addr, Sema *p); void semwakeup(Segment *s, long *addr, int n); =ll m=nEFKl=JA JDA IACmAnJߣI lEIJ oB Sema IJHK?JKHAI. 6DAO =?GKEHA JDA =IIo?E=JA@ Lock, FAHBoHm JDAEH oFAH=JEonI, =n@ HAlA=IA JDA lo?k >ABoHA HAJKHnEnC. Semqueue =n@ semdequeue =@@ p Jo oH HAmoLA p BHom JDA lEIJ. Semwakeup M=lkI JDA lEIJ lookEnC BoH n Sema IJHK?JKHAI MEJD p.waiting IAJ. 1J ?lA=HI p.waiting =n@ JDAn M=kAI KF JDA ?oHHA­ IFon@EnCFHo?AII. 7IEnC JDoIA DAlFAH BKn?JEonI, JDA >=IE? EmFlAmAnJ=JEon oB semacquire =n@ semrelease EI: int semacquire(Segment *s, long *addr) { Sema phore;

semqueue(s, addr, &phore); for(;;){ phore.waiting = 1; if(canacquire(addr)) break; sleep(&phore, semawoke); } semdequeue(s, &phore); semwakeup(s, addr, 1); return 1; }

long semrelease(Segment *s, long *addr, long n) { long v;

v = xadd(addr, n); semwakeup(s, addr, n); return v; } 6DEI LAHIEon omEJI JDA @AJ=ElI =IIo?E=JA@ MEJD HAJKHnEnC ߝ MDAn EnJAHHKFJA@ =n@ =lIo MEJDnon->lo?kEnC?=llI. Semacquire =@@I = Sema Jo JDA IACmAnJߣI lEIJ =n@ IAJI phore.waiting. 6DAn EJ =JJAmFJI Jo =?GKEHA JDA IAm=FDoHA. 1B EJ EI KnIK??AIIBKl, EJ CoAI Jo IlAAF. 6o =LoE@ mEIIA@ M=kAKFI, sleep ?=llI semawoke >ABoHA ?ommEJJEnC Jo IlAAFEnC; semawoke IEmFlO ?DA?kI phore.waiting. -LAnJK=llO, canacquire HAJKHnI JHKA, >HA=kEnC oKJ oB JDA looF. 6DAn semacquire HAmoLAIEJI Sema BHomJDA lEIJ =n@HAJKHnI. 6DA ?=ll Jo semwakeup =J JDA An@ oB semacquire ?oHHA?JI = IK>JlA H=?A JD=J MA BoKn@ KIEnC 5FEn. 5KFFoIA FHo?AII ) ?=llI semacquire =n@ JDA IAm=FDoHA D=I L=lKA . Semacquire GKAKAI EJI Sema =n@ IAJI phore.waiting, canacquire IK??AA@I JDA IAm=­ FDoHA L=lKA EI noM , =n@ semacquire >HA=kI oKJ oB JDA looF. 6DAn FHo?AII * ?=llI semacquire: EJ =@@I EJIAlB Jo JDA lEIJ, B=ElI Jo =?GKEHA JDA IAm=FDoHA JDA L=lKA EI , =n@ CoAI Jo IlAAF. NoM FHo?AII + ?=llI semrelease: EJ En?HAmAnJI JDA IAm=FDoHA JDA L=lKA EI noM  =n@ lookI BoH = IEnClA Sema En JDA lEIJ Jo M=kA KF. 1J BEn@I )ߣI, ?DA?kI JD=J phore.waiting EI IAJ, =n@ JDAn ?=llI JDA kAHnAl wakeup Jo M=kA ). 7nBoHJKn=JAlO, ) nALAH MAnJ Jo IlAAF. 6DA M=kAKF EI loIJ on ), MDE?D D=@ =lHA=@O =?GKEHA@ JDA IAm=­ FDoHA. 1B ) IEmFlO HAmoLA@ EJI Sema BHom JDA lEIJ =n@ HAJKHnA@, JDA IAm=FDoHA L=lKA MoKl@ >A MEJD * IJEll =IlAAF. 6o =??oKnJ BoH JDA FoIIE>lO loIJ M=kAKF, ) mKIJ JHECCAH onA ANJH= semwakeup =I EJ HAJKHnI. 6DEI =LoE@I JDA H=?A, =J JDA ?oIJ oB =n KnnA?AII=HO >KJ D=HmlAIIM=kAKFMDAnJDA H=?A D=InoJ D=FFAnA@.

7. Performance 6o mA=IKHA JDA ?oIJ oB IAm=FDoHA IOn?DHonEz=JEon, MA MHoJA = FHoCH=m En MDE?D JMo FHo?AIIAIFEnC-FonC>AJMAAnJMoIAm=FDoHAI: 2Ho?AII >lo?kIonJDA =?GKEIEJEonoB 5Am=FDoHA , 2Ho?AII HAlA=IAI5Am=FDoHA =n@>lo?kIon5Am=FDoHA , 2Ho?AII HAlA=IAI5Am=FDoHA =n@>lo?kIon5Am=FDoHA , 6DEI looF ANA?KJAI = mEllEon JEmAI. 9A =lIo JEmA@ = FHoCH=m JD=J @oAI JMo mEllEon =?GKEHAI =n@ JMo mEllEon HAlA=IAI on = IAm=FDoHA EnEJE=lEzA@ JoJMomEllEon,IoJD=J nonA oB JDA ?=llI MoKl@ >lo?k. 1n >oJD ?=IAI, JDAHA MAHA = JoJ=l oB BoKH mEllEon IOIJAm ?=llI; JDA FEnC-FonC?=IA =@@IJMomEllEon?onJANJ IMEJ?DAI. 6=>lA CELAIJDA HAIKlJI.

time per (microseconds) ______processor cpus ping−pong semacquire semrelease 2AnJEKm111/:Aon,#'&M0z . & .!# .' 2AnJEKm111/:Aon,%'%M0z .&&% .'"' .!& 2AnJEKm18/:Aon, '$M0z " .'% .!& .&" )M,$",  M0z .& . $$ .! $

Table 1 5Am=FDoHAIOIJAm?=llFAHBoHm=n?A.

time per lock operation (microseconds) ______processor cpus spin locks locks 2AnJEKm111/:Aon,#'&M0z #." #." 2AnJEKm111/:Aon,%'%M0z &. #.$ )M,$",  M0z .$ .# 2AnJEKm18/:Aon, '$M0z " "!.& ".'

Table 2 2AHBoHm=n?AoBIFEnlo?kILAHIKIIAm=FDoHAlo?kI.

NANJ, MA lookA@ =J lo?k FAHBoHm=n?A, ?omF=HEnC JDA ?onLAnJEon=l 2l=n ' lo?kI BHom libc Jo JDA nAM onAI KIEnC IAm=FDoHAI BoH IlAAF =n@ M=kAKF. 9A H=n ,oKC M?1lHoOߣI FoMAH IAHEAI FHoCH=m [M?1lHoO, ''], MDE?D IFAn@I =lmoIJ =ll EJI JEmA En ?D=nnAl ?ommKnE?=JEon. 6DA 2l=n ' JDHA=@ lE>H=HOߣI ?D=nnAl EmFlAmAnJ=JEon KIAI = IEnClA Clo>=l lo?k Jo ?ooH@En=JA =ll ?D=nnAl =?JELEJO, En@K?EnC = l=HCA =moKnJ oB lo?k ?on­ JAnJEon. 6DA =FFlE?=JEon ?HA=JAI = JDoKI=n@ FHo?AIIAI =n@ m=kAI %,$! lo?k ?=llI. 6DA nKm>AH oB lo?kI En JDA IAm=FDoHA LAHIEon JD=J HAGKEHA M=EJEnC E.A., = IAm=?GKEHA EI @onA L=HEAI MEl@lO. 1n  HKnI, JDA Im=llAIJ nKm>AH MA I=M M=I %, JDA l=HCAIJ M=I "',=n@JDA =LAH=CA M=I &&. 6=>lA IDoMI JDA FAHBoHm=n?A HAIKlJI. 5KHFHEIEnClO, JDA FAHBoHm=n?A @EBBAHAn?A M=I moIJ FHonoKn?A@ on mKlJEFHo?AIIoHI. N=ELAlO, onA MoKl@ ANFA?J JD=J IFEnnEnC MoKl@ D=LA IomA >AnABEJ on mKlJEFHo?AIIoHI MDAHA=I EJ ?oKl@ D=LA no >AnABEJ on KnEFHo?AIIoHI, >KJ EJ JKHnI oKJ JD=J IFEnnEnC MEJDoKJ HAI?DA@KlEnC JDA BEHIJ  JHEAI D=I no ABBA?J on FAHBoHm=n?A. +onJAnJEon onlO o??KHI IomA # oH Io JEmAI, =n@ JDA JEmA EJ J=kAI Jo IFEn #, JEmAI EI En JDA noEIA. 6DA @EBBAHAn?A >AJMAAn KnEFHo?AI­ IoHI =n@ mKlJEFHo?AIIoHI DAHA EI JD=J on KnEFHo?AIIoHI, JDA BEHIJ sleep(0) MEll FKJ JDA FHo?AII M=EJEnC BoH JDA lo?k =J JDA >=?k oB JDA HA=@O GKAKA Io JD=J, >O JDA JEmA EJ EI I?DA@KlA@ =C=En, JDA lo?k MEll lEkAlO >A =L=El=>lA. On mKlJEFHo?AIIIoHI, ?onJAnJEon BHom oJDAH FHo?AIIAI HKnnEnC IEmKlJ=nAoKIlO m=kAI OEAl@EnC lAII ABBA?JELA. 1J EI =lIo lEkAlO JD=J JDA HAFA=JA@ =JomE? HA=@-mo@EBO-MHEJA EnIJHK?JEonI, =I En JDA JECDJ looF oB JDA IFEn lo?k,?=nIloM JDA AnJEHA mKlJEFHo?AIIoH. 6DA FAHBoHm=n?A oB JDA IAm=FDoHA->=IA@ lo?k EmFlAmAnJ=JEon EI IomAJEmAI mK?D >AJJAH, =n@ nALAH noJE?A=>lO MoHIA, JD=n JDA IFEn lo?kI. 9A MEll HAFl=?A JDA IFEn lo?k EmFlAmAnJ=JEonEnJDA 2l=n'@EIJHE>KJEonIoon.

8. Comparison with other approaches )nO oFAH=JEnC IOIJAm MEJD ?ooFAH=JEnC FHo?AIIAI mKIJ FHoLE@A =n EnJAHFHo?AII IOn?DHonEz=JEon mA?D=nEIm. 1J EI EnIJHK?JELA Jo ?onJH=IJ JDA IAm=FDoHAI @AI?HE>A@ DAHA MEJDmA?D=nEImIEnoJDAHIOIJAmI. M=nO IOIJAmIߞBoH AN=mFlA, *5,, M=?D, O5 :, =n@ ALAn 5OIJAm 8 7N1:ߞFHoLE@A IAm=FDoHAI [*=?D, '&$]. 1n =ll JDoIA IOIJAmI, IAm=FDoHAI mKIJ >A ANFlE?EJlO =llo?=JA@ =n@ @A=llo?=JA@, m=kEnC JDAm moHA ?Km>AHIomA Jo KIA JD=n semacquire =n@ semrelease. 9oHIA, IAm=FDoHAI En JDoIA IOIJAmI o??KFO = Clo>=l E@ IF=?A, Io JD=J EJ EI FoIIE>lA Jo HKn JDA IOIJAm oKJ oB IAm=FDoHAI jKIJ >O HKnnEnC FHoCH=mI JD=J =llo?=JA IAm=FDoHAI >KJ nAClA?J Jo @A=llo?=JA JDAm oH ?H=ID. 6DA 2l=n ' IAm=FDoHAI E@AnJEBO IAm=FDoHAI >O = ID=HA@ mAmoHO lo?=JEon: JMo FHo?AIIAI =HA J=lkEnC =>oKJ JDA I=mA IAm=FDoHA EB *addr EI JDA I=mA MoH@ oB FDOIE?=l mAmoHO En >oJD. .KHJDAH, JDAHA EI no kAHnAl-HAIE@AnJ IAm=FDoHA IJ=JA AN?AFJ MDAn semacquire EI >lo?kEnC. 6DEI m=kAI JDA IAm=FDoHA lA=kIoB 5OIJAm8 EmFoIIE>lA. LEnKN FHoLE@AI = loMAH-lALAl IOIJAm ?=ll n=mA@ BKJAN [.H=nkA =n@ 4KIIAll,  ]. .KJAN EI AIIAnJE=llO ߢߢ?omF=HA =n@ IlAAF,ߣߣ m=kEnC EJ = Coo@ m=J?D BoH ?omF=HA =n@ IM=F->=IA@ =lCoHEJDmI. .KJAN =lIo m=J?DAI FHo?AIIAI >=IA@ on ID=HA@ FDOIE?=l mAm­ oHO, =LoE@EnC JDA 5OIJAm 8 lA=k FHo>lAm. *A?=KIA BKJAN onlO FHoLE@AI ߢߢ?omF=HA =n@ IlAAFߣߣ =n@ ߢߢM=kAKF,ߣߣ BKJAN->=IA@ =lCoHEJDmI =HA HAGKEHA@ Jo D=n@lA JDA Kn?onJAn@A@ ?=IAI En KIAH IF=?A, lEkA oKH KIAH-lALAl IAm=FDoHA =n@ nAM lo?k EmFlAmAnJ=JEonI @o. 6DEI m=kAI BKJAN->=IA@ EmFlAmAnJ=JEonI ABBE?EAnJ; KnBoHJKn=JAlO, JDAO =HA =lIo GKEJA IK>JlA. 6DA oHECEn=l AN=mFlA ?o@A @EIJHE>KJA@ MEJD BKJANAI M=I MHonC; = ?oHHA?J LAHIEon M=I onlO FK>lEIDA@ = OA=H l=JAH [,HAFFAH, !]. 1n ?onJH=IJ, IAm=FDoHAI =HA lAII CAn­ AH=l >KJ A=IEAHJoKn@AHIJ=n@=n@JoKIA ?oHHA?JlO. References [*=?D, '&$] M.J.*=?D, The Design of the ,2HAnJE?A 0=ll, '&$ [,EjkIJH=, '$#] -.9.,EjkIJH=,ߢߢOLAH5AEnF=lAnߣߣ, EWD74, '$#. DJJF://MMM.?I.KJAN=I.A@K/KIAHI/-9,/AM@NN/-9,%".2,., DJJF://MMM.?I.KJAN=I.A@K/KIAHI/-9,/JH=nI?HEFJEonI/-9,NN/-9,%".DJml [,HAFFAH, !] 7.,HAFFAH,ߢߢ.KJANAI=HA 6HE?kO,ߣߣ FK>lEIDA@onlEnA =J DJJF://FAoFlA.HA@D=J.?om/@HAFFAH/BKJAN.F@B. [.H=nkA =n@4KIIAll,  ] ߢߢ.KII, .KJANAI, =n@ .KHMo?kI: .=IJ 7IAHlALAl Lo?kEnC En LEnKN,ߣߣ Proceedings of the 2002 Ottawa Symposium,OJJ=M=,+=n=@=,  ,FF."%'ߝ"'#. [0olzm=nn, '' ] /.J.0olzm=nn, Design and Validation of Protocols,2HAnJE?A 0=ll, '' [2EkA AJ =l., '' ] 4. 2EkA, ,. 2HAIoJJo, K. 6DomFIon, =n@ /. 0olzm=nn, ߢߢ2Ho?AII IlAAF =n@ M=kAKF on = ID=HA@ mAmoHO mKlJEFHo?AIIoH,ߣߣ Proceedings of the Spring 1991 EurOpen Conference,6HomIø,NoHM=O, '' ,FF. $ ߝ $$. [2EkA AJ =l., ''#] 4. 2EkA, ,. 2HAIoJJo, 5. ,oHM=H@, *. .l=n@HAn=, K. 6DomFIon, 0. 6HE?kAO, 2. 9EnJAH­ >oJJom, ߢߢ2l=n ' BHom *All L=>Iߣߣ, Computing Systems, 8!, 5KmmAH ''#, FF. ߝ #" [2l=n', ] Plan 9 Manual,!H@A@EJEonFK>lEIDA@onlEnA =J DJJF://Fl=n'.>All-l=>I.?om/IOI/m=n