Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Rainer Weikusat Newsgroups: de.comp.os.unix.programming Subject: Re: mmap oder read? Date: Wed, 08 Jun 2022 17:27:14 +0100 Lines: 34 Message-ID: <87v8tbce8t.fsf@doppelsaurus.mobileactivedefense.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net MjqdH528bn/5gsE0qWOyowLqpHf6tCdGo0PUdu/C9ZDMXIJkI= Cancel-Lock: sha1:FZL4f/sNT42iqQfYzo4rE9bl3fE= sha1:nDBSm87jdIkbr4D13c+8I0VEcOI= User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) Xref: csiph.com de.comp.os.unix.programming:2999 Stefan Reuther writes: > ich hab hier einen Microservice, der im Wesentlichen den lieben langen > Tag Dateien aus (wenigen) Containerfiles (z.B. *.tar) aufbereitet und > serviert. > > Je nachdem, wie ich die Framework-Komponenten zusammenstecke, bekomme > ich für das Lesen einer Datei aus dem Container > > mmap, , munmap > > oder > > malloc, read, , free > > Was für Gründe kann es geben, sich bewusst für die eine oder die andere > Art zu entscheiden? Für Dateien würde ich im Normalfall mmap benutzen, weil das einfacher zu handhaben ist: Anstatt Code zu schreiben, der einen Speicherbereich beschafft und diesen mit Daten füllt, die man verarbeiten möchte, sagt man einfach dem Kernel «gib mir einen Speicherbereich in dem meine Daten drinstehen» und kann sie dann direkt verarbeiten. Wie Hellmut Schellong hier allerdings mal in epischer Breite um die Jahrtausendwende rum demonstriert hat, ist das normalerweise langsamer, als read bzw scheint langsamer als read: Wenn man die Daten erstmal aus einem Kernelpuffer in einen Anwendungspuffer kopiert, lädt man sie nebenher auch in den Cache und nachfolgende Zugriffe müssen das nicht noch einmal tun. Nach einem mmap bekommt man hingegen erstmal page faults und cache und TLB misses, die alle nicht billig sind. Möglicher Vorteil: Falls das viele Daten sind, auf die man nur lesend zugreift, und die von anderen Prozessen ebenfalls gebraucht werden, braucht man nur eine Kopie im Speicher und nicht eine pro Prozeß.