Yığın ve yığın boyutu işletim sistemi tarafından nasıl sınırlandırılır?


21

Not : Yanıtlayabilmek için belirli bir işletim sistemini düşünmeniz gerekiyorsa, lütfen Linux'u düşünün.

Ne zaman bir program çalıştırırsam, yığınının alanı ve yığınının biri için bir alan olacak şekilde çalıştırılacak bir sanal bellek alanı verilir.

Soru 1 : yığının ve yığının statik bir boyut sınırı var mı (ör. Her biri 2 gigabayt) veya bu sınır dinamik mi, programın yürütülmesi sırasında bellek ayırmalarına göre değişiyor (yani, tarafından kullanılacak toplam 4 gigabayt) her ikisi de, bu nedenle bir program yalnızca yığını kullanıyorsa, 4 gigabaytlık bir yığını olabilir)?

Soru 2 : Sınır nasıl tanımlanır? Toplam kullanılabilir RAM belleği mi?

Soru 3 : Metin (kod) ve veri bölümleri ne durumda, bunlar nasıl sınırlanıyor?


Yanıtlar:


23

İki farklı bellek limiti vardır. Sanal bellek sınırı ve fiziksel bellek sınırı.

Sanal bellek

Sanal bellek, kullanılabilir adres alanı boyutu ve düzeniyle sınırlıdır. Genellikle en başta, çalıştırılabilir kod ve statik veri ve öbek büyüyen geçmiş, sonunda çekirdek tarafından ayrılmış alan, daha önce paylaşılan kütüphaneler ve yığın (çoğu platformda büyür). Bu, yığın ve yığın için büyümek için boş alan sağlar, diğer alanlar işlem başlangıcında bilinir ve sabitlenir.

Boş sanal bellek başlangıçta kullanılabilir olarak işaretlenmez, tahsis sırasında böyle işaretlenir. Öbek kullanılabilir tüm belleğe kadar büyürken, çoğu sistem yığınları otomatik olarak büyütmez. Yığın için IIRC varsayılan sınırı Linux'ta 8MiB ve Windows'ta 1MiB'dir ve her iki sistemde de değiştirilebilir. Sanal bellek ayrıca bellek eşlemeli dosyalar ve donanımlar da içerir.

Yığının otomatik olarak büyütülememesinin bir nedeni, çok iş parçacıklı programların her iş parçacığı için ayrı yığınlara ihtiyaç duymasıdır, bu nedenle sonunda birbirlerinin yoluna girerler.

32 bit platformlarda toplam sanal bellek miktarı 4GiB'dir, hem Linux hem de Windows normalde çekirdek için son 1GiB'yi ayırır ve size en fazla 3GiB adres alanı sağlar. Size tam 4GiB veren hiçbir şey ayırmayan özel bir Linux sürümü vardır. Son 1GiB'nin günü kurtardığı nadir büyük veritabanları için yararlıdır, ancak düzenli kullanım için ek sayfa tablosu yeniden yüklemeleri nedeniyle biraz daha yavaştır.

64 bit platformlarda sanal bellek 64EiB'dir ve bunu düşünmenize gerek yoktur.

Fiziksel hafıza

Fiziksel bellek genellikle yalnızca işletim sistemi tarafından işlemin erişmesi gerektiğinde ayrılır. Bir işlemin ne kadar fiziksel bellek kullandığı belirsiz bir sayıdır, çünkü işlemler (kod, paylaşılan kütüphaneler ve diğer eşlenmiş dosyalar) arasında bir miktar bellek paylaşıldığı için, dosyalardan alınan veriler isteğe bağlı olarak belleğe yüklenir ve bellek sıkıntısı olduğunda atılır ve "anonim" bellek (dosyalar tarafından desteklenmeyen bellek) değiştirilebilir.

