Arbeitsspeicherzuweisung zwischen Prozessen

Bei der Android-Plattform geht es darum, dass kostenloser Arbeitsspeicher verschwendet wird. Dabei wird immer versucht, den gesamten verfügbaren Arbeitsspeicher zu verwenden. Beispielsweise speichert das System Apps im Arbeitsspeicher, nachdem sie geschlossen wurden, damit der Nutzer schnell zu ihnen zurückkehren kann. Aus diesem Grund haben Android-Geräte oft nur sehr wenig kostenlosen Arbeitsspeicher. Die Speicherverwaltung ist von entscheidender Bedeutung, um den Arbeitsspeicher zwischen wichtigen Systemprozessen und vielen Nutzeranwendungen richtig zuzuordnen.

Auf dieser Seite wird erläutert, wie Android Arbeitsspeicher für das System und für Nutzeranwendungen zuweist. Außerdem wird erläutert, wie das Betriebssystem auf Speichermangel reagiert.

Arbeitsspeichertypen

Android-Geräte verfügen über drei verschiedene Arten von Arbeitsspeicher: RAM, ZRAM und Speicher. Beachten Sie, dass CPU und GPU auf denselben RAM zugreifen.

Arbeitsspeichertypen

Abbildung 1: Arbeitsspeichertypen – RAM, ZRAM und Speicher

  • RAM ist der schnellste Speichertyp, hat aber in der Regel nur eine begrenzte Größe. High-End-Geräte haben in der Regel die größte Menge an RAM.

  • zRAM ist eine RAM-Partition, die für den Auslagerungsbereich verwendet wird. Alles wird beim Einfügen in den zRAM komprimiert und beim Kopieren aus dem zRAM dekomprimiert. Dieser Teil des RAM wächst oder verkleinert sich, wenn Seiten in den zRAM verschoben oder daraus entfernt werden. Die Gerätehersteller können die maximale Größe festlegen.

  • Der Speicher enthält alle nichtflüchtigen Daten wie das Dateisystem und den enthaltenen Objektcode für alle Anwendungen, Bibliotheken und die Plattform. Der Speicher hat viel mehr Kapazität als die anderen beiden Speichertypen. Unter Android wird der Speicher nicht wie bei anderen Linux-Implementierungen für den Auslagerungsbereich verwendet, da häufiges Schreiben den Speicher abnutzen und die Lebensdauer des Speichermediums verkürzen kann.

Arbeitsspeicherseiten

Der RAM ist in Seiten aufgeteilt. In der Regel hat jede Seite 4 KB Arbeitsspeicher.

Seiten gelten entweder als kostenlos oder genutzt. Kostenlose Seiten sind ungenutzter RAM. Verwendete Seiten sind RAM, den das System aktiv nutzt, und sind in die folgenden Kategorien unterteilt:

  • Im Cache: Arbeitsspeicher, der von einer Datei im Speicher gesichert wird (z. B. Code oder Dateien, die dem Arbeitsspeicher zugeordnet sind). Es gibt zwei Arten von im Cache gespeicherten Arbeitsspeicher:
    • Privat: Die Daten sind einem Prozess zugeordnet und werden nicht freigegeben.
      • Bereinigen: Unveränderte Kopie einer Datei im Speicher, kann von kswapd gelöscht werden, um freien Speicherplatz zu erhöhen
      • Schmutzig: Geänderte Kopie der Datei im Speicher; kann von kswapd in ZRAM verschoben oder dort komprimiert werden, um den kostenlosen Arbeitsspeicher zu erhöhen
    • Freigegeben: Wird von mehreren Prozessen verwendet
      • Bereinigen: Unveränderte Kopie der Datei im Speicher, kann von kswapd gelöscht werden, um freien Speicherplatz zu erhöhen
      • Dirty: Geänderte Kopie der Datei im Speicher; ermöglicht das Zurückschreiben von Änderungen in die Datei im Speicher, um den kostenlosen Arbeitsspeicher um kswapd zu erhöhen, oder explizit mit msync() oder munmap()
  • Anonym: Arbeitsspeicher, der nicht von einer Datei im Speicher gesichert wird (z. B. zugewiesen von mmap() bei gesetztem Flag MAP_ANONYMOUS)
    • Schmutzig: Kann in ZRAM von kswapd verschoben/komprimiert werden, um den kostenlosen Arbeitsspeicher zu erhöhen

