İşlemler arasında bellek ayırma

Android platformu, boş belleğin boşa bellek olduğu prensibiyle çalışır. Her zaman mevcut belleğin tamamını kullanmaya çalışır. Örneğin, sistem kapatıldıktan sonra uygulamaları bellekte tutar. Böylece kullanıcılar bu uygulamalara hızlıca geri dönebilir. Bu nedenle, Android cihazlar genellikle çok az boş bellekle çalışır. Bellek yönetimi, belleği önemli sistem işlemleri ve birçok kullanıcı uygulaması arasında doğru şekilde paylaştırmak için hayati önem taşır.

Bu sayfada Android'in, sistem ve kullanıcı uygulamaları için belleği nasıl ayırdığıyla ilgili temel bilgiler verilmektedir. Ayrıca, işletim sisteminin düşük bellek durumlarına nasıl tepki verdiğini de açıklar.

Bellek türleri

Android cihazlar üç farklı bellek türü içerir: RAM, zRAM ve depolama. Hem CPU hem GPU'nun aynı RAM'e eriştiğini unutmayın.

Bellek türleri

Şekil 1. Bellek türleri: RAM, zRAM ve depolama

  • RAM en hızlı bellek türüdür, ancak genellikle sınırlı bir boyuta sahiptir. İleri teknoloji cihazlar genellikle en fazla RAM'e sahiptir.

  • zRAM, değişim alanı için kullanılan bir RAM bölümüdür. zRAM'ye yerleştirildiğinde her şey sıkıştırılır, ardından zRAM'den kopyalandığında sıkıştırılır. Sayfalar zRAM'a taşındıkça veya zRAM'dan çıkarıldıkça RAM'in boyutu artar veya küçülür. Cihaz üreticileri maksimum boyutu ayarlayabilir.

  • Depolama; tüm uygulamalar, kitaplıklar ve platform için dosya sistemi ve dahil edilen nesne kodu gibi kalıcı verilerin tamamını içerir. Storage, diğer iki bellek türüne göre çok daha fazla kapasiteye sahiptir. Sık sık yazma işlemi bu belleğin aşınmasına ve depolama ortamının ömrünü kısaltabileceğinden, Android'de diğer Linux uygulamalarında olduğu gibi depolama alanı değişim alanı için kullanılmaz.

Anı sayfaları

RAM sayfalara bölünür. Genellikle her sayfa 4 KB bellek içerir.

Sayfalar ücretsiz veya kullanılmış olarak kabul edilir. Ücretsiz sayfalar kullanılmayan RAM'dir. Kullanılan sayfalar, sistemin aktif olarak kullandığı RAM'dir ve aşağıdaki kategorilerde gruplandırılır:

  • Önbelleğe alındı: Depolama alanındaki bir dosya tarafından yedeklenen bellek (ör. kod veya bellekle eşlenmiş dosyalar). İki tür önbelleğe alınmış bellek vardır:
    • Gizli: Bir sürece aittir ve paylaşılmaz
      • Temiz: Depolama alanındaki bir dosyanın değiştirilmemiş kopyası, boş belleği artırmak için kswapd tarafından silinebilir
      • Kirli: Depolama alanındaki dosyanın değiştirilmiş kopyası; boş bellek miktarını artırmak için kswapd ile zRAM'e taşınabilir veya sıkıştırılabilir
    • Shared: Birden çok işlem tarafından kullanılır
      • Temizle: Depolama alanındaki dosyanın değiştirilmemiş kopyası, boş belleği artırmak için kswapd tarafından silinebilir
      • Kirli: Depolama alanındaki dosyanın değiştirilmiş kopyası; yapılan değişikliklerin, boş belleği kswapd artırmak için depolama alanındaki dosyaya geri yazılmasına veya msync() ya da munmap() kullanılarak açıkça msync() kullanılmasına olanak tanır.
  • Anonim: Depolama alanındaki bir dosya tarafından desteklenmeyen bellek (ör. mmap() tarafından MAP_ANONYMOUS işareti ayarlanmış olarak ayrılmış)
    • Kirli: Boş belleği artırmak için zRAM gücünde kswapd oranında taşınabilir/sıkıştırılabilir

