Bellek eşlemeli dosya - Memory-mapped file

Bir bellek eşlemeli dosya bölümüdür sanal bellek bir dosya veya dosya benzeri kaynağın bazı kısmıyla doğrudan bayt için baytlık korelasyon atanmıştır. Bu kaynak tipik olarak diskte fiziksel olarak bulunan bir dosyadır, ancak aynı zamanda bir aygıt, paylaşılan bellek nesnesi veya işletim sisteminin bir dosya tanımlayıcısı aracılığıyla başvurabileceği başka bir kaynak da olabilir . Bir kez mevcut olduğunda, dosya ile bellek alanı arasındaki bu korelasyon, uygulamaların eşlenen bölümü birincil bellekmiş gibi ele almasına izin verir.

Tarih

TOPS-20 PMAP

Erken ( c.  1969 bu) uygulaması oldu PMAP sistem çağrısı Aralık-20 'in BAŞLıKLARıNıZıN-20 işletim sistemi, yazılım House'un tarafından kullanılan bir özelliktir Sistemi-1022 veritabanı sistemi .

SunOS 4 mmap

SunOS 4 tanıtıldı Unix 'ler mmap , programları izin verilen 'belleğe dosyaları eşleştirmek için.'

Windows Büyütülebilir Bellek Eşlemeli Dosyaları (GMMF)

TOPS-20'nin PMAP'ının piyasaya sürülmesinden yirmi yıl sonra, Windows NT'ye Büyütülebilir Bellek Eşlemeli Dosyalar (GMMF) verildi.

" CreateFileMapping İşlev, kendisine aktarılacak bir boyut gerektirdiğinden" ve bir dosyanın boyutunu değiştirmek, hemen uyum sağlamadığından, bir GMMF API geliştirildi. GMMF kullanımı, dosya boyutunun büyüyebileceği maksimum değerin beyan edilmesini gerektirir, ancak kullanılmayan alan israf edilmez.

Faydaları

Bellek eşlemesinin bir dosyayı eşleştirmenin yararı, özellikle büyük dosyalarda kullanıldığında G / Ç performansını artırmasıdır. Küçük dosyalar için, bellek eşlemeli dosyalar, bellek haritaları her zaman çoğunlukla 4 KiB olan sayfa boyutuna hizalandığından boş alan israfına neden olabilir . Bu nedenle, 5 KiB dosyası 8 KiB tahsis eder ve böylece 3 KiB boşa harcanır. Bellek eşlemeli dosyalara erişim, iki nedenden dolayı doğrudan okuma ve yazma işlemlerini kullanmaktan daha hızlıdır. İlk olarak, bir sistem çağrısı, bir programın yerel belleğindeki basit bir değişiklikten çok daha yavaş emirlerdir. İkincisi, birçok işletim sistemlerinde aslında eşlenen bellek bölgesi olan çekirdeğin sayfa önbelleği (dosya önbelleği) hayır kopya kullanıcı alanında oluşturulması gerekir, yani.

Bazı uygulama düzeyinde bellek eşlemeli dosya işlemleri de fiziksel dosya eşdeğerlerinden daha iyi performans gösterir. Uygulamalar, dosyanın başlangıcından itibaren aramak veya düzenlenen içeriğin tamamını geçici bir konuma yeniden yazmak yerine, dosyadaki verilere doğrudan ve yerinde erişebilir ve bunları güncelleyebilir. Bellek eşlemeli dosya sayfalarda dahili olarak işlendiğinden, doğrusal dosya erişimi (örneğin, düz dosya veri depolama veya yapılandırma dosyalarında görüldüğü gibi ), yalnızca yeni bir sayfa sınırı aşıldığında disk erişimini gerektirir ve dosyanın daha büyük bölümlerini yazabilir. tek bir işlemle diske dosya.

Bellek eşlemeli dosyaların olası bir yararı, "tembel yükleme", dolayısıyla çok büyük bir dosya için bile küçük miktarlarda RAM kullanılmasıdır. Kullanılabilir bellek miktarından önemli ölçüde daha büyük olan bir dosyanın tüm içeriğini yüklemeye çalışmak , işletim sistemi diskten belleğe okurken ve eşzamanlı olarak bellekten diske sayfaları yazarken ciddi şekilde çökmeye neden olabilir . Bellek eşleme yalnızca sayfa dosyasını tamamen atlamakla kalmaz, aynı zamanda programlar için kullanılan talep sayfalamasına benzer şekilde, veriler düzenlenirken daha küçük sayfa boyutundaki bölümlerin yüklenmesine de izin verir .

