2013-06-15 24 views
9

Farz edelim ki bu işleve sahip "i" nin global bir değişken olduğu bir kütüphane var.Paylaşılan kütüphanelerde global değişkenler nasıl bağlantılı?

int foo() { 
return i++; 
} 

Birden çok işlemden bu işlevi çağırdığımda, her işlemde "i" değeri diğer işlemlerden bağımsızdır.

Bu davranış oldukça bekleniyor.

Sadece bu davranışın linker tarafından nasıl uygulandığını merak ediyordum? Anlayışımdan kod süreçler arasında paylaşılır, bu nedenle değişken, bu kütüphaneyi kullanan her programın tüm adres alanlarında aynı sanal adrese sahip olmalıdır. Bu durum bana ulaşmak için oldukça zor görünüyor, sanırım burada bir şey kaçırıyorum ve farklı şekilde yapıldı.

Bu konuda daha ayrıntılı bilgi alabilir miyim?

+5

** Kod ** paylaşılıyor, değil ** veri. ** Dinamik bağlayıcı muhtemelen her işlem için değişkenin yeni bir kopyasını oluşturur, ancak metin (kod) segmentinin kopyalarını oluşturmaz. –

+0

@ H2CO3 Bunun farkındayım. Ancak ben bağlantı sürecinin ayrıntılarını soruyorum. –

+0

Daha fazla ayrıntıya ihtiyacınız varsa, gerçek bir uygulamaya bakmanız gerektiğini düşünüyorum. Linux'taki dinamik linker ve Darwin'deki (BSD/OS X/iOS) açık kaynak. –

cevap

0

Her işlemin kendi benzersiz adres alanı vardır, bu nedenle bir işlem değişkene eriştiğinde farklı değerlere sahip olabilir. Süreç aynı belleği paylaşacaksa, bunu özellikle ayarlamalıdır. Bunun için paylaşılan bir kütüphane yeterli değil.

+0

Her işlemin benzersiz adres alanına sahip olduğunun farkındayım. Bununla birlikte, kod paylaşılır. ve kod hafızada bazı adreslere (sanal) başvurur. Sorum şu, bu şeyin nasıl ele alındığıyla ilgili. –

+0

Ancak, aynı adrese işaret etseler bile, bellek sayfaları işlem ortamlarına göre değişir. Bellek sayfaları işletim sistemi tarafından atanır, bu nedenle linker bunun için özel bir şey yapmak zorunda değildir. – Devolus

6

Dinamik bağlantı süreci çalışma zamanında (statik bağlantı işlemi ile aynıdır), her işlem için ayrı veri (ve bss) segmentleri ayırır ve bunları işlem adres alanıyla eşleştirir. Sadece metin bölümleri süreçler arasında paylaşılır. Bu şekilde, her işlem kendi statik verilerini kopyalar.

+0

Ve veri bölümlerini her adres alanında tam olarak aynı konuma ayırmak gerekli mi? Eğer öyleyse, yer, boşluklardan birindeki diğer bazı veriler tarafından zaten kullanılıyorsa ne olur? –

+0

Segmentler, bir yerdeki adres boşluğuyla (varsa) eşleştirilir ve ardından gerçekleştirilirse bir bağlantı işlemi (yer değiştirme vb. Ve simge çözünürlüğü) verilir. – Ziffusion

+0

Ancak kod paylaşılırsa, aynı kodu kullanan diğer işlemleri etkilemeden nasıl yeniden konumlandırma yapabilirim? –

2

kod işlemleri arasında paylaşılan, bu nedenle değişken bu kütüphaneyi kullanan her programın tüm adres mekanlarda aynı sanal adresine sahip sahiptir

kod yolu Paylaşılmayan düşünüyorum. Evet, dinamik paylaşılan nesne yalnızca bir kez yüklenir, ancak bellek başvuruları veya yığın veya so kullanım kodlarını içeren yığın paylaşılmaz. Sadece kodu içeren bölüm paylaşılır.

İlgili konular