İşlemler arasında bellek ayırma

Android platformu, boş belleğin boşa harcanmış bellek olduğu önermesi üzerine çalışır. Her zaman mevcut tüm belleği kullanmaya çalışır. Örneğin, sistem, uygulamaları kapatıldıktan sonra bellekte tutar. Böylece kullanıcılar uygulamalara hızlıca geri dönebilir. Bu nedenle, Android cihazlar genellikle çok az boş bellekle çalışır. Bellek yönetimi, önemli sistem süreçleri ve birçok kullanıcı uygulaması arasında belleğin düzgün şekilde dağıtılması 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ği de açıklanmaktadır.

Bellek türleri

Android cihazlarda üç farklı bellek türü bulunur: RAM, zRAM ve depolama alanı. CPU ve 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 boyutu sınırlıdır. Üst düzey cihazlarda genellikle en yüksek miktarda RAM bulunur.

  • zRAM, takas alanı için kullanılan bir RAM bölümüdür. Her şey zRAM'e yerleştirilirken sıkıştırılır, zRAM'den kopyalanırken ise sıkıştırması açılır. RAM'in bu bölümü, sayfalar zRAM'e taşındıkça veya zRAM'den çıkarıldıkça büyür ya da küçülür. Maksimum boyutu cihaz üreticileri belirleyebilir.

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

Bellek sayfaları

RAM, sayfalara ayrılır. Genellikle her sayfa 4 KB bellek kullanır.

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

  • Önbelleğe alınmış: Depolama alanındaki bir dosya tarafından desteklenen bellek (ör. kod veya belleğe eşlenmiş dosyalar). İki tür önbelleğe alınmış bellek vardır:
    • Özel: Bir işleme ait ve paylaşılmayan
      • Temiz: Depolama alanındaki bir dosyanın değiştirilmemiş kopyasıdır. Boş belleği artırmak için kswapd tarafından silinebilir.
      • Kirli (Dirty): Depolama alanındaki dosyanın değiştirilmiş kopyasıdır. Boş belleği artırmak için kswapd tarafından zRAM'e taşınabilir veya zRAM'de sıkıştırılabilir.
    • Paylaşılan: Birden fazla işlem tarafından kullanılır.
      • Temiz: Depolama alanındaki dosyanın değiştirilmemiş kopyasıdır. kswapd tarafından silinerek boş bellek artırılabilir.
      • Kirli (Dirty): Depolama alanındaki dosyanın değiştirilmiş kopyasıdır. kswapd kadar boş bellek elde etmek için depolama alanındaki dosyaya geri yazma işlemlerine izin verir veya msync() ya da munmap() açıkça kullanılır.
  • Anonim: Depolama alanındaki bir dosya tarafından desteklenmeyen bellek (örneğin, mmap() tarafından MAP_ANONYMOUS işareti ayarlanarak ayrılan)
    • Kirli: Boş belleği artırmak için kswapd ile zRAM'de taşınabilir/sıkıştırılabilir.

Sistem, RAM'i etkin bir şekilde yönettiğinden boş ve kullanılan sayfaların oranları zaman içinde değişir. Bu bölümde tanıtılan kavramlar, düşük bellek durumlarını yönetmek için önemlidir. Bu belgenin bir sonraki bölümünde bu özellikler daha ayrıntılı olarak açıklanmaktadır.

Düşük bellek yönetimi

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

çekirdek takas arka plan programı

Çekirdek takas 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. Daemon, cihazdaki boş bellek azaldığında etkinleşir. 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 bellek geri kazanmaya başlar. Boş bellek yüksek eşiğe ulaştığında kswapd bellek geri kazanmayı durdurur.

kswapd, depolama alanı tarafından desteklendiği ve değiştirilmediği için temiz sayfaları silerek geri alabilir. Bir işlem, silinmiş temiz bir sayfaya erişmeye çalışırsa sistem, sayfayı depolama alanından RAM'e kopyalar. Bu işleme talep üzerine sayfalama denir.

Depolama alanı tarafından desteklenen temiz sayfa silindi

Şekil 2. Depolama alanıyla desteklenen temiz sayfa silindi

kswapd, önbelleğe alınmış özel kirli sayfaları ve anonim kirli sayfaları, sıkıştırıldıkları zRAM'e taşıyabilir. Bunu yaptığınızda RAM'de (boş sayfalar) kullanılabilir bellek açılır. Bir işlem, zRAM'deki kirli bir sayfaya dokunmaya çalışırsa sayfa sıkıştırılmamış hâlde RAM'e geri taşınır. Sıkıştırılmış bir sayfayla ilişkili 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.

