Вопрос по Shared memory (Разделяемая память).

ivan84

У меня следующая проблема:
Я хочу создать объект разделяемой памяти, в который будет записан массив данных для дальнейшего использования.
Я пишу программу в QNX Momentics.
Я нашел описание того как можно это сделать для строки:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <inttipes.h>
int main
{
int fd, status;
void* buffer;
fd = shm_open("/swd_es", O_RDWR | O_CREAT, 0777);
status = ftruncate(fd, 100);
buffer = mmap(0, 100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
sprintf(buffer, "It's a nice day today, isn't it?");
printf("shm_creator: %s\n", buffer);
return EXIT_SUCCESS;
}

kokoc88

Ты не мог бы задать вопрос более конкретно?

okis

Это ж обычная память с точки зрения C. Используй memcpy.

ivan84

я просто плохо сам в этом всем пока разбираюсь, мне надо чтобы в разделяемую память был записан массив типа int

margadon

memcpy(buffer, &src_array[0], src_array_sz*sizeof(int при условии что размер массива меньше 100 / sizeof(int) элементов
учти, что тут в полный рост проявляются межпроцессные взаимодействия, потому может потребоваться синхронизация семафорами, мутексами итд

SPARTAK3959

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

erotic

отличить Shared-память от какой-либо другой не возможно.
Зачем тогда нужно это?
The process-shared attribute is set to PTHREAD_PROCESS_SHARED to permit a mutex to be operated upon by any thread that has access to the
memory where the mutex is allocated, even if the mutex is allocated in memory that is shared by multiple processes. If the process-
shared attribute is PTHREAD_PROCESS_PRIVATE, the mutex shall only be operated upon by threads created within the same process as the
thread that initialized the mutex; if threads of differing processes attempt to operate on such a mutex, the behavior is undefined.

okis

В приведённом куске манов речь идёт про мьютексы, а не про разделяемую память. Это разные инструменты синхронизации.

erotic

Это я к тому, что если бы не было разницы между шареной и не шареной памятью, я мог бы положить туда мьютекс и использовать из нескольких процессов одновременно. Из этого мана следуют, что есть разница. Хотя бы в отношении pthread-объектов.

geja_03

Там идет речь про process-shared, то бишь разделяемая между процессами, а в топике про shared, разделяемую между потоками.

kokoc88

а в топике про shared, разделяемую между потоками
Это как?

zya369

shared.h

// contains shared memory objects
int sharedIntArray[100];

:grin:

SPARTAK3959

Тут говорится о том, как правильно создавать мьютексы, чтобы их можно было использовать из других процессов. Если мьютекс не в shared-памяти, то обеспечить корректный доступ из других процессов разумеется нельзя, поэтому и беспокоится не о чем. Вместо этого создают именнованные мьютексы, которые располагаются в ядре.

okis

Это как?
У тредов же вообще память общая, так что топик про разделяемую между процессами память.

erotic

Там идет речь про process-shared, то бишь разделяемая между процессами, а в топике про shared, разделяемую между потоками.
Во всех системах, в которых я работал или о которых когда-либо слышал, память между потоками всегда разделяемая.

geja_03

Во всех системах, в которых я работал или о которых когда-либо слышал, память между потоками всегда разделяемая.
Бывает ступил. =) Но есть такая штука как TLS

Dasar

я мог бы положить туда мьютекс и использовать из нескольких процессов одновременно.
очень спорное утверждение.
например, в shared memory нельзя также класть ссылочные структуры (вернее можно, но работать с ними нормально не получится) и т.д.
а mutex - это же ссылочная структура - это ссылка на объект ядра, соответственно нет никаких гарантий - что эти ссылки будут работать в другом процессе.

erotic

например, в shared memory нельзя также класть ссылочные структуры
Спасибо за еще один довод в пользу того, что shared память != обычная память.

Dasar

Спасибо за еще один довод в пользу того, что shared память != обычная память.
мне не нравится сама формулировка утверждения...
shared memory, как память, самая обычная - в ней можно хранить и ссылочные структуры, и mutex-ы, если использовать их только из под того же процесса, который положил, и можно даже очень-очень аккуратно использовать такие структуры из под другого процесса.
а необычность появляется у данных, когда забывается, что:
1. многие данные имеют неявную привязку к конкретному процессу (как те самые ссылочные структуры, и mutex-ы).
2. при использовании shared-memory происходит неявная передача данных между процессами
если эти же данные тупо (в виде бинарного образа из памяти) передавать другими способами (например, через socket/pipe) между процессами, то проблемы будут все те же самые.
Оставить комментарий
Имя или ник:
Комментарий: