Arbeitsspeicherzuweisung zwischen Prozessen

Die Android-Plattform basiert auf der Annahme, dass kostenloser Arbeitsspeicher verschwendeter Arbeitsspeicher ist. Es wird immer versucht, den gesamten verfügbaren Arbeitsspeicher zu nutzen. Beispielsweise hält das System Apps im Arbeitsspeicher, nachdem sie geschlossen wurden, damit der Nutzer schnell wieder zu ihnen wechseln kann. Aus diesem Grund haben Android-Geräte oft nur sehr wenig kostenlosen Arbeitsspeicher. Die Speicherverwaltung ist entscheidend, um den Arbeitsspeicher richtig auf wichtige Systemprozesse und viele Nutzeranwendungen zu verteilen.

Auf dieser Seite werden die Grundlagen erläutert, wie Android Arbeitsspeicher für das System und für Nutzeranwendungen zuweist. Außerdem wird erklärt, wie das Betriebssystem auf einen geringen Arbeitsspeicher reagiert.

Arten von Speicher

Android-Geräte haben drei verschiedene Arten von Arbeitsspeicher: RAM, zRAM und Speicher. Beachten Sie, dass sowohl die CPU als auch die GPU auf denselben RAM zugreifen.

Arten von Speicher

Abbildung 1: Arten von Arbeitsspeicher – RAM, zRAM und Speicher

  • RAM ist der schnellste Speichertyp, aber in der Regel begrenzt. High-End-Geräte haben in der Regel den größten RAM-Speicher.

  • zRAM ist eine RAM-Partition, die als Auslagerungsbereich verwendet wird. Alles wird komprimiert, wenn es in zRAM abgelegt wird, und dann dekomprimiert, wenn es aus zRAM kopiert wird. Dieser Teil des RAM wächst oder schrumpft, wenn Seiten in den zRAM verschoben oder daraus entfernt werden. Die maximale Größe kann vom Gerätehersteller festgelegt werden.

  • Der Speicher enthält alle nichtflüchtigen Daten wie das Dateisystem und den enthaltenen Objektcode für alle Apps, Bibliotheken und die Plattform. Der Speicher hat eine viel größere Kapazität als die beiden anderen Speichertypen. Unter Android wird der Speicher nicht wie bei anderen Linux-Implementierungen für den Auslagerungsbereich verwendet, da häufiges Schreiben zu einer Beschädigung dieses Arbeitsspeichers und einer Verkürzung der Lebensdauer des Speichermediums führen kann.

Erinnerungsseiten

Der Arbeitsspeicher ist in Seiten unterteilt. Normalerweise hat jede Seite 4 KB Arbeitsspeicher.

Seiten werden entweder als kostenlos oder verwendet eingestuft. Kostenlose Seiten sind nicht verwendetes RAM. Verwendete Seiten sind RAM, das vom System aktiv verwendet wird. Sie werden in die folgenden Kategorien unterteilt:

  • Im Cache: Arbeitsspeicher, der durch eine Datei im Speicher gesichert ist (z. B. Code oder speicherabgebildete Dateien). Es gibt zwei Arten von Cache-Speicher:
    • Privat: Zugewiesen zu einem Prozess und nicht freigegeben
      • Original: Unbearbeitete Kopie einer Datei im Speicher, kann mit kswapd gelöscht werden, um kostenlosen Arbeitsspeicher zu erhöhen
      • Dirty: Geänderte Kopie der Datei im Speicher; kann in zRAM verschoben oder um kswapd komprimiert werden, um den kostenlosen Arbeitsspeicher zu erhöhen
    • Freigegeben: Wird von mehreren Prozessen verwendet
      • Clean: Unbearbeitete Kopie der Datei im Speicher, kann mit kswapd gelöscht werden, um kostenlosen Arbeitsspeicher zu erhöhen
      • Ungültig: Geänderte Kopie der Datei im Speicher; ermöglicht es, Änderungen in den Speicher zurückzuschreiben, um den kostenlosen Arbeitsspeicher um kswapd zu erhöhen, oder explizit mit msync() oder munmap()
  • Anonymous: Arbeitsspeicher, der nicht durch eine Datei im Speicher gesichert ist (z. B. von mmap() mit dem Flag MAP_ANONYMOUS zugewiesen)
    • Dirty: Kann von kswapd in zRAM verschoben/komprimiert werden, um den kostenlosen Arbeitsspeicher zu erhöhen

Der Anteil der kostenlosen und verwendeten Seiten variiert im Laufe der Zeit, da das System den RAM aktiv verwaltet. Die in diesem Abschnitt vorgestellten Konzepte sind entscheidend für die Verwaltung von Situationen mit wenig Arbeitsspeicher. Im nächsten Abschnitt dieses Dokuments werden sie ausführlicher erläutert.

Schlechte Arbeitsspeicherverwaltung

Android hat zwei Hauptmechanismen, um mit Situationen mit wenig Arbeitsspeicher umzugehen: den Kernel-Auslagerungs-Daemon und den Low-Memory-Killer.

Kernel-Auslagerungs-Daemon

Der Kernel-Auslagerungs-Daemon (kswapd) ist Teil des Linux-Kernels und wandelt genutzten Arbeitsspeicher in kostenlosen Arbeitsspeicher um. Der Daemon wird aktiv, wenn der kostenlose Arbeitsspeicher auf dem Gerät knapp wird. Der Linux-Kernel verwaltet niedrige und hohe Grenzwerte für kostenlosen Arbeitsspeicher. Wenn der kostenlose Arbeitsspeicher unter den niedrigen Grenzwert fällt, beginnt kswapd, Speicherplatz freizugeben. Sobald der kostenlose Arbeitsspeicher den hohen Grenzwert erreicht, wird durch kswapd kein Arbeitsspeicher mehr zurückgefordert.