Kirlenmiş sayfa, zRAM'e taşınır ve sıkıştırılır.

Şekil 3. Kirlenmiş sayfa, zRAM'e taşınır ve sıkıştırılır.

Düşük bellekli işlemleri sonlandırma

Çoğu zaman kswapd, sistem için yeterli bellek alanı boşaltamaz. Bu durumda sistem, belleğin azaldığını ve uygulamanın ayırdığı alanı azaltması gerektiğini bildirmek için onTrimMemory() kullanır. Bu yeterli olmazsa çekirdek, belleği boşaltmak için işlemleri sonlandırmaya başlar. Bunu yapmak için düşük bellek sorunu (LMK) özelliğini kullanır.

LMK, hangi işlemin sonlandırılacağına karar vermek için çalışan işlemlere öncelik vermek üzere oom_adj_score adlı bir "yetersiz bellek" puanı kullanır. Puanı yüksek olan işlemler önce sonlandırılır. Öncelikle arka plan uygulamaları, en son ise sistem işlemleri sonlandırılır. Aşağıdaki tabloda, LMK puanlama kategorileri yüksekten düşüğe doğru listelenmektedir. Birinci satırda, en yüksek puanlı kategorideki öğeler önce kaldırılır:

Android işlemleri, en üstte yüksek puanlar

Şekil 4. Üstte yüksek puanlar, altta düşük puanlar olacak şekilde Android işlemleri

Yukarıdaki tablodaki çeşitli kategorilerin açıklamaları aşağıda verilmiştir:

  • Arka plan uygulamaları: Daha önce çalıştırılmış ancak şu anda etkin olmayan uygulamalar. LMK, önce en yüksek oom_adj_score değerine sahip olan arka plan uygulamalarını sonlandırır.

  • Önceki uygulama: En son kullanılan arka plan uygulaması. Önceki uygulama, kullanıcının arka plan uygulamalarından birine geçmek yerine bu uygulamaya geçme olasılığı daha yüksek olduğundan arka plan uygulamalarına göre daha yüksek önceliğe (daha düşük puan) sahiptir.

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

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

  • Algılanabilir uygulamalar: Kullanıcı tarafından bir şekilde algılanabilen ön plan dışı uygulamalar (ör. küçük bir kullanıcı arayüzü gösteren bir arama işlemi çalıştırma veya müzik dinleme).

  • Ön planda çalışan uygulama: Şu anda kullanılan uygulama. Ön planda çalışan uygulamanın sonlandırılması, uygulama kilitlenmesi gibi görünür ve kullanıcıya cihazda bir sorun olduğunu düşündürebilir.

  • Kalıcı (hizmetler): Bunlar, telefon ve kablosuz gibi cihazın temel hizmetleridir.

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

  • Yerel: Sistem tarafından kullanılan çok düşük düzeyli işlemler (ör. kswapd).

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

Bellekte kaplanan yerin hesaplanması

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

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

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

Bir uygulamanın ne kadar bellek kullandığını belirlerken sistem, paylaşılan sayfaları hesaba katmalıdır. Aynı hizmete veya kitaplığa erişen uygulamalar bellek sayfalarını paylaşır. Örneğin, Google Play Hizmetleri ve bir oyun uygulaması, konum hizmetini paylaşıyor olabilir. Bu durum, genel olarak hizmete ve her uygulamaya ait bellek miktarını belirlemeyi zorlaştırır.

İki uygulama tarafından paylaşılan sayfalar

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

Bir uygulamanın bellekte kapladığı yeri belirlemek için aşağıdaki metriklerden herhangi biri kullanılabilir:

  • Yerleşik 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 sayfaların sayısı ve paylaşılan sayfaların eşit dağılımı (örneğin, üç işlem 3 MB paylaşıyorsa her işlem PSS'de 1 MB alır)
  • Tekil Küme Boyutu (USS): Uygulama tarafından kullanılan paylaşılmayan sayfaların sayısı (paylaşılan sayfalar dahil değildir)

PSS, sayfalar birden çok kez sayılmadığından işletim sisteminin tüm işlemler tarafından ne kadar bellek kullanıldığını bilmek istediği durumlarda faydalıdır. PSS'nin hesaplanması uzun sürer çünkü sistemin hangi sayfaların kaç işlem tarafından paylaşıldığını belirlemesi gerekir. RSS, paylaşılan ve paylaşılmayan sayfaları ayırt etmez (bu da hesaplamayı hızlandırır) ve bellek ayırmadaki değişiklikleri izlemek için daha uygundur.

Ek kaynaklar