Sistem RAM'i etkin bir şekilde yönettiğinden, boş sayfaların ve kullanılan sayfaların oranları zamanla değişir. Bu bölümde açıklanan kavramlar, düşük bellek durumlarını yönetmenin anahtarıdır. Bu belgenin bir sonraki bölümünde bunlar daha ayrıntılı olarak açıklanmaktadır.

Düşük bellek yönetimi

Android'in düşük bellek durumlarıyla başa çıkmak için iki temel mekanizması vardır: çekirdek değiştirme arka plan programı ve düşük bellekli katlayıcı.

çekirdek değişimi arka plan programı

Çekirdek değişimi arka plan programı (kswapd) Linux çekirdeğinin bir parçasıdır ve kullanılan belleği boş belleğe dönüştürür. Cihazdaki boş bellek azaldığında arka plan programı etkin hale gelir. Linux çekirdeği, düşük ve yüksek boş bellek eşiklerini korur. Boş bellek düşük eşiğin altına düştüğünde kswapd, belleği geri kazanmaya başlar. Boş bellek yüksek eşiğe ulaştığında kswapd, belleği geri kazanmayı durdurur.

kswapd, depolama alanı tarafından desteklendiği ve değiştirilmediği için temiz sayfaları silerek bu sayfaları geri alabilir. Bir işlem, silinmiş temiz bir sayfayla ilgili işlem yapmaya çalışırsa sistem sayfayı depolama alanından RAM'e kopyalar. Bu işlem talep sayfalama olarak bilinir.

Depolama alanı tarafından desteklenen temiz sayfa silindi

2. Şekil. Temiz sayfa, depolama alanı tarafından destekleniyor, silindi

kswapd, önbelleğe alınan gizli gizli sayfaları ve anonim kirli sayfaları, sıkıştırıldıkları zRAM'ye taşıyabilir. Bu işlem RAM'de (boş sayfalar) kullanılabilir bellekte yer açar. Bir işlem zRAM'de kirli bir sayfaya dokunmaya çalışırsa sayfa sıkıştırılmaz ve tekrar RAM'e taşınır. Sıkıştırılmış bir sayfayla ilişkilendirilen işlem sonlandırılırsa sayfa zRAM'den silinir.

Boş bellek miktarı belirli bir eşiğin altına düşerse sistem işlemleri sonlandırmaya başlar.

Kirli sayfa zRAM'e taşındı ve sıkıştırıldı

3. Şekil. Kirli sayfa zRAM'e taşındı ve sıkıştırıldı

Hafıza kaybı

Çoğu zaman kswapd sistem için yeterli bellekte yer açamamaktadır. Bu durumda sistem, bir uygulamaya belleğin azaldığını ve ayırmalarını azaltması gerektiğini bildirmek için onTrimMemory() aracını kullanır. Bu yeterli olmazsa çekirdek, bellekte yer açmak için işlemleri sonlandırmaya başlar. Bunun için düşük bellek katlayıcı (LMK) kullanılır.

LMK, hangi işlemin sonlandırılacağına karar vermek için çalışan süreçlere öncelik vermek amacıyla oom_adj_score adlı "bellek yok" puanını kullanır. Yüksek puana sahip işlemler önce sonlandırılır. Önce arka plan uygulamaları, sistem süreçleri de en son sonlandırılır. Aşağıdaki tabloda, LMK puanlama kategorileri yüksekten düşüğe doğru listelenmiştir. En yüksek puana sahip kategorideki öğeler birinci satırda ilk önce sonlandırılır:

Android süreçleri, üstte rekorlar

4. Şekil. En yüksek puanlar en üstte, en düşük puanlar ise altta olmak üzere Android süreçlerinin

