Frage

Ich arbeite an meinem kleinen C ++ - Framework und habe eine Dateiklasse, die auch asynchrones Lesen und Schreiben unterstützen soll. Die einzige andere Lösung als die Verwendung synchroner Datei-E / A in einigen von mir gefundenen Arbeitsthreads ist aio. Wie auch immer, ich habe mich irgendwo umgesehen und gelesen, dass aio unter Linux nicht einmal im Kernel implementiert ist, sondern mit Benutzer-Threads. Gilt das auch für OSX? Ein weiteres Problem ist die Funktionalität von aio für Rückrufe, die für jeden Rückruf einen zusätzlichen Thread erzeugen muss, da Sie keinen bestimmten Thread oder Threadpool zuweisen können, um dies zu erledigen (Signale sind für mich keine Option). Hier sind die Fragen, die sich daraus ergeben:

  • Ist aio im Kernel von osx implementiert und daher höchstwahrscheinlich besser als meine eigene Thread-Implementierung?

  • Kann das Rückrufsystem, das für jeden Rückruf einen Thread erzeugt, in der Praxis zu einem Engpass werden?

  • Wenn es sich nicht lohnt, aio unter osx zu verwenden, gibt es unter unix noch andere Alternativen? in Kakao? in Kohlenstoff?

  • Oder sollte ich einfach asynchrone E / A mit meinem eigenen Threadpool emulieren?

    Welche Erfahrungen haben Sie mit diesem Thema gemacht?

War es hilfreich?

Lösung

Sie können genau sehen, wie AIO unter OSX implementiert ist. hier .

Die Implementierung verwendet Kernel-Threads, eine Warteschlange von Jobs, die jeder Thread öffnet und blockierend in einer Prioritätswarteschlange basierend auf der Priorität jeder Anforderung ausführt (zumindest sieht es auf den ersten Blick so aus).

Sie können die Anzahl der Threads und die Größe der Warteschlange mit sysctl konfigurieren. Führen Sie sysctl -a | grep aio aus, um diese Optionen und die Standardwerte anzuzeigen

kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4

Nach meiner Erfahrung müssen diese Grenzwerte viel höher sein, damit AIO sinnvoll ist.

Was die Rückrufe in Threads betrifft, glaube ich nicht, dass Mac OS X dies unterstützt. Abschlussbenachrichtigungen werden nur über Signale gesendet (siehe Quelle).

Sie könnten wahrscheinlich genauso gute Arbeit in Ihrem eigenen Thread-Pool leisten. Eine Sache, die Sie besser als die aktuelle Darwin-Implementierung tun könnten, ist das Sortieren Ihrer Leseaufträge nach dem physischen Speicherort auf der Festplatte (siehe fcntl und F_LOG2PHYS), was Ihnen möglicherweise sogar einen Vorteil verschafft.

Andere Tipps

@Moka : Es tut uns leid zu sagen, dass Sie bei der Linux-Implementierung falsch liegen. Ab Kernel 2.6 gibt es eine Kernel-Implementierung von AIO, die in libaio (libaio.h)

Die Implementierung, die keine Kernel-Threads verwendet, sondern Benutzer-Threads verwendet, ist POSIX.1 AIO. Auf diese Weise wird die Portabilität verbessert, da nicht alle Unix-basierten Betriebssysteme Abschlussereignisse auf Kernel-Ebene unterstützen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top