Die Anteile der kostenlosen und der genutzten Seiten variieren im Laufe der Zeit, da das System den RAM aktiv verwaltet. Die in diesem Abschnitt vorgestellten Konzepte sind der Schlüssel zum Umgang mit Situationen mit wenig Arbeitsspeicher. Im nächsten Abschnitt dieses Dokuments werden diese genauer erläutert.

Geringe Arbeitsspeicherverwaltung

Android hat zwei Hauptmechanismen für den Umgang mit geringem Arbeitsspeicher: den Kernel-Swap-Daemon und den Killer mit niedrigem Arbeitsspeicher.

Kernel-Swap-Daemon

Der Kernel-Swap-Daemon (kswapd) ist Teil des Linux-Kernels und wandelt verwendeten Arbeitsspeicher in kostenlosen Arbeitsspeicher um. Der Daemon wird aktiv, wenn nur noch wenig freier Speicherplatz auf dem Gerät zur Verfügung steht. Der Linux-Kernel hält die Grenzwerte für den kostenlosen Arbeitsspeicher niedrig und hoch. Wenn der kostenlose Arbeitsspeicher unter den unteren Grenzwert fällt, beginnt kswapd, Arbeitsspeicher freizugeben. Sobald der kostenlose Arbeitsspeicher den hohen Schwellenwert erreicht hat, beendet kswapd die Freigabe des Arbeitsspeichers.

kswapd kann saubere Seiten zurückfordern, indem sie sie löschen, da sie im Speicher verfügbar sind und nicht geändert wurden. Wenn ein Prozess versucht, eine saubere Seite zu identifizieren, die gelöscht wurde, kopiert das System die Seite vom Speicher in den RAM. Dieser Vorgang wird als Nachfrageseitenung bezeichnet.

„Saubere Seite“ mit gelöschtem Speicherplatz

Abbildung 2: Seite bereinigen, durch Speicherplatz gesichert, gelöscht

kswapd kann im Cache gespeicherte private schmutzige Seiten und anonyme schmutzige Seiten in einen ZRAM verschieben, wo sie komprimiert werden. Dadurch wird verfügbarer Arbeitsspeicher im RAM (kostenlose Seiten) freigegeben. Wenn ein Prozess versucht, eine schmutzige Seite im ZRAM zu berühren, wird die Seite dekomprimiert und zurück in den RAM verschoben. Wenn der mit einer komprimierten Seite verknüpfte Prozess beendet wird, wird die Seite aus dem zRAM gelöscht.

Wenn die Menge des kostenlosen Arbeitsspeichers unter einen bestimmten Grenzwert fällt, beginnt das System, Prozesse zu beenden.

Schmutzige Seite wurde in ZRAM verschoben und komprimiert

Abbildung 3: Schmutzige Seite wurde in ZRAM verschoben und komprimiert

Killer mit wenig Arbeitsspeicher

In vielen Fällen kann kswapd nicht genügend Arbeitsspeicher für das System freigeben. In diesem Fall verwendet das System onTrimMemory(), um eine App darüber zu informieren, dass nur noch wenig Arbeitsspeicher verfügbar ist und die Zuweisungen reduziert werden sollten. Wenn dies nicht ausreicht, beendet der Kernel Prozesse, um Arbeitsspeicher freizugeben. Dazu wird der Low-Memory-Killer (LMK) verwendet.

Um zu entscheiden, welcher Prozess beendet werden soll, verwendet LMK den Wert oom_adj_score für „Nicht genügend Arbeitsspeicher“, um die ausgeführten Prozesse zu priorisieren. Prozesse mit einem hohen Wert werden zuerst beendet. Hintergrundanwendungen werden zuerst gelöscht, Systemprozesse als Letztes. In der folgenden Tabelle sind die LMK-Bewertungskategorien von hoch nach niedrig aufgeführt. Elemente in der Kategorie mit der höchsten Bewertung in Zeile 1 werden zuerst gelöscht:

Android-Prozesse, Highscores ganz oben

