LINUX.ORG.RU

Разделяемая память и ее защита.

 , , , ,


1

2

Добрый вечер, форумчане!

Имеется вопрос, есть в проекте (операционка QNX4.25) несколько разделяемых объектов памяти, для взаимодействия между процессами. Есть один писатель в каждую из них и несколько читателей, я написал несколько функций оберток вида:

void XXXX_ShmemLock()
{
	assert( g_Shmem );
	sem_wait( &g_Shmem->lock );
}

void XXXX_ShmemUnlock()
{
	assert( g_Shmem );
	sem_post( &g_Shmem->lock );
}

void XXXX_ShmemCopy( void *destination, const void *source, const size_t num )
{
	XXXX_ShmemLock();
	_disable();
	memcpy( destination, source, num );
	_enable();
	XXXX_ShmemUnlock();
}

Дальнейшие операции более высокого уровня, выполняются путем вызова функций-оберток, как пример приложу:

void XXXX_ReadADC( const ADCChannel_t channel, double *voltage )
{
	assert( channel < ADC_ChannelsNum );
//	*voltage = g_Shmem->Vin[channel];
	XXXX_ShmemCopy( (void *)voltage, (const void *)&g_Shmem->Vin[channel], sizeof(g_Shmem->Vin[channel]) );
}

void XXXX_WriteADC( const ADCChannel_t channel, const double voltage )
{
	assert( channel < ADC_ChannelsNum );
//	g_Shmem->Vin[channel] = voltage;
	XXXX_ShmemCopy( (void *)&g_Shmem->Vin[channel], (const void *)&voltage, sizeof(voltage) );
}
P.S. Насколько рационален такой подход?

Так вот, как видно в функции XXXX_ShmemCopy, копирование данных в область и из нее, производится вызовом memcpy, обернутым в семафор и дополнительным отключением прерываний на момент копирования, чтобы обеспечить атомарность операции. Есть ли вообще смысл в такой перестраховке на однопроцессорной системе? Минус в использовании _disable()/_enable() при больших объемах копирования (которых скорее всего не будет), на момент выполнения операции, стопорится работа всей системы, или если вызовов XXXX_ShmemCopy будет много (а их скорее всего будет много), то рискуем то и делать что бесконечно выключать/включать прерывания. Так же есть ли необходимость оборачивания простых операций вида «Область->переменная = что-то записать», понятное дело не делая справа от «=» сложных операций, будет ли такая операция выполнена атомарно?



Последнее исправление: subuser (всего исправлений: 1)

то рискуем то и делать что бесконечно выключать/включать прерывания.

Я не спец по RTOS, но кажется что идея отключать прерывания в RTOS не самая лучшая. Скорее всего просто локов достаточно будет.

xpahos ★★★★★
()

С QNX4 я не работал, но в QNX6 драйверы могут использовать POSIX-интерфейсы. От чего ты вообще защищаешься запретом прерываний (который сам по себе _очень_ плохая идея в задачах реального времени)?

Насколько рационален такой подход?

Этот подход нелеп. Со своими memcpy в/из разделяемой памяти ты фактически городишь обмен сообщениями. Используй нормальный системный SRR.

есть ли необходимость оборачивания простых операций вида «Область->переменная = что-то записать», понятное дело не делая справа от «=» сложных операций, будет ли такая операция выполнена атомарно?

Зависит от того, что ты называешь «атомарным».

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 2)
Ответ на: комментарий от tailgunner

С QNX4 я не работал, но в QNX6 драйверы могут использовать POSIX-интерфейсы. От чего ты вообще защищаешься запретом прерываний (который сам по себе _очень_ плохая идея в задачах реального времени)?

От запрета отказался.

Этот подход нелеп. Со своими memcpy в/из разделяемой памяти ты фактически городишь обмен сообщениями. Используй нормальный системный SRR.

А можно пояснить, если memcopy осуществляет обмен сообщениям, то в чем смысл организовывать ему самому? Может быть я Вас не до конца понял.

Зависит от того, что ты называешь «атомарным».

Операция которая выполняется как единое целое и не может быть прервана кем либо.

subuser
() автор топика
Ответ на: комментарий от subuser

если memcopy осуществляет обмен сообщениям, то в чем смысл организовывать ему самому?

Кхм. Сейчас ты сам организуешь обмен сообщениями. используя разделяемую память, семафоры и memcpy. В случае стандартного SRR его организует система, и разделяемая память не нужна.

Вообще использовать разделяемую память как буфер для передачи сообщений - идея так себе. Она предназначена, чтобы в ней хранить действительно общие, совместно используемые даные.

и не может быть прервана кем либо.

Весь вопрос - кем. Если участвующими в обмене процессами, то да, копирование под семафором атомарно.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Сейчас ты сам организуешь обмен сообщениями. используя разделяемую память, семафоры и memcpy.

Да теперь понял. Спасибо.

subuser
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.