27 Haziran 2016 Pazartesi

boost interprocess shared memory

Giriş
Bu yazı shared memory belleğinin sadece byte dizisi şeklinde nasıl kullanılacağını gösteriyor. Daha karmaşık veri yapılarını kullanabilmek için Managed Memory Segments sınıflarına bakılmalı.

1. Önce bir shared memory_object nesnesi yaratılmalı.
Not : Daha özel amaçlar için
Windows'a özel windows_shared_memory,
Unix'e özel xsi_shared_memory,
Unix'e özel anonymous_shared_memory

sınıflarından birisi de kullanılabilir.

2. shared_memory_object nesnesinin uzunluğunu ata
3. mapped_region nesnesi ile belleği uygulamaya dahil et.
4. mapped_region nesnesini byte dizisi gibi kullanarak belleğe okuma yazma işlemleri gerçekleştir

Daha kolay kodlamak için şu satır dahil edilir.
using boost::interprocess;
Ya da şöyle yaparız.
namespace ipc = boost::interprocess;
shared_memory_object Sınıfı
shared_memory_object Sınıfı yazısına taşıdım.

mapped_region sınıfı
Şu satırı dahil ederiz.
#include <boost/interprocess/mapped_region.hpp>
constructor
Salt okunur işlem için şöyle yaparız.
//Open already created shared memory object.
windows_shared_memory shm (open_only, "shm", read_only);

//Map the whole shared memory in this process
mapped_region region(shm, read_only);
Hem okunur hem yazılır işlem için şöyle yaparız.
//Create a shared memory object
shared_memory_object shm(create_only, "MySharedMemory", read_write);

//Set size to 1
shm.truncate(1);

//Map the whole shared memory in this process
mapped_region region(shm, read_write);
get_addres metodu
region.get_address() ile döndürülen belleği kullanabiliriz.
char *myChar= static_cast<char*>(region.get_address());
get_size metodu
Şöyle yaparız
char *mem = static_cast<char*>(region.get_address());

for (std::size_t i = 0; i < region.get_size(); ++i)
{
  std::cout << "Memory value: " << (int)*mem << "\n";
  mem++;
}
xsi_shared_memory sınıfı


Şöyle yaparız.
#include <boost/interprocess/xsi_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>

using namespace boost::interprocess;

int main(int argc, char *argv[])
{
  //Build XSI key (ftok based)
  xsi_key key(argv[0], 1);
  //Create a shared memory object.
  xsi_shared_memory shm (create_only, key, 1000);
  // TODO Remove if exists
  printf("shmid: %d\n", shm.get_shmid());
}
Bu sınıfın shmid alanını şöyle görebiliriz.


ipcs -m

key        shmid      owner      perms      bytes      nattch     status      
0x00005feb 0          root       666        12000      2                       
0x00005fe7 32769      root       666        524288     2                       
0x00005fe8 65538      root       666        2097152    2                       
0x0001c08e 98307      root       777        2072       0       

windows_shared_memory sınıfı
Windows'ta shared memory bu kaynağı kullanan en son uygulama sonlanınca işletim sistemi tarafından otomatik olarak yok edilir. Posix sistemlerde ise shared memory nesnesi kalıcıdır. Uygulamaların yaşam döngüsünden bağımsızdır. Her iki yöntemi birleştirmek için boost interprocess windows'ta memory mapped file kullanır.  Eğer bu yöntemi istemiyorsak windows_shared_memory sınıfını kullanırız. Şu satırı dahil ederiz.
#include <boost/interprocess/windows_shared_memory.hpp>
Yazmak için shared memory şöyle yaratılır.
//Create a native windows shared memory object.
windows_shared_memory shm (create_only, "shm", read_write, 65536);
Okumak için shared memory şöyle yaratılır.
//Open already created shared memory object.
windows_shared_memory shm (open_only, "shm", read_only);








Hiç yorum yok:

Yorum Gönder