Как определить, сколько разделяемой памяти выделить?
Я создаю схему межпроцессного взаимодействия, используя 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);
Поэтому я хочу узнать / оценить, сколько всего памяти должно быть выделено для хранения всей структуры, содержащей векторы, в области общей памяти.
Во время выполнения, до выделения разделяемой памяти, я всегда буду знать, сколько элементов будет в векторах (см. Конструктор структуры, чтобы дать представление об этом), но не во время компиляции, что является одной из причин, по которой я использую векторы. Я мог бы просто выделить то, что, по моему мнению, довольно много, исходя из того, как я думаю, что люди могут использовать это, но, несомненно, когда-нибудь кто-то будет использовать слишком много узлов и будет иметь трудности.