Yığın + yığın + statik bellek modeline alternatifler var mı?


9

Gördüğüm tüm programlar, veri belleğini bir veya daha fazla çağrı yığını (genellikle sabit boyutta, ancak bazen değil), yığın ve statik bellek olarak düzenler. Son zamanlarda evre yerel statik depolama da buna eklenmiştir.

Veri belleği düzenini, örneğin çağrı yığını olmadan, kökten farklı bir şekilde düzenleme denemesi oldu mu? Ya da hafızayı aynı şeyi başaran farklı bir şekilde düzenleyebilir misiniz?


"Yığın" ile ne demek istediğinize bağlıdır. Çağrı yığını karelerini yığına koyabilirsiniz (bunları işaretçilerle bağlayabilirsiniz). Öyleyse, yığın için ayrılmış bir doğrusal bellek bölgeniz yoktur, ancak kavramsal olarak hala bir çağrı yığınınız vardır.

ve "son zamanlarda" ile ne demek istediğinize bağlı. Yerel depolama iş parçacığı kadar eski olduğunu düşünüyorum. Ancak daha önce sistem çağrıları aracılığıyla erişilebilirdi, ancak şimdi daha yeni diller doğrudan ona erişmenizi sağlıyor.
DXM

Çağrı yığını gereklidir çünkü yordamsal işlevlerin sonuçları kimin aradığını ve yürütülmeye devam edebilmeleri için onları kimin aradığını bilmeleri gerekir. Mevcut mekanizma bunu CPU döngüleri açısından oldukça ucuz ve en azından x64 ile, neredeyse tüm fonksiyon argümanları kayıtlardan geçirilir
James

2
Eric Lippert'in Neden Bir Yığını Var? ilgi. Ana noktası, bir yığının bellek konumlarını izlemek için etkili ve basit bir yol sağlamasıdır. Birkaç eski yazıda , Devamlı Geçiş Tarzı'nda bir alternatifi tartışıyor .
Brian

Yanıtlar:


8

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.


1

Düşünebildiğim tek durumlar, her şeyin bellekte sabit yerlerde çalışabileceği özel bir donanımda. Tamamen esnek programlar istiyorsanız, mevcut bellek modelindeki hemen hemen her şey gereklidir.

Yığın olmadan yerel değişkenlere, çağrı yığınlarına vb. Sahip olamazsınız. Uygulamak için yazdığınız her şey yığına çok benzeyecektir.

Statik bellek ve belirli uygulamalar için potansiyel olarak bırakabileceğiniz yığın, ancak yine de daha gelişmiş bir şey yapmak için onlara bir şekilde veya başka bir şekilde geri ihtiyacınız olacak.

Yani bu üç taneden birini değiştirmek için icat ettiğiniz her şey sonunda bu üç taneden birine benzeyecektir ...

Buna diğer açıdan yaklaşmak için, yeni olan ne ekleyebilirsiniz? Grafik / fizik işlemciler / cpu önbellekleri / vb.

... bu yüzden birisi bir çeşit dev bir kavramsal sıçrayışa gelinceye kadar bu alanda uzun süre büyük değişiklikler görmemizin mümkün olmadığını düşünüyorum ...


4
Çoğu insan, mevcut yolun en iyi / tek yol olduğunu varsayma eğilimindedir ve boş bir sayfa verilirse zaten var olanı kopyalar. Diğer insanlar aslında teknolojik ilerleme ilerlemek olanlardır. Şahsen (eğer kuantum bilgisayarları saymak sürece) herhangi bir ciddi rakip modellerin biliyorum, ama bir o şey iddia söylemek değil olabilir hangileri mevcut esasen dairesel akıl yürütme şeklidir aynı olmazdı ile gelip.
Aaronaught

@Aaronaught: tartışmanızın ters tarafı, diğer insanların kutunun dışında tonlarca zaman, para ve enerji düşünerek ve her 1000 (belki daha fazlası) için, teknolojik ilerlemeyi ilerletebileceği, gerisi ise hiçbir yere ulaşamayacağıdır. . Biri daha pratik olarak düşünebilen ilk grup, mevcut modelleri olduğu gibi alır ve onların üstüne yenilikler getirir :)
DXM

@aaronaught Sanırım ben bunu "birisi bir çeşit dev bir kavramsal sıçrama ile gelene kadar" ile örtülü düşünüyorum;) Daha iyi bir alternatif modeliniz varsa bunu çekinmeyin ... eğer değilse şikayet etmek biraz ikiyüzlü hissettiriyor Onlardan biri olduğunuzda "bazı insanlar" :)
Tim B

1
@DXM: Öyleyse? Hepimizin zamanını yeni bellek modelleri araştırmaya yatırmamız gerektiğini mi söyledim? Sadece bir kişinin sadece önceden icat edilmiş şeyleri icat edebileceği iddiasında (önemli) kusura işaret ediyordum.
Aaronaught

Hiç yapmadığım bir iddia ...
Tim B
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.