Garbage Collection Issue

IGotD- nise at nise.com
Mon Jun 1 19:37:23 UTC 2020


On Monday, 1 June 2020 at 12:37:05 UTC, Steven Schveighoffer 
wrote:
>
> I was under the impression that TLS works by altering a global 
> pointer during the context switch. I didn't think accessing a 
> variable involved a system call.
>
> For sure they are slower than "normal" variables, but how much 
> slower? I'm not sure.
>

It depends, there several different optimizations possible. This 
is essentially the difference between the -fPIC and -fpie flag 
GNU compilers. -fpie can optimize TLS so that it is an offset 
from a certain register (fs or gs with x86). Otherwise the 
compiler insert __tls_get_addr. Typically shared objects gets 
this call, but the executable can optimize. So if druntime is a 
shared object, it will use __tls_get_addr. TLS variables will not 
be major hit if used moderately, used in a loop, then you will 
certainly see a performance hit.

>
> This can only take you so far, when the language uses TLS by 
> default. The GC has to support scanning TLS and so it uses TLS 
> to track thread-specific data.
>

Yes, this was some of the annoyance I had when porting druntime. 
The thread startup code needed to use link library (like 
elf/link.h for linux) in order to obtain the entire TLS area 
(areas because there a several of them). This includes scanning 
sections during startup and it becomes even more complicated with 
runtime loaded modules. Basically there is a lot of boiler plate 
in druntime just for reading the executable format. druntime has 
tons of elf stuff in it just to load a program something I'm not 
too keen on, because it's a lot of code and you need to support 
all the quirks with different CPU archs and operating systems. 
You'd want druntime to be more OS agnostic a let the OS services 
deal with the TLS stuff. The only upside can be that you can have 
a full symbolic stack trace during aborts when a poking in the 
executable formats.

Well, that's how it is because of GC and there is not really any 
way around it. A non tracing GC would not have this requirement 
though. When you dig into these details you realize how heavy the 
D language really is and some solutions get negative beauty 
points.









More information about the Digitalmars-d-learn mailing list