Ho suggerito ai manutentori del runtime del linguaggio di programmazione D alcune volte che l'allocatore di memoria/garbage collector dovrebbe utilizzare spinlock invece delle normali sezioni critiche del sistema operativo. Questo non ha davvero preso piede. Qui ci sono le ragioni per cui credo spinlocks sarebbe meglio:Gli spinlock sono una buona scelta per un allocatore di memoria?
- Almeno in benchmark sintetici che ho fatto, è molte volte più veloce di sezioni critiche del sistema operativo quando c'è contesa per il blocco allocatore di memoria/GC. Modifica: Empiricamente, l'uso di spinlock non aveva nemmeno un sovraccarico misurabile in un ambiente single-core, probabilmente perché i lock devono essere mantenuti per un così breve periodo di tempo in un allocatore di memoria.
- allocazioni di memoria e simili operazioni richiedono solitamente una piccola frazione di un timeslice, e anche una piccola frazione del tempo un interruttore contesto prende, rendendo stupido context switch nel caso di contesa.
- Un garbage collection nell'implementazione in questione arresta il mondo comunque. Non ci sarà alcuna rotazione durante una raccolta.
Esistono buoni motivi non da utilizzare spinlocks in un'implementazione collettore allocatore di memoria/spazzatura?
Bello. Tutto nell'implementazione del GC viene fatto con le API del SO astratte, usando blocchi sincronizzati. Dalla lettura del disassemblaggio, questi chiamano il codice della sezione critica del sistema operativo, ma non sono sicuro con quali parametri. – dsimcha
Vorrei sottolineare che, nella mia esperienza, Win32 CriticalSections è ancora molto più lento delle implementazioni spinlock manuali. La mia applicazione ha ottenuto un incremento delle prestazioni del 20% quando ho sostituito gli oggetti CRITICAL_SECTION (spinlock o meno) con semplici cicli InterlockedExchange (che sono intrinseche del compilatore per alcuni compilatori). –
@CyberShadow: è interessante. Non ho visto l'effettiva implementazione di Win32 di un CRITICAL_SECTION in un debugger da molto, molto tempo, ma mi sarei aspettato che la variante che utilizzava uno spinlock avrebbe implementato lo spin usando un semplice 'InterlockedExchange() 'ciclo. Potrei doverlo vedere in WinDbg stasera ... –