Для приведенной ниже программы, использующей межпроцессную разделяемую память Boost,
#include <iostream>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/list.hpp>
#include <iostream>
#define SHARED_MEMORY_NAME "SO12439099-MySharedMemory"
#define DATAOUTPUT "OutputFromObject"
#define INITIAL_MEM 650000
#define STATE_MATRIX_SIZE 4
using namespace std;
namespace bip = boost::interprocess;
class SharedObject
{
public:
unsigned int tNumber;
bool pRcvdFlag;
bool sRcvdFlag;
unsigned long lTimeStamp;
};
typedef bip::allocator<SharedObject, bip::managed_shared_memory::segment_manager> ShmemAllocator;
typedef bip::list<SharedObject, ShmemAllocator> SharedMemData;
int main()
{
bip::managed_shared_memory* seg;
SharedMemData *sharedMemOutputList;
bip::shared_memory_object::remove(DATAOUTPUT);
seg = new bip::managed_shared_memory(bip::create_only, DATAOUTPUT, INITIAL_MEM);
const ShmemAllocator alloc_inst(seg->get_segment_manager());
sharedMemOutputList = seg->construct<SharedMemData>("TrackOutput")(alloc_inst);
std::size_t beforeAllocation = seg->get_free_memory();
std::cout<<"\nBefore allocation = "<< beforeAllocation <<"\n";
SharedObject temp;
sharedMemOutputList->push_back(temp);
std::size_t afterAllocation = seg->get_free_memory();
std::cout<<"After allocation = "<< afterAllocation <<"\n";
std::cout<<"Difference = "<< beforeAllocation - afterAllocation <<"\n";
std::cout<<"Size of SharedObject = "<< sizeof(SharedObject) <<"\n";
std::cout<<"Size of SharedObject's temp instance = "<< sizeof(temp) <<"\n";
seg->destroy<SharedMemData>("TrackOutput");
delete seg;
}//main
Вывод:
Before allocation = 649680
After allocation = 649632
Difference = 48
Size of SharedObject = 16
Size of SharedObject's temp instance = 16
Если размер SharedObject
и его экземпляра составляет 16 байт, то как может разница в распределении быть 48? Даже если заполнение было выполнено автоматически, это все равно слишком много, чтобы учесть трехкратный размер (для больших структур он увеличивается в 1,33 раза).
Из-за этого я не могу надежно выделять и динамически увеличивать общую память. Если SharedObject
содержит динамически растущий список, это может еще больше увеличить неопределенность распределения пространства.
Как можно безопасно разрешить эти ситуации?
ps: для запуска программы надо слинковать библиотеку pthread
и еще librt.so
.
Обновление:
Это схема использования памяти, которую я получил, когда свел в таблицу значения для нескольких прогонов (столбец memory increase
в основном представляет собой текущую строку столбца memory used
за вычетом предыдущей строки memory used column
):
╔═════════════╦════════════════╦═════════════════╗.
║ используемая память ║ размер структуры ║ увеличение объема памяти ║
═══════════════╣
║ 48 ║ 1 ║ ║
║ 48 ║ 4 ║ 0 ║
║ 48 ║ 8 ║ 0 ║
║ 16 ║ 0 ║
║ 64 ║ 32 ║ 16 ║
║ 64 ║ 40 ║ 0 ║
║ 80 ║ 48 ║ 16 ║
║ 96 ║ 64 ║ 32 ║
║ 160 ║ 128 ║ 64 ║
║ 288 ║ 256 ║ 128 ║
║ 3 416 ║ ║ 544 ║ 512 ║ 128 ║
║ 800 ║ 768 ║ 256 ║
║ 1056 ║ 1024 ║ 25 6. ════╝
ВАЖНО: приведенная выше таблица применима только к общей памяти list
. Для vector
значения (используемая память, размер структуры) равны = (48, 1), (48, 8), (48, 16), (48, 32), (80, 64), (80, 72), (112, 96), (128, 120), (176, 168), (272, 264), (544, 528).
Поэтому для других контейнеров требуется другая формула расчета памяти.