
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=C 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 B=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. Thread 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 process. 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 Lock 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.
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages9 Page
-
File Size-