2012-07-04 17 views
16

C dilinde yazılmış basit bir yığın makinesi üzerinde çalışıyorum, çoğunlukla öğrenme amaçlı. Bellek işlemleri için malloc/free kullandıktan sonra, modern sanal makinelerden bazı bellek ayırma özel kodlarını okumak iyi bir fikir olacağını düşündüm.Modern VM'ler bellek ayırmayı nasıl ele alıyor?

Lua kaynak kodunu indirdim ve okumaya başladım. Bir süre sonra, çok fazla makro şey olduğunu anladım ve gerçek bellek ayırmanın yapıldığı kodu bulamadım (örneğin, malloc çağrısı).

find . -exec grep -i "malloc" '{}' \; -print 

Bu adlarında malloc kelime var sadece bazı Lua makro baskılı. Lua VM (ve programlama dili) hiç malloc kullanmaz!

Bu bana şu soruya yöneliyor: modern VM'ler bellek ayırmayı nasıl ele alıyor? Lua belleği bellekten nasıl ayırıyor? malloc'dan başka herhangi bir ayırma yolu var mı? Diğer yöntemlerin artıları/eksileri nelerdir?

Ayrıca, ayrılmış bellek üzerinde güvenli bir şekilde çalışmak için en iyi uygulamaları, tasarım kalıplarını, vb. Merak ediyorum. Lua'nın kaynağında, bellek ayırmadan önce çok fazla dolaylı kaynak olduğunu görüyorum. Bu şeyleri nereden öğrenebilirim? Kesinlikle Lua VM tabanlı dillerin% 99 gibi bir GC kullanması nedeniyle, ancak, (bir de çok özel bir ayırıcısı geçebilir) realloc şeklinde, malloc kullandığı en

+0

Ne tür bir VM'lerle ilgileniyorsunuz? Tüm bilgisayarları sanallaştıran sanal makineler var, biliyorsun. Bunları da soruyor musun? –

+0

@AlexeyFrunze, Hayır, sadece programlama dilleri için kullanılan VM'lerle ilgileniyorum. – sinan

+0

Tamam, başlık kafa karıştırıcı görünüyor. –

cevap

14

Lua, otomatik olarak GC eklemek için makro kullanır tahsisi için başlık bloğu.

Tüm bu hepsi başlangıçta (lauxlib.c itibaren) l_alloc ayarlanmış bir ayırıcı, saklamak için VM küresel durumu kullanır lmem.c ve lmem.h yılında LuaM_ rutinleri tarafından ele Lua hafızasını bulacaksınız ama değiştirilebilir lua_setallocf.

Geçtiğimiz günlerde, LuaJIT, bataryanın azalmasını sağladı ve bazı harika bellek özellikleri için planlar hazırladı. Bu makalede, LuaJIT Garbage Collection numaralı telefondan okuyabilirsiniz. Makale, VM/JIT bellek ayırma, batan, toplama ve çöp toplama etrafında dönen çok sayıda strateji ve tasarım içeriyor. Gördüğünüz gibi, bellek ayırma ve batırma stratejileri, GC kullanan kişi ile (varsa) çok yakından bağlantılıdır. Bkz. Standart malloc kullanılarak yanlısı ve aleyhte çeşitli bellek dağıtıcılar açısından

, kullanımı basit, ama hizalama ve her tahsisi üzerinde etiketlenen çeşitli ekstra blokları hız ve fire pahasına.

Daha gelişmiş arenaya, havuza, slablara ve blok ayırıcılara geçerken, (özellikle sabit boyutlu dahili VM dağıtımları için) işleri büyük ölçüde hızlandırabiliriz ve daha fazla genel ayırma aygıtları ile ortaya çıkabilecek parçalanma ve ek yüklerden kaçınabilirsiniz. malloc, ama tabii ki, bu ayırıcılar daha karmaşıktır ve denenmiş ve test edilmiş CRT malloc uygulamasının uygulandığı gibi sıfırdan başlıyorsanız (bir VM gibi daha büyük bir sistemde yalnızca sorunlar soruyorsa) bunları ayıklamanız gerekir. .

+0

Teşekkürler, 'malloc' un nerede olduğunu gösterebilir misiniz, çünkü söylediğim gibi, bulamıyorum. İçselleri daha iyi anlamak için kullanılan malloc kodlarını takip etmeyi planlıyorum. – sinan

+0

@sinan: lemme hızlıca kazmak – Necrolis

+0

@sinan: Güncelleme – Necrolis

5

Lua çekirdeği malloc ve arkadaşlarını kullanmaz. realloc benzeri semantiklere sahip bir kullanıcı tarafından sağlanan bellek ayırma işlevine dayanır (ancak NULL işaretçilerinin ve boyutlarının işlenmesi sırasında daha hassastır). lua_Alloc'a bakın.

yardımcı Lua kütüphanesi standart realloc ve free göre bir bellek ayırma fonksiyonu kullanılarak çekirdek lua_newstate fonksiyonu ile Lua durumunu yaratan bir kolaylık luaL_newstate fonksiyonu sağlar. Diğer istemciler, uygulamalarına uygun bellek ayırmalarını kullanabilir.

İlgili konular