Как определить, сколько разделяемой памяти выделить?

Я создаю схему межпроцессного взаимодействия, используя boost::interprocess, Я хочу, чтобы моя область общей памяти содержала некоторые std::vectorи я делаю это на основе приведенного здесь примера.

Чтобы общаться, я планирую поместить структуру, подобную следующей, в общую память (даже не пытался скомпилировать это, кстати):

// Define an STL compatible allocator of doubles that allocates from the managed_shared_memory.
// This allocator will allow placing stl containers in the segment
typedef allocator<doublereal, boost::interprocess::managed_shared_memory::segment_manager>  ShmemAllocator_doublereal;

// Alias a vector that uses the previous STL-like allocator so that it
// allocates its values from the segment
typedef vector<doublereal, ShmemAllocator_doublereal> shmVector_doublereal;

// Define an STL compatible allocator for uint32_t in shared memory
typedef allocator<uint32_t, boost::interprocess::managed_shared_memory::segment_manager>  ShmemAllocator_uint32_t;

// Shared memory vector for uint32_t type for lables
typedef vector<uint32_t, ShmemAllocator_uint32_t> shmVector_uint32_t;


struct shared_memory_buffer {
    // Server initialized with one to start, client must wait for it to be released
    shared_memory_buffer(int nnodes, boost::interprocess::managed_shared_memory segment): server(1), client(0){

        // Initialize shared memory STL-compatible allocators
        const ShmemAllocator_doublereal alloc_inst_d (segment.get_segment_manager());
        const ShmemAllocator_uint32_t alloc_inst_u (segment.get_segment_manager());

        // Construct the data vectors
        motion_data = segment.construct<shmVector_doublereal>("motion_data_vector")(alloc_inst_d);

        force_data = segment.construct<shmVector_doublereal>("force_data_vector")(alloc_inst_d);

        labels = segment.construct<shmVector_uint32_t>("label_vector")(alloc_inst_u);

        // position, velocity and acceleration in 6dof
        motion_data.resize (nnodes * 6  * 3);

        // force in 6dof
        force_data.resize (nnodes * 6);

        // n node labels
        labels.resize (nnodes);

    }

    // convenience function to get the motion data vector from the shared
    // memory segment
    shmVector_doublereal<doublereal, ShmemAllocator_doublereal> * getMotionData (boost::interprocess::managed_shared_memory segment) {
        return segment.find<shmVector_doublereal>("motion_data_vector").first;
    }

    // convenience function to get the force data vector from the shared
    // memory segment
    shmVector_doublereal<doublereal, ShmemAllocator_doublereal> * getMotionData (boost::interprocess::managed_shared_memory segment) {
        return segment.find<shmVector_doublereal>("force_data_vector").first;
    }

    // convenience function to get the buffer from the shared
    // memory segment
    shmVector_doublereal<doublereal, shmMemAllocator> * getLabels (boost::interprocess::managed_shared_memory segment) {
        return segment.find<shmVector_uint32_t>("label_vector").first;
    }

    // semaphores for read/write control
    boost::interprocess::interprocess_semaphore server, client;

    // buffer for motion data
    shmVector_doublereal<doublereal, shmMemAllocator> *motion_data;

    // buffer for force data
    shmVector_doublereal<doublereal, shmMemAllocator> *force_data;

    // buffer for label data
    shmVector_uint32_t<uint32_t, shmMemAllocator> *labels;

    //doublereal time;

};

Моя проблема в том, как я могу узнать, сколько памяти выделить при создании общей памяти, например, с помощью

managed_shared_memory segment(create_only, "MySharedMemory", 65536);

Поэтому я хочу узнать / оценить, сколько всего памяти должно быть выделено для хранения всей структуры, содержащей векторы, в области общей памяти.

Во время выполнения, до выделения разделяемой памяти, я всегда буду знать, сколько элементов будет в векторах (см. Конструктор структуры, чтобы дать представление об этом), но не во время компиляции, что является одной из причин, по которой я использую векторы. Я мог бы просто выделить то, что, по моему мнению, довольно много, исходя из того, как я думаю, что люди могут использовать это, но, несомненно, когда-нибудь кто-то будет использовать слишком много узлов и будет иметь трудности.

0 ответов

Другие вопросы по тегам