Globalt tolklås
Ett globalt tolklås ( GIL ) är en mekanism som används i datorspråktolkare för att synkronisera exekveringen av trådar så att endast en inbyggd tråd ( per process) kan köras åt gången. En tolk som använder GIL tillåter alltid att exakt en tråd körs åt gången, även om den körs på en flerkärnig processor . Några populära tolkar som har GIL är CPython och Ruby MRI .
Tekniska bakgrundskoncept
Ett globalt tolklås (GIL) är ett ömsesidigt uteslutningslås som hålls av en tolktråd för programmeringsspråk för att undvika att dela kod som inte är trådsäker med andra trådar . I implementeringar med en GIL finns det alltid en GIL för varje tolkprocess .
Applikationer som körs på implementeringar med en GIL kan designas för att använda separata processer för att uppnå full parallellitet, eftersom varje process har sin egen tolk och i sin tur har sin egen GIL. Annars kan GIL vara ett betydande hinder för parallellism.
Fördelar
Skälen till att använda ett globalt tolklås inkluderar:
- ökad hastighet för enkeltrådade program (ingen nödvändighet att skaffa eller släppa lås på alla datastrukturer separat),
- enkel integration av C- bibliotek som vanligtvis inte är trådsäkra,
- enkel implementering (att ha en enda GIL är mycket enklare att implementera än en låsfri tolk eller en som använder finkorniga lås).
Ett sätt att komma runt en GIL är att skapa en separat tolk per tråd, vilket är för dyrt med de flesta språk.
Nackdelar
Användning av ett globalt tolklås i ett språk begränsar effektivt mängden parallellitet som kan nås genom samtidighet av en enskild tolkprocess med flera trådar. Om processen nästan enbart består av tolkad kod och inte gör anrop utanför tolken som blockerar under långa tidsperioder (så att GIL kan släppas av den tråden medan de bearbetar), kommer det sannolikt att bli mycket liten ökning i hastighet när processen körs på en multiprocessormaskin . På grund av signalering med en CPU-bunden tråd kan det orsaka en betydande nedgång, även på enstaka processorer. Mer allvarligt, när den enda inbyggda tråden anropar en blockerande OS-process (som diskåtkomst), blockeras hela processen, även om andra programtrådar kan vänta.
Exempel
Några språkimplementationer som implementerar ett globalt tolklås är CPython , den mest använda implementeringen av Python , och Ruby MRI , referensimplementeringen av Ruby (där den kallas Global VM Lock) .
JVM -baserade motsvarigheter till dessa språk ( Jython och JRuby ) använder inte globala tolklås. IronPython och IronRuby är implementerade ovanpå Microsofts Dynamic Language Runtime och undviker även att använda en GIL.
Ett exempel på ett tolkat språk utan GIL är Tcl , som används i benchmarkingverktyget HammerDB .