kswapd kann leere Seiten wiederverwenden, indem sie gelöscht werden, da sie im Speicher gesichert und nicht geändert wurden. Wenn ein Prozess versucht, eine gelöschte leere Seite anzusprechen, kopiert das System die Seite aus dem Speicher in den RAM. Dieser Vorgang wird als Demand Paging bezeichnet.

Leere Seite, die auf Speicherplatz basiert, wurde gelöscht

Abbildung 2: Leere Seite, die im Speicher gesichert ist, wurde gelöscht

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

Wenn der kostenlose Arbeitsspeicher unter einen bestimmten Grenzwert fällt, beendet das System Prozesse.

Modifizierte Seite in zRAM verschoben und komprimiert

Abbildung 3: Modifizierte Seite in zRAM verschoben und komprimiert

Low-Memory-Killer

Oft kann kswapd nicht genügend Arbeitsspeicher für das System freigeben. In diesem Fall benachrichtigt das System eine App über onTrimMemory(), dass der Arbeitsspeicher knapp wird und dass sie ihre Zuweisungen reduzieren sollte. Ist das nicht ausreichend, 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 einen Wert für „Speichermangel“ namens oom_adj_score, um die laufenden Prozesse zu priorisieren. Prozesse mit einem hohen Wert werden zuerst beendet. Hintergrund-Apps werden zuerst und Systemprozesse zuletzt beendet. In der folgenden Tabelle sind die LMK-Bewertungskategorien von hoch nach niedrig aufgeführt. Elemente in der Kategorie mit der höchsten Punktzahl in Zeile 1 werden zuerst entfernt:

Android-Prozesse, Höchstwerte oben

Abbildung 4: Android-Prozesse mit hohen Werten oben und niedrigen Werten unten

Hier sind Beschreibungen der verschiedenen Kategorien in der Tabelle oben:

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

  • Vorherige App: Die zuletzt verwendete App im Hintergrund. Die vorherige App hat eine höhere Priorität (einen niedrigeren Wert) als die Apps im Hintergrund, da der Nutzer mit höherer Wahrscheinlichkeit zu dieser App als zu einer der Apps im Hintergrund wechselt.

  • Start-App: Dies ist die Launcher-App. Wenn Sie diese beenden, verschwindet der Hintergrund.

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

  • Wahrnehmbare Apps: Apps, die sich nicht im Vordergrund befinden, aber für den Nutzer auf irgendeine Weise wahrnehmbar sind, z. B. wenn ein Suchvorgang ausgeführt wird, bei dem eine kleine Benutzeroberfläche angezeigt wird, oder wenn Musik abgespielt wird.

  • App im Vordergrund: Die aktuell verwendete App. Das Beenden der App im Vordergrund sieht aus wie ein App-Absturz, der dem Nutzer signalisieren könnte, dass etwas mit dem Gerät nicht stimmt.

  • Dauerhaft (Dienste): Dies sind Hauptdienste für das Gerät, z. B. Telefonie und WLAN.

  • System: Systemprozesse. Da diese Prozesse beendet werden, erscheint es, als würde das Smartphone neu gestartet.

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

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

Speicherbedarf berechnen

Der Kernel überwacht alle Arbeitsspeicherseiten im System.

Seiten, die von verschiedenen Prozessen verwendet werden

Abbildung 5: Seiten, die von verschiedenen Prozessen verwendet werden

Bei der Ermittlung der von einer App verwendeten Speichermenge muss das System geteilte Seiten berücksichtigen. Apps, die auf denselben Dienst oder die dieselbe Bibliothek zugreifen, teilen sich Speicherseiten. So können beispielsweise Google Play-Dienste und eine Spiele-App einen Standortdienst gemeinsam nutzen. Das macht es schwierig zu bestimmen, wie viel Arbeitsspeicher dem Dienst insgesamt und wie viel den einzelnen Anwendungen zugewiesen ist.

Von zwei Apps geteilte Seiten

Abbildung 6 Von zwei Apps gemeinsam genutzte Seiten (Mitte)

Um den Arbeitsspeicherbedarf einer Anwendung zu ermitteln, können Sie einen der folgenden Messwerte verwenden:

  • Resident Set Size (RSS): Die Anzahl der freigegebenen und nicht freigegebenen Seiten, die von der App verwendet werden
  • Proportional Set Size (PSS): Die Anzahl der nicht freigegebenen Seiten, die von der App verwendet werden, und eine gleichmäßige Verteilung der freigegebenen Seiten. Wenn beispielsweise drei Prozesse 3 MB gemeinsam nutzen, erhält jeder Prozess 1 MB PSS.
  • Unique Set Size (USS): Die Anzahl der nicht freigegebenen Seiten, die von der App verwendet werden (freigegebene Seiten werden nicht berücksichtigt)

Der PSS ist für das Betriebssystem nützlich, wenn es wissen möchte, wie viel Arbeitsspeicher von allen Prozessen belegt wird, da Seiten nicht mehrmals gezählt werden. Die Berechnung der PSS dauert lange, da das System ermitteln muss, welche Seiten gemeinsam genutzt werden und von wie vielen Prozessen. RSS unterscheidet nicht zwischen gemeinsam genutzten und nicht gemeinsam genutzten Seiten, was die Berechnung beschleunigt. Außerdem eignet sich RSS besser zum Überwachen von Änderungen bei der Speicherzuweisung.

Weitere Informationen

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