Bellek eşleme işlemi, sayfa dosyasıyla ilgilenmekten sorumlu olan aynı alt sistem olan sanal bellek yöneticisi tarafından gerçekleştirilir . Bellek eşlemeli dosyalar , her seferinde bir sayfanın tamamı belleğe yüklenir . Sayfa boyutu maksimum performans için işletim sistemi tarafından seçilir. Sayfa dosyası yönetimi, bir sanal bellek sisteminin en kritik öğelerinden biri olduğundan, bir dosyanın sayfa boyutundaki bölümlerini fiziksel belleğe yüklemek genellikle çok yüksek düzeyde optimize edilmiş bir sistem işlevidir.

Türler

İki tür bellek eşlemeli dosya vardır:

Kalıcı

Kalıcı dosyalar, diskteki bir kaynak dosyayla ilişkilendirilir. Veriler, son işlem tamamlandığında diskteki kaynak dosyaya kaydedilir. Bu bellek eşlemeli dosyalar, çok büyük kaynak dosyalarla çalışmak için uygundur.

Kalıcı olmayan

Kalıcı olmayan dosyalar diskteki bir dosyayla ilişkilendirilmez. Son işlem dosyayla çalışmayı bitirdiğinde veriler kaybolur. Bu dosyalar, süreçler arası iletişim (IPC) için paylaşılan bellek oluşturmak için uygundur.

Dezavantajlar

Bellek eşlemeli dosya G / Ç'yi seçmenin ana nedeni performanstır. Yine de, değiş tokuşlar olabilir. Standart G / Ç yaklaşımı, sistem çağrısı ek yükü ve bellek kopyalama nedeniyle maliyetlidir. Bellek eşlemeli yaklaşımın maliyeti küçük sayfa hatalarındadır - sayfa önbelleğine bir veri bloğu yüklendiğinde , ancak henüz sürecin sanal bellek alanına eşlenmediğinde. Bazı durumlarda, bellek eşlemeli dosya G / Ç'si, standart dosya G / Ç'sinden önemli ölçüde daha yavaş olabilir.

Bellek eşlemeli dosyaların bir başka dezavantajı, belirli bir mimarinin adres alanıyla ilgilidir : adreslenebilir alandan daha büyük bir dosya, bir seferde yalnızca eşlenen bölümlere sahip olabilir ve bu da okumayı zorlaştırır. Örneğin, Intel'in IA-32'si gibi 32 bitlik bir mimari , yalnızca 4 GiB veya daha küçük dosya bölümlerini doğrudan adresleyebilir . Tek tek programlar için daha da az miktarda adreslenebilir alan mevcuttur - tipik olarak işletim sistemi çekirdeğine bağlı olarak 2 ila 3 GiB aralığında. Ancak bu dezavantaj, modern 64 bit mimaride neredeyse ortadan kaldırılmıştır .

mmap ayrıca standart dosya G / Ç araçlarından daha az ölçeklenebilir olma eğilimindedir, çünkü Linux dahil birçok işletim sistemi sayfa hatalarını işleyen çekirdek sayısı üzerinde bir sınıra sahiptir. Modern NVM Express SSD'ler gibi son derece hızlı cihazlar, genel giderleri gerçek bir endişe haline getirebilir.

Eşlenmiş belleğine erişirken temel dosyadaki G / Ç hataları (örneğin çıkarılabilir sürücüsü takılı değil veya optik ortam çıkarılmış, yazarken disk dolu, vb.) POSIX üzerindeki SIGSEGV / SIGBUS sinyalleri olarak uygulamaya rapor edilir ve Windows'ta EXECUTE_IN_PAGE_ERROR yapılandırılmış istisna. Eşlenmiş belleğe erişen tüm kodlar, normalde belleğe erişirken meydana gelmeyen bu hataları işlemek için hazırlanmalıdır.

Yalnızca MMU'lu donanım mimarileri bellek eşlemeli dosyaları destekleyebilir. MMU'suz mimarilerde, işletim sistemi, haritalama isteği yapıldığında tüm dosyayı belleğe kopyalayabilir, ancak bu, dosyanın yalnızca küçük bir kısmına erişilecekse son derece israf ve yavaştır ve yalnızca dosyalar için çalışabilir. mevcut hafızaya sığacak.

Ortak kullanımlar