Abbildung 4: Android-Prozesse, mit Highscores oben und Tiefstwerten unten

Im Folgenden finden Sie Beschreibungen der verschiedenen Kategorien in der Tabelle oben:

  • Hintergrund-Apps: Apps, die bereits ausgeführt wurden und derzeit nicht aktiv sind LMK beendet zuerst die Hintergrundanwendungen, beginnend mit der App mit dem höchsten oom_adj_score.

  • Vorherige App: Die zuletzt verwendete Hintergrund-App. Die vorherige App hat eine höhere Priorität (eine niedrigere Punktzahl) als die Hintergrund-Apps, da es wahrscheinlicher ist, dass der Nutzer zu ihr wechselt als eine der Apps im Hintergrund.

  • Home App: Das ist die Launcher-App. Wenn du sie beendest, verschwindet der Hintergrund.

  • Dienste: Dienste werden von Anwendungen gestartet und können das Synchronisieren oder Hochladen in die Cloud umfassen.

  • Wahrnehmbare Apps: Apps, die nicht im Vordergrund stehen und für den Nutzer in irgendeiner Weise wahrnehmbar sind, z. B. ein Suchvorgang mit einer kleinen Benutzeroberfläche oder das Hören von Musik.

  • Vordergrund-App: Die aktuell verwendete App. Das Beenden der Vordergrund-App wirkt wie ein App-Absturz, was dem Nutzer signalisieren kann, dass ein Problem mit dem Gerät aufgetreten ist.

  • Persistent (Dienste): Dies sind Hauptdienste des Geräts, z. B. Telefonie und WLAN.

  • System: Systemprozesse. Wenn diese Prozesse abgebrochen werden, wird das Telefon möglicherweise neu gestartet.

  • Nativ: Prozesse auf sehr niedriger Ebene, die vom System verwendet werden (z. B. kswapd).

Gerätehersteller können das Verhalten von LMK ändern.

Arbeitsspeicherbedarf berechnen

Der Kernel erfasst alle Arbeitsspeicherseiten im System.

Seiten, die von verschiedenen Prozessen verwendet werden

Abbildung 5: Seiten, die von verschiedenen Prozessen verwendet werden

Bei der Bestimmung, wie viel Arbeitsspeicher von einer Anwendung verwendet wird, muss das System freigegebene Seiten berücksichtigen. Apps, die auf denselben Dienst oder dieselbe Bibliothek zugreifen, teilen Arbeitsspeicherseiten. Beispielsweise können Google Play-Dienste und eine Spiele-App einen Standortdienst gemeinsam nutzen. Dadurch lässt sich nur schwer feststellen, wie viel Arbeitsspeicher dem jeweiligen Dienst im Vergleich zu jeder Anwendung zur Verfügung steht.

Von zwei Apps geteilte Seiten

Abbildung 6: Von zwei Apps geteilte Seiten (Mitte)

Um den Speicherbedarf für eine Anwendung zu ermitteln, können folgende Messwerte verwendet werden:

  • Resident Set size (RSS): Die Anzahl der von der App verwendeten und nicht freigegebenen Seiten
  • Proportional Set size (PSS): Die Anzahl der von der Anwendung verwendeten nicht freigegebenen Seiten und eine gleichmäßige Verteilung der freigegebenen Seiten. Wenn beispielsweise drei Prozesse sich 3 MB teilen, erhält jeder Prozess in PSS 1 MB.
  • Unique Set Größe (USS): Die Anzahl der nicht freigegebenen Seiten, die von der App verwendet werden (freigegebene Seiten sind nicht inbegriffen)

PSS ist nützlich für das Betriebssystem, wenn es wissen möchte, wie viel Arbeitsspeicher von allen Prozessen belegt wird, da Seiten nicht mehrfach gezählt werden. Die Berechnung von PSS dauert lange, da das System bestimmen muss, welche Seiten von wie vielen Prozessen freigegeben werden. RSS unterscheidet nicht zwischen freigegebenen und nicht geteilten Seiten, was eine schnellere Berechnung ermöglicht, und eignet sich besser, um Änderungen bei der Arbeitsspeicherzuweisung nachzuverfolgen.

Weitere Informationen

  • Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
  • App-Startzeit