2011-08-24 20 views
7

Merak ediyorum ... Paylaşılan bir kütüphane A kullanan bir program başlatıyorum ve program çalışırken, diskteki paylaşımlı kütüphaneyi değiştiririm ve aynı paylaşıma bağlı başka bir Y programını çalıştırırım. kütüphane. Bu Y programı, paylaşılan kitaplığın bellekte zaten olan sürümünü kullanır mı yoksa sonraki değişikliklere sahip paylaşılan kitaplığın ayrı bir örneğini mi yükleyecek?Paylaşmak amacıyla paylaşılan "paylaşılan" bir kütüphane ne zaman?

Yüklenen bir kitaplığın paylaşılıp paylaşılmayacağı veya diskten yeniden yüklenip yüklenmeyeceği nasıl belirlenir?

cevap

4

dinamik yükleyici sadece düzenli eski open(2) ve mmap(2) çağrıları yapar ve bir bellek haritası inode refcounts açık fd yok aynı şekilde darbe. Bu nedenle, kütüphane için her zamanki atomik-dosya-değiştirme kodunu yaparsanız, değişikliklerinizi dosyanın yeni bir kopyasına yazın ve daha sonra eski adın üzerine rename(2), o noktadan sonra başlatılan her şey yeni inode'u ve yeni içerikler, ancak çalışan programlar eski inode'u ve eski içerikleri kullanmaya devam edecektir.

Kitaplığı yerinde değiştirirseniz, doğal olarak, write numaralı çağrıdan sonra başlatılan tüm programlar değişikliklerinizi alır. Daha ilginç olan soru, halihazırda haritalanmış olan işlemlere ne olduğudur. Cevap muhtemelen "sistem bunu yapmanıza izin vermez" veya "belirtilmemiş, sayfa önbellek uygulamasının ayrıntılarına bağlıdır". Linux uygulamasında kayıtsızca çağrışım (elimde ne var ki): Glibc dinamik yükleyicisi, tüm paylaşımlı kütüphane haritaları için MAP_DENYWRITE'u kullanır, ancak belgelenmemiş olan sesleri sesini "bu dosyayı eşleme sırasında değiştirilemez hale getir" anlamına gelir . Ancak, çekirdek kaynaklarında hiçbir şey bulamadığım MAP_DENYWRITE herhangi bir şey; Tarihsel bir yelek ya da benzeri olabilir.

Ayrıca MAP_PRIVATE kullanır. http://pubs.opengroup.org/onlinepubs/7908799/xsh/mmap.html, "MAP_PRIVATE eşlemesi oluşturulduktan sonra temel nesneye yapılan değişikliklerin MAP_PRIVATE eşleştirmesiyle görünür olup olmadığı belirtilmemiş." Dolayısıyla, sayfa önbelleği uygulamasının ayrıntılarına bağlı olarak, çalışan bir işlemin altında paylaşılan bir kitaplık görüntüsünü değiştirebilir veya değiştiremezsiniz.

0

Dinamik yükleyici, paylaşılan kitaplıkları yüklemek için mmap(2) kullanır, bu nedenle tüm sihir gerçekten mmap(2) içinde. Linux'un özel durumda

, dosya eşleştirmeleri mm/filemap.c:filemap_fault() dosya eşlemesi için vm_ops.fault setleri genellikle mm/filemap.c:generic_file_mmap() ne bağlanan fs özgü mmap() operasyonu, çağrı, bu nedenle sihirli sayfa hatası zamana ertelenmesi. filemap_fault(), sayfayı sayfa önbelleğinde find_lock_page()'u bulmaya çalışır.

mmap() → fs_file_ops.mmap() → generic_file_mmap() → file_vm_ops.fault = filemap_fault() 
page fault → filemap_fault() → find_lock_page() 
+0

aslında bu soruya cevap vermiyor – zwol

İlgili konular