Bellek eşlemeli dosyalar, okuma / yazma erişimini değiştirmek veya eşzamanlı paylaşımı desteklemek için kullanılabilir. Bunları bir mekanizma için kullandığınızda, diğerini de elde edersiniz.
Bir dosyada aramak, yazmak ve okumak yerine, onu belleğe eşlersiniz ve sadece olmasını beklediğiniz bitlere erişirsiniz.
Bu çok kullanışlı olabilir ve sanal bellek arayüzüne bağlı olarak performansı artırabilir. Performans artışı, işletim sisteminin artık diğer tüm programlı bellek erişiminizle birlikte bu eski "dosya G / Ç'sini" yönetmesi ve (teoride) disk belleği algoritmalarından yararlanabilmesi ve bunun için zaten kullandığı programınızın geri kalanı için sanal bellek . Bununla birlikte, temeldeki sanal bellek sisteminizin kalitesine bağlıdır. Anekdotlar, Solaris ve * BSD sanal bellek sistemlerinin, Linux'un VM sisteminden daha iyi performans iyileştirmeleri gösterebileceğini söyledi - ancak bunu yedekleyecek deneysel veriye sahip değilim. YMMV.
Eşzamanlılık, eşlenmiş bellek aracılığıyla aynı "dosyayı" kullanan birden çok işlemin olasılığını düşündüğünüzde ortaya çıkıyor. Okuma / yazma modelinde, iki işlem dosyanın aynı alanına yazarsa, işlem verilerinden birinin diğer işlemin verilerinin üzerine yazarak dosyaya ulaşacağından hemen hemen emin olabilirsiniz. Birini ya da diğerini alırsınız - ama tuhaf bir karışım olmaz. İtiraf etmeliyim ki, bunun herhangi bir standart tarafından zorunlu kılınan bir davranış olup olmadığından emin değilim, ama bu hemen hemen güvenebileceğiniz bir şey. (Aslında iyi bir takip sorusu!)
Haritalanan dünyada, bunun tersine, iki süreci de "yazarken" hayal edin. Bunu "bellek depoları" yaparak yaparlar, bu da verilerin en sonunda diske O / S sayfalanmasına neden olur. Ancak bu arada, çakışan yazıların olması beklenebilir.
İşte bir örnek. Diyelim ki her ikisi de 1024 ofsette 8 bayt yazan iki işlemim var. İşlem 1 '11111111' yazıyor ve işlem 2 '22222222' yazıyor. Dosya G / Ç kullanıyorlarsa, O / S'nin derinliklerinde, 1'lerle dolu bir tampon ve her ikisi de diskte aynı yere giden 2'lerle dolu bir tampon olduğunu hayal edebilirsiniz. Biri oraya önce, diğeri saniye sonra gidecek. Bu durumda ikincisi kazanır. Bununla birlikte , bellek eşlemeli dosya yaklaşımını kullanıyorsam, işlem 1 4 baytlık bir bellek deposuna, ardından 4 baytlık başka bir bellek deposuna gidecek (bunun maksimum bellek depolama boyutu olmadığını varsayalım). İşlem 2 aynı şeyi yapacak. İşlemlerin ne zaman çalıştığına bağlı olarak, aşağıdakilerden herhangi birini görmeyi bekleyebilirsiniz:
11111111
22222222
11112222
22221111
Bunun çözümü, her halükarda muhtemelen iyi bir fikir olan açık karşılıklı dışlamayı kullanmaktır. Her halükarda, okuma / yazma dosyası G / Ç durumunda "doğru şeyi" yapması için O / S'ye güveniyordunuz.
Sınıflandırma karşılıklı dışlama ilkeli mutekstir. Bellek eşlemeli dosyalar için, (örneğin) pthread_mutex_init () kullanılarak kullanılabilen bellek eşlemeli bir mutekse bakmanızı öneririm.
Tek bir aldatmaca ile düzenleme: Eşlenen dosyaları kullanırken, dosyadaki verilere işaretçileri dosyanın kendisinde gömmek için bir cazibe vardır (eşlenen dosyada depolanan bağlantılı listeyi düşünün). Dosya, farklı zamanlarda veya farklı işlemlerde farklı mutlak adreslerde eşlenebileceğinden, bunu yapmak istemezsiniz. Bunun yerine, eşlenen dosya içinde ofsetleri kullanın.