2010-02-14 19 views
22

Konuyla ilgili biraz bilgi sahibi olan herkes, POSIX paylaşılan belleği (shm_open) ve POSIX eşlenen dosyaları (mmap) arasındaki gerçek fark nedir?Posix paylaşımlı hafıza vs mapped files

Her ikisi de/dev/tmpfs alt sistemini, daha eski IPC mekanizması yerine kullanır.

Paylaşılan bellek üzerinden mmap dosyası kullanmanın bir avantajı var mı?

Teşekkürler.

cevap

2

Anlayışım, paylaşılan belleğin eşlenen dosyaların üzerine kurulduğudur, ancak This Page, bellek eşlemeli dosyaları paylaşılan bellek olarak kullanma yeteneğinin koşullu olduğunu gösterir.

mmap() işlevinin kullanımı QSHRMEMCTL Sistem Değeri ile kısıtlanır. Bu sistem değeri 0 olduğunda, mmap() işlevi, PROT_WRITE özelliği ile paylaşılan bir eşleme oluşturmayabilir. Aslında, bu, eşlenen akış dosyasının içeriğini değiştirebilecek bir bellek haritasının oluşturulmasını önler. Bayraklar parametresi MAP_SHARED olarak belirtilirse, prot parametresi PROT_WRITE değerini belirtir ve QSHRMEMCTL sistem değeri 0'dır, ardından mmap() işlevleri başarısız olur ve EACCES hata sayısı oluşur.

+2

Oldukça kesin QSHRMEMCTL, iSeries'e özgüdür. Örneğin, http://www.opengroup.org/onlinepubs/007908775/xsh/mmap.html adresinden bahsedilmiyor. Unix apis hakkında pek çok soru gibi, cevap gerçekten hangi unix'e bağlı. –

+0

@Logan: yeterince adil, mantıksız bir kısıtlama gibi görünüyordu. –

-1

Temel olarak paylaşılan hafıza, sadece (RAM) oluşturulur/dev/shm oluşturulur IPC.The ortak bölgenin bir formudur ve dolayısıyla IPC daha hızlı bir yöntemdir, bir disk işlemleri gerektirir. IPC, disk dosyası kullanılarak ve daha sonra mmap kullanılarak yapılabilir, ancak bu, ancak yavaş yavaş olacaktır.Alternatif olarak her zaman herhangi bir disk dosyası ile yedeklemez mmap ile MAP_ANONYMOUS kullanabilirsiniz.

+1

MAP_ANONYMOUS, paylaşılan belleğe nasıl yol açar? – Flexo

+0

MAP_ANONYMOUS, ilgili işlemler (çocuklar, torunlar, vb.) Ve bunlar arasında çatallanan işlem arasında paylaşılan belleğe yol açabilir. –