Bellek eşlemeli bir dosya için belki de en yaygın kullanım , çoğu modern işletim sistemindeki ( Microsoft Windows ve Unix benzeri sistemler dahil) işlem yükleyicidir . Bir işlem başlatıldığında, işletim sistemi yürütülebilir dosyayı getirmek için bellek eşlemeli bir dosya kullanır. yüklenebilir modüllerle birlikte yürütmek için belleğe. Çoğu bellek eşleme sistemi , dosyanın alt kümelerde (her biri bir sayfa) fiziksel belleğe yüklendiği ve yalnızca o sayfaya gerçekten başvurulduğunda talep sayfalama adı verilen bir teknik kullanır . Yürütülebilir dosyaların özel durumunda, bu, işletim sisteminin yalnızca gerçekten yürütülmesi gereken bir işlem görüntüsünün yalnızca bu bölümlerini seçici olarak yüklemesine izin verir.

Bellek eşlemeli dosyalar için başka bir yaygın kullanım, belleği birden çok işlem arasında paylaşmaktır. Modern korumalı mod işletim sistemlerinde, işlemlerin başka bir işlem tarafından kullanılmak üzere ayrılan bellek alanına erişmesine genellikle izin verilmez. (Bir programın bunu yapma girişimi geçersiz sayfa hatalarına veya bölümleme ihlallerine neden olur .) Belleği güvenli bir şekilde paylaşmak için bir dizi teknik vardır ve bellek eşlemeli dosya G / Ç en popüler olanlardan biridir. İki veya daha fazla uygulama aynı anda tek bir fiziksel dosyayı belleğe eşleyebilir ve bu belleğe erişebilir. Örneğin, Microsoft Windows işletim sistemi, uygulamaların sistemin sayfa dosyasının kendisinin paylaşılan bir bölümünü bellek eşlemesi yapmak ve bu bölüm aracılığıyla verileri paylaşmak için bir mekanizma sağlar.

Platform desteği

Çoğu modern işletim sistemi veya çalışma zamanı ortamı, bir tür bellek eşlemeli dosya erişimini destekler. Bir dosya tanımlayıcısı, dosyada başlangıç ​​konumu ve bir uzunluk verilen bir dosyanın eşlemesini oluşturan mmap () işlevi , POSIX belirtiminin bir parçasıdır , bu nedenle UNIX , Linux gibi çok çeşitli POSIX uyumlu sistemler , Mac OS X veya OpenVMS , bellek eşleme dosyaları için ortak bir mekanizmayı destekler. Microsoft Windows işletim sistemleri de bu amaç için CreateFileMapping () gibi bir grup API işlevini destekler .

Microsoft Windows ve POSIX uyumlu platformlar için bellek eşlemeli dosyaların bazı ücretsiz taşınabilir uygulamaları şunlardır:

Java programlama dili gibi erişim belleği eşlenen dosyalara sınıfları ve yöntemler sağlar FileChannel .

D programlama dili destekler bellek standart kütüphanesinde (std.mmfile modülü) dosyaları eşlenen.

Ruby , bellek eşlemeli dosya nesnelerini uygulayan Mmap adında bir gem'e (kitaplık) sahiptir.

Sürüm 1.6'dan beri Python , Standart Kitaplığı'na bir mmap modülü dahil etmiştir. Modülün ayrıntıları, ana bilgisayar platformunun Windows veya Unix benzeri olmasına göre değişir .

İçin Perl bellek eşleme dosyaları için kullanılabilecek birkaç modül varsa CPAN gibi Sys :: mmap'e ve Dosyadan :: Harita .

Microsoft .NET çalışma zamanında, P / Invoke , bellek eşlemeli dosyaları doğrudan Windows API aracılığıyla kullanmak için kullanılabilir . Bellek eşlemeli dosyalara yönetilen erişim (P / Invoke gerekli değildir), çalışma zamanının 4. sürümünde tanıtılmıştır (bkz. Bellek Eşlemeli Dosyalar ). Önceki sürümler için, yönetilen API'ler sağlayan üçüncü taraf kitaplıkları vardır.

PHP, file_get_contents () gibi bir dizi yerel dosya erişim işlevinde bellek eşleme tekniklerini destekledi, ancak bunu 5.3'te kaldırdı ( revizyon günlüğüne bakın ).

İçin R, bir programlama dili CRAN bir kütüphane olarak adlandırılır vardır bigmemory Takviye kütüphanesi kullanır ve R. doğrudan paketi, bellek eşlemeli destekli diziler sağlayan ff servis bellek eşlemeli vektörler, matrisler, diziler ve veri çerçeveleri.

J programlama dili Bu kutulu dizi verileri için destek ve tek veri türü dosyaları içerir, en az 2005 yılından bu yana bellek haritalı dosyalar desteklemiştir. Destek, 'data / jmf'den yüklenebilir J'nin Jdb ve JD veritabanı motorları, sütun depoları için bellek eşlemeli dosyalar kullanır.

Referanslar