Geri çekilip mevcut modellerin nereden ve neden geldiğini görmek isteyebilirsiniz. Bir işlem oluşturulduğunda, basitçe 0'dan N'ye indekslenen düz bir depolama alanı verilir. Bu depolama alanı (burada RAM'den bahsediyor) özel bir donanım ve bazı süslü yarı iletkenler tarafından desteklendiğinden, oldukça hızlı olur, ama bu türünün tek örneği değil. Sabit sürücüler gibi diğer aygıtlar aslında aynı şeydir, bir dizin tarafından adreslenebilen düz alan, ancak birçok büyüklük sırası daha yavaştır.
"Bir yığın" ın var olmasının nedeni, her uygulamanın RAM kullanımını kendi başına yönetmeye çalışmasının pratik olmamasıdır. Günün geri dönüşü, tam olarak böyle oldu, programcılar her RAM konumunun ne için kullanılacağını önceden planladılar. Yazılımın daha karmaşık hale geldiği gibi, sadece bir kara kutuya gidip "10 bayta çok hile yapmalıyım" diyebilmem ve bu 10 baytın nerede ve nasıl karmaşık olduğu konusunda endişelenmemeliydim. veya nasıl geri kazanıldıkları. Bir yığın budur, bundan daha basit olamaz.
Her iş parçacığı oluşturulduğunda, az önce tarif ettiğim aynı "gimme işlemi" kullanılarak elde edilen bazı veri yapıları (ve bir yığın) vardır. Hemen hemen evrensel olarak kullanılan bir yığın, çünkü işlev çağrısı yığın çerçeveleri ve bunların LIFO doğasına mükemmel uyum sağlar. Teoride, her bir işlev çağırma ve yerel değişkenler öbek üzerinde tahsis edilebilir, ancak yığın işaretçisini (x86'da ESP) kayıt defterini güncellemek için gereken birkaç montaj talimatıyla karşılaştırıldığında, bu çok pahalı olacaktır.
Yerel iş parçacığı depolama (TLS) da yığının üstüne inşa edilmiştir. Bir iş parçacığı oluşturulduğunda, yönetim yapıları için bellek ayırmak üzere yığın gezisinin bir parçası olarak, yığından TLS için ayrı bir alan ayrılır.
Sonuçta, sahip olduğunuz tek şey genel bir bellek ayırıcısı (yani yığın) ve diğer her şey bunun üzerinde uzmanlaşmış bir form. Başka bir deyişle, "İstediğim kadar (ya da az) tahsis etmek istiyorum, istediğim kadar tut ve istediğim zaman serbest bırak" ın bazı yönlerinden vazgeçmek istiyorsan, ticaretten kurtulabilirsin hız sunan ancak başka bir sınırlama pahasına başka bir model için genel yığın ayırıcı kapalı.
Yığını alın. Öbek ile karşılaştırıldığında inanılmaz derecede hızlı, ancak iki değiş tokuş 1) hafızanın ne zaman serbest bırakıldığını kontrol etmiyorsunuz; bunun yerine işlev çıktıktan sonra, ayırdığınız her şey gider ve 2) yığınlar genellikle boyut olarak sınırlı olduğundan, büyük miktarlarda verileri doğrudan yığın üzerine ayırmaya dikkat etmelisiniz.
Diğer bir "bellek modeli" türü, neredeyse tüm büyük işletim sistemleri tarafından sistem çağrıları tarafından sunulan Sanal Bellek Yöneticisi'dir (VMM). VMM, herhangi bir miktarda bellek isteyebileceğiniz ve istediğiniz kadar saklayabileceğiniz bir anlamda yığınlara çok benzer. Bununla birlikte, sınırlama, belleği yalnızca sayfa boyutu katları (örn. 4KB) olarak ayırabilmenizdir, bu nedenle VMM'yi doğrudan kullanmak, genellikle bir seferde 8-24 bayt ayıran tipik bir uygulamada çok fazla ek yüke neden olur. Aslında, hemen hemen her yığın uygulaması özellikle çok genel, uzmanlaşmamış, küçük bir blok tahsisine izin vermek amacıyla VMM'nin üzerine inşa edilmiştir . Yığın, daha fazla belleğe ihtiyaç duyduğunda VMM'ye gider ve daha sonra bu belleğin birçok küçük parçasını uygulamaya doldurur.
Büyük blokları ayırma ihtiyacı olan bir uygulamanız varsa, bazı yığınların malloc () içinde bir if ifadesine sahip olmasına rağmen ve blok boyutu bazı eşikten büyükse, doğrudan VMM'ye gitmeyi düşünebilirsiniz. senin için.
Doğrudan yığın kullanmak yerine başka bir ayırıcı şekli havuzlar olacaktır. Havuz, tüm blokların aynı boyutta olduğu özel bir ayırıcıdır. Havuzlar (yığın ve TLS gibi) yığın veya VMM üzerine inşa edilmiştir. Havuzlar, aynı boyutta kısa ömürlü, küçük nesneler tahsis ettiğiniz yerlerde yararlıdır. Gelen istekleri işleyen bir şebeke servisini düşünün. Her istemci isteği, bu isteği işlemek için aynı N bayt yapısının atanmasına neden olabilir. Havuzları kullanarak yapılan ticaret, her havuzun sadece bir blok boyutunu işlemesi (ancak birden fazla havuz oluşturabilirsiniz). Havuzların avantajı, tüm nesnelerin aynı boyutta olması nedeniyle karmaşık mantık gerektirmemesidir. Bunun yerine, yeni bir bloğa ihtiyacınız olduğunda, size en son serbest bırakılan bloğu verir.
Ve son olarak, yukarıda bahsettiğim o sabit disk şeyi hatırlayın. Bir dosya sistemi gibi davranan ve her veri bloğunun bir yolla ele alındığı veri bloklarının hiyerarşik olarak tahsis edilmesini sağlamak için dizin girişleri ve i-düğümleri fikrini çoğaltan bir bellek modeliniz olabilir. Tmpfs tam da bunu yapar.
Bahsettiğim şeylerin ötesinde, eminim başka daha özel modeller var, ama sonunda her şey düz adres alanına dayandığı için (yani bazı genuis bir tür garip-$$ düz olmayan bir alan ortaya çıkana kadar) ), hepsi VMM veya yığın olan genel "gimme" ayırıcısına geri döner.