Что означает «транзакция»? значит, когда люди говорят о параллелизме?

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

Что конкретно означает транзакция?

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

Так означает ли транзакция отдельную инструкцию ЦП или инструкции, выполняемые в одной и той же записи ЦП? Например, в следующем коде

 x = x1 + x2 + x3;

возможно ли, что x1 + x2 вычисляется в одной записи процессора, и добавление (temporary for the sum of x1, x2) + x3 вычисляется в другой записи ЦП, и назначение = в x делается в третьей записи процессора?

2

Решение

Это как в базах данных. Некоторые инструкции, которые должны выполняться только (как) все сразу без перерывов. «Атомные операции» — это другое название. https://www.threadingbuildingblocks.org/docs/help/tbb_userguide/Atomic_Operations.htm

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

1

Другие решения

Транзакция, концепция на уровне приложений, относится к тому, что также известно как атомная операция.

Это та же концепция, что и транзакции базы данных, где база данных поддерживает согласованность, выполняя транзакции, собранные из нескольких параллельных сеансов, последовательно.

На уровне ЦП существуют также атомарные операции (которые обычно не называются транзакциями), которые имеют дело с обновлением памяти. Сами инструкции могут быть прерваны. Сложные инструкции могут считывать память, выполнять над ней операции, а затем записывать ее обратно. cmpxchg) инструкция считывает память, сравнивает ее со значением регистра и условно записывает обратно. Возможно, что память тем временем изменяется другим процессором. Специальный префикс кода операции, мнемоника которого LOCK предотвращает такую ​​модификацию другими процессорами.

Да, возможно, что заявление x = x1 + x2 + x3 выполняется на трех процессорах, хотя на практике этого не происходит, поскольку планировщик теряет производительность при переносе одного потока приложения на другой процессор. Кроме того, 3 прерывания должны произойти в течение нескольких тактовых циклов ЦП.

1

Транзакция — это операция «все или ничего», либо вы добились успеха полностью, либо все так, как если бы это никогда не происходило в том, что касается состояния данных.

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

0
По вопросам рекламы [email protected]