Hacking des Go-Garbage Collectors: Zeiger speichern aus Assembly

2025-06-23
Hacking des Go-Garbage Collectors: Zeiger speichern aus Assembly

Dieser Beitrag befasst sich mit den Feinheiten der Manipulation von Go-Zeigern aus Assembly-Code, wobei der Schwerpunkt auf der entscheidenden Interaktion mit dem Go-Garbage Collector liegt. Die direkte Manipulation von Zeigern erfordert die explizite Benachrichtigung des GC über Funktionen wie `runtime.gcWriteBarrier2` und `runtime.writeBarrier`, um Konflikte und mögliche Abstürze zu vermeiden. Der Artikel geht auch auf die Herausforderung ein, 128-Bit-ausgerichteten Speicher für die optimale Nutzung von AVX-Instruktionen zuzuweisen, und präsentiert eine clevere Problemumgehung. Es wird jedoch vor der Abhängigkeit von internen Runtime-Funktionen gewarnt, da deren Verfügbarkeit in zukünftigen Go-Versionen möglicherweise geändert wird.

Mehr lesen

Linux Pipes an die Grenzen bringen: Von 3,5 GiB/s auf 62,5 GiB/s

2025-06-22
Linux Pipes an die Grenzen bringen: Von 3,5 GiB/s auf 62,5 GiB/s

Dieser Beitrag untersucht die Implementierung von Unix-Pipes in Linux durch iterative Optimierung eines Testprogramms, das Daten über eine Pipe schreibt und liest. Beginnend mit einem einfachen Programm mit einem Durchsatz von etwa 3,5 GiB/s, verbessert der Autor die Leistung um das Zwanzigfache durch mehrere Optimierungsschritte. Zu den wichtigsten Verbesserungen gehören die Verwendung der Systemaufrufe `vmsplice` und `splice`, um Datenkopien zu vermeiden, die Nutzung von Huge Pages, um den Paging-Overhead zu reduzieren, und die Verwendung von Busy-Looping, um Synchronisierungskosten zu minimieren. Der Prozess wird mit Codebeispielen und Leistungsanalysen mithilfe des Linux-Tools `perf` detailliert beschrieben.

Mehr lesen
Entwicklung