Semaphores in Plan 9

Semaphores in Plan 9

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.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    9 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us