Информация об изменениях

Сообщение Re: Разделяемая память и ее защита. от 05.12.2018 9:47

Изменено 06.12.2018 7:19 lpd

Re: Разделяемая память и ее защита.
Здравствуйте, Ivych, Вы писали:


I>Так вот, как видно в функции XXXX_ShmemCopy, копирование данных в область и из нее, производится вызовом memcpy, обернутым в семафор и дополнительным отключением прерываний на момент копирования, чтобы обеспечить атомарность операции. Есть ли вообще смысл в такой перестраховке на однопроцессорной системе?

На однопроцессорной машине достаточно одного запрета прерываний.

I> Минус в использовании _disable()/_enable() при больших объемах копирования (которых скорее всего не будет), на момент выполнения операции, стопорится работа всей системы, или если вызовов XXXX_ShmemCopy будет много (а их скорее всего будет много), то рискуем то и делать что бесконечно выключать/включать прерывания.

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

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


Нужно использовать atomic_* функции или atomic_t тип. Выражение справа роли не играет.
Re: Разделяемая память и ее защита.
Здравствуйте, Ivych, Вы писали:


I>Так вот, как видно в функции XXXX_ShmemCopy, копирование данных в область и из нее, производится вызовом memcpy, обернутым в семафор и дополнительным отключением прерываний на момент копирования, чтобы обеспечить атомарность операции. Есть ли вообще смысл в такой перестраховке на однопроцессорной системе?

На однопроцессорной машине достаточно одного запрета прерываний.

I> Минус в использовании _disable()/_enable() при больших объемах копирования (которых скорее всего не будет), на момент выполнения операции, стопорится работа всей системы, или если вызовов XXXX_ShmemCopy будет много (а их скорее всего будет много), то рискуем то и делать что бесконечно выключать/включать прерывания.

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

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


Нужно использовать atomic_* функции или atomic_t тип. Выражение справа роли не играет.