Linux'ta fiziksel bellek bittiğinde ne olacağı vm.overcommit_memorysistem ayarına bağlıdır . Varsayılan değer aşırı taahhüttür. Sistemden bellek ayırmasını istediğinizde, size bazılarını verir, ancak yalnızca sanal belleği ayırır. Belleğe gerçekten eriştiğinizde, tekrar okunabilecek verileri atarak veya bir şeyleri gerektiği gibi değiştirerek kullanmak için bazı fiziksel bellek almaya çalışacaktır. Herhangi bir şeyi serbest bırakamayacağını tespit ederse, süreci varoluştan kaldıracaktır (tepki vermenin bir yolu yoktur, çünkü bu reaksiyon daha fazla bellek gerektirebilir ve bu sonsuz döngüye yol açabilir).

Android'de (aynı zamanda Linux olan) süreçler bu şekilde ölür. Mantık, sürecin ne yaptığına ve kaç yaşında olduğuna bağlı olarak varoluştan hangi sürecin kaldırılacağı mantığı ile geliştirildi . Daha android süreçleri sadece bir şey yapmayı bırak, ama arka planda oturun ve "bellek katil" yenileri için bellek gerektiğinde onları öldürecek.


9

Bunu hafızanın nasıl kullanıldığına göre cevaplamak daha kolay olduğunu düşünüyorum.

Soru 3: Metin (kod) ve veri bölümleri ne durumda, bunlar nasıl sınırlanıyor? Metin ve Veriler derleyici tarafından hazırlanır. Derleyicinin gereksinimi erişilebilir olduklarından emin olmak ve bunları adres alanının alt kısmına paketlemektir. Erişilebilir adres alanı donanım tarafından sınırlandırılacaktır, örneğin talimat işaretçisi kaydı 32 bit ise, metin adres alanı 4 GiB olacaktır.

Soru 2: Sınır nasıl tanımlanır? Toplam kullanılabilir RAM belleği mi? Metin ve verilerden sonra, yukarıdaki alan yığıntır. Sanal bellek ile yığın pratik büyüyebilir kadar yakın maksimum adres alanına.

Soru 1: yığının ve yığının statik bir boyut sınırı var mı (ör. Her biri 2 gigabayt) veya bu sınır dinamik mi, programın yürütülmesi sırasında bellek ayırmalarına göre değişiyor (yani, tarafından kullanılacak toplam 4 gigabayt) her ikisi de, bu nedenle bir program yalnızca yığını kullanıyorsa, 4 gigabaytlık bir yığını olabilir)? İşlem adres alanındaki son segment yığıntır. Yığın adres alanının uç kısmını alır ve ucundan başlar ve büyür aşağı .

Yığın büyüdüğü ve yığın büyüdüğü için, temelde birbirlerini sınırlarlar. Ayrıca, her iki segment türü yazılabilir olduğundan, bunlardan birinin sınırı geçmesi her zaman bir ihlal değildi, bu nedenle arabellek veya yığın taşmasına sahip olabilirsiniz. Şimdi onların gerçekleşmesini engelleyen bir mekanizma var.

Başlamak üzere her işlem için yığın (yığın) için belirli bir sınır vardır. Bu sınır çalışma zamanında değiştirilebilir (brk () / sbrk () kullanılarak). Temel olarak, işlemin daha fazla yığın alanına ihtiyacı olduğunda ve ayrılan alan bittiğinde, standart kütüphane işletim sistemine çağrı gönderir. İşletim sistemi, genellikle programın kullanması için kullanıcı kütüphanesi tarafından yönetilecek bir sayfa tahsis edecektir. Yani program 1 KiB istiyorsa, işletim sistemi ek 4 KiB verecek ve kütüphane programa 1 KiB verecek ve program bir dahaki sefere istediğinde 3 KiB kaldı.

Çoğu zaman düzen Metin, Veri, Yığın (büyür), ayrılmamış alan ve nihayet Yığın (büyür) olacaktır. Hepsi aynı adres alanını paylaşıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.