Globalt tolklås

Global Interpreter Lock ( GIL ) är en  trådsynkroniseringsmetod som används i vissa tolkade programmeringsspråk , som Python och Ruby .

Kärnan i konceptet

GIL är det enklaste sättet att undvika konflikter när olika trådar kommer åt samma minne samtidigt [1] . När en tråd tar tag i den, blockerar GIL, som fungerar som en mutex , de andra. Inga parallella trådar - inga konflikter vid åtkomst till delade objekt. Ordningen för exekvering av trådar bestäms av tolken beroende på implementeringen, växling mellan trådar kan ske: när en aktiv tråd försöker utföra I/O , efter att gränsen för utförda instruktioner har förbrukats , eller av en timer [2] .

Fördelar och nackdelar

Den största nackdelen med GIL - trådssäkra tillvägagångssätt är begränsningen av parallellism . GIL tillåter inte att uppnå den största beräkningseffektiviteten när man arbetar på system med flera kärnor och flera processorer [3] . Användningen av flera trådar medför också overhead på deras växling på grund av effekten av konflikt (trådar "försöker" att fånga upp GIL). Det vill säga, multitrådad exekvering kan ta längre tid än sekventiell exekvering av samma uppgifter [4] .

Skäl att använda GIL:

Applikation

GIL används i CPython , den vanligaste implementeringen av Python- tolken [5] , och i Ruby MRI , referensimplementeringen av Ruby -tolken , där den kallas Global VM Lock .

Framställningar och öppna brev har dykt upp på nätet mer än en gång och bett dem att ta bort GIL från Python [6] . Men skaparen och den " generösa livslånga diktatorn " av projektet, Guido van Rossum , säger att GIL inte är så dåligt och kommer att finnas i CPython tills någon annan introducerar en Python-implementation utan GIL, med vilken enkeltrådade skript fungerade precis lika snabbt [7] [8] .

JVM ( Jython , JRuby ) och .NET ( IronPython , IronRuby ) tolkimplementeringarna använder inte GIL [9] [10] .

Som en del av PyPy- projektet pågår arbete med att implementera transaktionsminne ( engelsk  Software Transactional Memory, STM ). Just nu[ vad? ] även vid flertrådiga beräkningar arbetar tolken med STM många gånger långsammare än med GIL. Men på grund av JIT är PyPy-STM [11] fortfarande snabbare än CPython [12] .

Anteckningar

  1. Trådtillstånd och det globala tolklåset . Datum för åtkomst: 21 december 2013. Arkiverad från originalet 24 december 2013.
  2. Antoine Pitrou. Omarbetar GIL . Python Mailing Lists (25 oktober 2009). Hämtad 21 december 2013. Arkiverad från originalet 10 juni 2011.
  3. GIL Beskrivning . Python Wiki . Datum för åtkomst: 21 december 2013. Arkiverad från originalet 24 december 2013.
  4. David Beazley. Inuti Python GIL . Chicago: Chicago Python User Group (11 juni 2009). Tillträdesdatum: 7 oktober 2009. Arkiverad från originalet den 24 december 2010.
  5. Shannon-jj Behrens. Samtidighet och Python 2 . Dobb's Journal (3 februari 2008). Hämtad 12 juli 2008. Arkiverad från originalet 26 juni 2008.
  6. Ett öppet brev till Guido van Rossum: Herr Rossum, riv ner den GIL! (inte tillgänglig länk) . SnapLogic (9 september 2007). Arkiverad från originalet den 24 december 2013. 
  7. Guido van Rossum . GIL:s framtid . Python Mailing Lists (8 maj 2007). Hämtad 21 december 2013. Arkiverad från originalet 9 november 2020.
  8. Guido van Rossum. Det är inte lätt att ta bort GIL . artima.com (10 september 2007). Hämtad 21 december 2013. Arkiverad från originalet 6 juni 2019.
  9. VarförJython . Python Wiki. Datum för åtkomst: 21 december 2013. Arkiverad från originalet 22 december 2013.
  10. IronPython . Python Wiki. Hämtad 4 april 2011. Arkiverad från originalet 12 juni 2011.
  11. [https://web.archive.org/web/20131224175835/http://bitbucket.org/pypy/pypy/raw/stm-thread/pypy/doc/stm.rst Arkiverad 24 december 2013 på Wayback Machine PyPy-STM på Bitbucket ]
  12. Uppdatering på STM . Python Wiki (16 oktober 2013). Datum för åtkomst: 21 december 2013. Arkiverad från originalet 24 december 2013.