Bunlar, yukarıdaki tabloda bulunan çeşitli kategorilerin açıklamalarıdır:

  • Arka plan uygulamaları: Daha önce çalıştırılmış ve şu anda etkin olmayan uygulamalar. LMK, önce en yüksek oom_adj_score olandan başlayarak arka plan uygulamalarını sonlandırır.

  • Önceki uygulama: En son kullanılan arka plan uygulaması. Önceki uygulama, arka plandaki uygulamalardan birine göre daha yüksek önceliğe (daha düşük puan) sahiptir. Çünkü kullanıcının bu uygulamaya geçiş yapma olasılığı daha yüksektir.

  • Home uygulaması: Bu, başlatıcı uygulamasıdır. Bunu kapatmak, duvar kağıdının kaybolmasına neden olur.

  • Hizmetler: Hizmetler uygulamalar tarafından başlatılır ve buluta senkronizasyon veya yükleme içerebilir.

  • Algılanabilir uygulamalar: Küçük bir kullanıcı arayüzü görüntüleyen arama işlemi çalıştırmak veya müzik dinlemek gibi, kullanıcı tarafından algılanabilecek şekilde ön planda olmayan uygulamalar.

  • Ön plan uygulaması: O anda kullanılan uygulama. Ön plandaki uygulamayı kapatmak, kullanıcıya cihazda bir şeylerin yolunda gitmediğini gösterebilecek bir uygulama kilitlenmesi gibi görünür.

  • Kalıcı (hizmetler): Bunlar telefon ve kablosuz gibi cihaz için temel hizmetlerdir.

  • Sistem: Sistem işlemleri. Bu işlemler sonlandırıldığında, telefon yeniden başlatılmış gibi görünebilir.

  • Yerel: Sistem tarafından kullanılan çok alt düzey işlemler (örneğin, kswapd).

Cihaz üreticileri LMK'nin davranışını değiştirebilir.

Bellek ayak izini hesaplama

Çekirdek, sistemdeki tüm bellek sayfalarını izler.

Farklı işlemler tarafından kullanılan sayfalar

5.Şekil Farklı işlemler tarafından kullanılan sayfalar

Sistem, bir uygulamanın ne kadar bellek kullandığını belirlerken paylaşılan sayfaları dikkate almalıdır. Aynı hizmete veya kitaplığa erişen uygulamalar, bellek sayfalarını paylaşır. Örneğin, Google Play Hizmetleri ve bir oyun uygulaması bir konum hizmetini paylaşıyor olabilir. Bu durum, her bir uygulamaya kıyasla genel olarak hizmete ne kadar belleğin ait olduğunun belirlenmesini zorlaştırır.

İki uygulamanın paylaştığı sayfalar

6.Şekil İki uygulama tarafından paylaşılan sayfalar (ortada)

Bir uygulamanın bellek ayak izini belirlemek için aşağıdaki metriklerden herhangi biri kullanılabilir:

  • Kalıcı Küme Boyutu (RSS): Uygulama tarafından kullanılan paylaşılan ve paylaşılmayan sayfaların sayısı
  • Orantılı Küme Boyutu (PSS): Uygulama tarafından kullanılan paylaşılmayan sayfa sayısı ve paylaşılan sayfaların eşit dağılımı (örneğin, üç işlem 3 MB paylaşıyorsa her işlem PSS cinsinden 1 MB alır)
  • Benzersiz Grup Boyutu (USS): Uygulama tarafından kullanılan paylaşılmayan sayfa sayısı (paylaşılan sayfalar dahil değildir)

PSS, sayfalar birden çok kez sayılmadığı için tüm işlemlerin ne kadar bellek kullandığını bilmek isteyen işletim sistemi için yararlıdır. Sistemin hangi sayfaların ve kaç işlemle paylaşıldığını belirlemesi gerektiğinden PSS'nin hesaplanması uzun sürer. RSS, paylaşılan ve paylaşılmayan sayfaları birbirinden ayırt etmez (hesaplamayı daha hızlı hale getirir) ve bellek ayırmadaki değişiklikleri izlemek için daha iyidir.

Ek kaynaklar