İşlemler arasında bellek ayırma

Android platformu, boş belleğin boşa harcanan bellek olduğu prensibiyle çalışır. Her zaman mevcut belleğin tamamını kullanmaya çalışır. Örneğin, sistem, kullanıcının hızlıca geri dönebilmesi için uygulamaları kapatıldıktan sonra bellekte tutar. Bu nedenle, Android cihazlar genellikle çok az boş bellekle çalışır. Bellek yönetimi, belleği önemli sistem süreçleri ve birçok kullanıcı uygulaması arasında uygun şekilde dağıtmak için çok önemlidir.

Bu sayfada, Android'in sistem ve kullanıcı uygulamaları için bellek ayırma işleminin temelleri ele alınmaktadır. 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ı. Hem CPU hem de GPU'nun aynı RAM'e eriştiğini unutmayın.

Bellek türleri

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

  • RAM en hızlı bellek türüdür ancak genellikle boyutu sınırlıdır. Üst düzey cihazlarda genellikle en fazla RAM bulunur.

  • zRAM, takas alanı için kullanılan RAM bölümlerinden biridir. Her şey zRAM'e yerleştirildiğinde sıkıştırılır ve zRAM'den kopyalandığında sıkıştırması kaldırılır. Sayfalar zRAM'e taşındığında veya zRAM'den çıkarıldığında RAM'in bu bölümü boyut olarak büyür veya küçülür. Cihaz üreticileri maksimum boyutu belirleyebilir.

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

Anı 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 kategorilere ayrılır:

  • Önbelleğe alınmış: Depolama alanındaki bir dosyayla desteklenen bellek (ör. kod veya bellek haritalı dosyalar). İki tür önbelleğe alınmış bellek vardır:
    • Özel: Bir işleme ait olup paylaşılmaz
      • Temiz: Depolama alanındaki bir dosyanın değiştirilmemiş kopyasıdır. Boş bellek alanı açmak için kswapd ile silinebilir.
      • Kirli: Depolama alanındaki dosyanın değiştirilmiş kopyası; boş belleği artırmak için kswapd tarafından zRAM'e taşınabilir veya 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. Boş bellek alanı açmak için kswapd tarafından silinebilir.
      • Kirli: Depolama alanındaki dosyanın değiştirilmiş kopyasıdır. Depolama alanındaki dosyaya değişikliklerin geri yazılmasını sağlar. Bu işlem, kswapd ile veya açıkça msync() ya da munmap() kullanılarak yapılabilir.
  • Anonim: Depolama alanındaki bir dosya tarafından desteklenmeyen bellek (örneğin, MAP_ANONYMOUS işareti ayarlanmış mmap() tarafından ayrılan)
    • Kirli: Boş belleği artırmak için kswapd tarafından zRAM'e 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 açıklanan kavramlar, bellek miktarının düşük olduğu durumları yönetmek için önemlidir. Bu belgenin bir sonraki bölümünde bu konular daha ayrıntılı olarak açıklanmıştı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 hizmetli ve düşük bellek öldürücü.

çekirdek takas arka plan programı

Çekirdek takas hizmet 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 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 bellek geri almaya başlar. Boş bellek yüksek eşiğe ulaştığında kswapd bellek geri alma işlemini durdurur.

kswapd, depolama alanında yedeklendikleri ve değiştirilmedikleri için temiz sayfaları silerek geri alabilir. Bir işlem, silinmiş temiz bir sayfayı adreslemeye çalışırsa sistem sayfayı depolama alanından RAM'e kopyalar. Bu işleme talep sayfası denir.

Depolama alanı tarafından desteklenen temiz sayfa silindi

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

kswapd, önbelleğe alınmış kirli gizli sayfaları ve kirli anonim sayfaları sıkıştırıldıkları zRAM'e taşıyabilir. Bu işlem, RAM'de kullanılabilir bellek (ücretsiz sayfalar) için yer açar. Bir işlem zRAM'deki kirli bir sayfaya dokunmaya çalışırsa sayfa sıkıştırılmaz ve RAM'e geri taşınır. Sıkıştırılmış bir sayfayla ilişkili süreç 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ı

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

