Threadprocs – ausführbare Programme, die einen gemeinsamen Adressraum teilen (0-Copy-Zeiger)

Dieses Projekt startet mehrere unabhängige Programme in einem einzigen gemeinsamen virtuellen Adressraum, verhalten sich dabei aber weiterhin wie separate Prozesse (unabhängige Binärdateien, globale Variablen und Lebenszyklen). Wenn Threadprocs ihren Adressraum teilen, bleiben Zeiger zwischen ihnen gültig, ohne dass Codeänderungen für wohlgeformte Linux-Binärdateien erforderlich sind. Im Gegensatz zu Threads ist jeder Threadproc ein eigenständiger und teilweise isolierter Prozess. Im Gegensatz zu dlopen-basierten Plugin-Systemen führen Threadprocs traditionelle ausführbare Programme mit einer `main()`-Funktion aus. Im Gegensatz zu POSIX-Prozessen bleiben Zeiger zwischen Threadprocs gültig, da sie denselben Adressraum teilen. Das bedeutet, dass idiomatische zeigerbasierte Datenstrukturen wie `std::string` oder `std::unordered_map` zwischen Threadprocs übergeben und direkt darauf zugegriffen werden kann (unter Berücksichtigung der üblichen Data-Race-Problematik). Dies realisiert ein Programmiermodell, das zwischen pthreads und Multi-Prozess-Shared-Memory-IPC angesiedelt ist. Die Implementierung basiert auf der Steuerung von ASLR und virtueller Adressraumverteilung zur Ladezeit, der Implementierung eines Benutzerraum-Analogons zu `exec()` sowie der sorgfältigen Handhabung von Threadproc-Dateideskriptoren, Signalen usw. Es wird vollständig in unprivilegiertem Benutzerraumcode implementiert: < https://github.com/jer-irl/threadprocs/blob/main/docs/02-imp... >. Es gibt eine einfache Demo, die „Cross-Threadproc“-Speicherdereferenzierung demonstriert unter < https://github.com/jer-irl/threadprocs/tree/main?tab=readme-... >, inklusive eines High-Level-Diagramms. Dies ist relevant für Systeme mit mehreren Prozessen und gemeinsam genutztem Speicher (oft Ringpuffer oder flache Tabellen). Diese Designs erfordern oft Serialisierung oder Kopieren und neigen dazu, sich von idiomatischen C++- oder Rust-Datenstrukturen zu entfernen. Zeigerbasierte Datenstrukturen können nicht direkt übergeben werden. Es gibt erhebliche Einschränkungen und Grenzfälle, und es ist unklar, ob dies ein praktikables Modell ist, aber das Projekt erforscht einen Weg, traditionelle Prozessspeichergrenzen zu lockern, während ein System weiterhin als unabhängig gestartete Komponenten strukturiert wird.

  • Cloud Native
  • Code-Generierung
  • Datenschutz an erster Stelle

KI-Zusammenfassung

Threadprocs ermöglicht mehreren unabhängigen ausführbaren Dateien, in einem einzigen gemeinsamen virtuellen Adressraum zu laufen, was direkten Zeigerzugriff über sie hinweg erlaubt, während prozessähnliche Isolierung erhalten bleibt. Dieser Ansatz bietet einen Mittelweg zwischen Threads und traditionellem Mehrprozess-Speicher.

Am besten geeignet für

Systemprogrammierer, die neuartige Methoden zur Interprozesskommunikation erforschen, Entwickler, die mit großen, vernetzten Datenstrukturen über Komponenten hinweg arbeiten, Forscher, die Techniken zur Speicherisolierung und -freigabe untersuchen

Warum es wichtig ist

Ermöglicht die direkte, nullkopierte Freigabe von zeigerbasierten Datenstrukturen zwischen unabhängig gestarteten ausführbaren Dateien, indem sie einen einzigen gemeinsamen Adressraum teilen können.

Hauptfunktionen

  • Startet unabhängige Programme in einem einzigen gemeinsamen virtuellen Adressraum.
  • Behält separates prozessähnliches Verhalten bei (Binärdateien, Globals, Lebensdauern).
  • Ermöglicht 0-Kopieren-Zeigerfreigabe über 'Threadprocs' unter Linux.
  • Unterstützt direkten Zugriff auf idiomatische C++/Rust-Datenstrukturen (z.B. std::string).

Anwendungsfälle

  • Ein Spieleentwickler könnte Threadprocs verwenden, um verschiedene Spielmodule (z.B. KI, Physik, Rendering) als unabhängige ausführbare Programme zu laden, die denselben Speicherbereich teilen. Dies würde das direkte, kopierfreie Übergeben komplexer Datenstrukturen wie Szenengraphen oder Charakterzustände zwischen Modulen ermöglichen und die Kommunikation zwischen Modulen im Vergleich zu traditioneller IPC oder Serialisierung vereinfachen.
  • Ein Systemprogrammierer, der eine Hochleistungs-Datenverarbeitungspipeline erstellt, könnte Threadprocs einsetzen, um verschiedene Verarbeitungsstufen (z.B. Erfassung, Transformation, Analyse) als separate Binärdateien auszuführen. Diese Architektur würde die direkte Manipulation gemeinsamer Datenpuffer, wie großer Arrays oder komplexer Objektgraphen, ohne den Overhead von Kopieren oder Serialisierung ermöglichen und potenziell den Durchsatz verbessern.
  • Ein Forscher, der eine komplexe Simulationsumgebung entwickelt, könnte Threadprocs nutzen, um verschiedene Simulationskomponenten (z.B. Agentenverhalten, Umgebungsinteraktionen, Datenprotokollierung) als unabhängig kompilierte Programme zu verwalten. Dies würde das nahtlose Teilen des Simulationszustands und den direkten Zugriff auf gemeinsame Datenstrukturen ermöglichen, was schnelles Prototyping und Iteration der Simulationslogik erleichtert.