Bellek azalması

kswapd çoğu zaman sistem için yeterli bellek alanı sağlayamaz. Bu durumda sistem, bir uygulamayı belleğin azaldığı ve ayırmalarını azaltması gerektiği konusunda bilgilendirmek için onTrimMemory() kullanır. Bu yeterli olmazsa çekirdek, bellek boşaltmak için işlemleri öldürmeye başlar. Bunu yapmak için düşük bellek öldürücüyü (LMK) 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 "bellek yetersizliği" puanı kullanır. Puanı yüksek olan işlemler önce kapatılır. Arka plan uygulamaları önce, sistem işlemleri ise en son kapatılır. Aşağıdaki tabloda, LMK puanlama kategorileri yüksekten düşüğe doğru listelenmiştir. İlk satırdaki en yüksek puana sahip 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 bulunan Android işlemleri

Aşağıda, yukarıdaki tablodaki çeşitli kategorilerin açıklamaları verilmiştir:

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

  • Önceki uygulama: En son kullanılan arka plan uygulaması. Kullanıcının arka plan uygulamalarından birine geçme olasılığından daha yüksek olduğu için önceki uygulama, arka plan uygulamalarından daha yüksek önceliğe (daha düşük puana) sahiptir.

  • Ana ekran uygulaması: Bu, başlatıcı uygulamasıdır. Bu uygulamayı kapatırsanız duvar kağıdı kaybolur.

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

  • Algılanabilir uygulamalar: Küçük bir kullanıcı arayüzü gösteren bir arama işlemi çalıştırma veya müzik dinleme gibi kullanıcı tarafından bir şekilde algılanan, ön planda olmayan uygulamalar.

  • Ön plan uygulaması: Şu anda kullanılan uygulama. Ön plandaki uygulamanın kapatılması, uygulama kilitlenmesi gibi görünür ve kullanıcıya cihazda bir sorun olduğunu gösterebilir.

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

  • Sistem: Sistem işlemleri. Bu işlemler sonlandırılırken telefon yeniden başlatılıyormuş gibi görünebilir.

  • Yerel: Sistem tarafından kullanılan çok düşük düzeyli 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

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

Sistem, bir uygulama tarafından ne kadar bellek kullanıldığını belirlerken ortak 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ı bir konum hizmetini paylaşıyor olabilir. Bu durum, hizmetin ne kadarının her bir uygulamaya ait olduğunu 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 bellek kullanımını belirlemek için aşağıdaki metriklerden herhangi biri kullanılabilir:

  • Yerleşik Set Boyutu (RSS): Uygulama tarafından kullanılan paylaşılan ve paylaşılmayan sayfaların sayısı
  • Oransal Set Boyutu (PSS): Uygulama tarafından kullanılan paylaşılmayan sayfaların sayısı ve paylaşılan sayfaların eşit bir şekilde dağıtılması (örneğin, üç işlem 3 MB paylaşıyorsa her işlem PSS'de 1 MB alır)
  • Benzersiz Set Boyutu (USS): Uygulama tarafından kullanılan paylaşılmayan sayfaların sayısı (paylaşılan sayfalar dahil değildir)

Sayfalar birden çok kez sayılmadığından PSS, tüm işlemler tarafından ne kadar bellek kullanıldığını öğrenmek isteyen işletim sistemi için kullanışlıdır. Sistemin hangi sayfaların kaç işlem tarafından paylaşıldığını belirlemesi gerektiğinden PSS'nin hesaplanması uzun sürer. RSS, paylaşılan ve paylaşılmayan sayfalar arasında ayrım yapmaz (bu da hesaplamayı hızlandırır) ve bellek ayırmadaki değişiklikleri izlemek için daha iyidir.

Ek kaynaklar