2.4 Параллелизм
• Несколько потоков (выполняющихся кодов) могут одновременно работать с одними данными – совместно используемыми ресурсами – Переписывать изменения других потоков – Обращаться к несогласованным ресурсам • Одновременный доступ к данным – нестабильность системы, причины сложно обнаружить.
Вообще, параллелизм — это свойство систем, при которой несколько вычислений выполняются одновременно, и при этом, возможно, взаимодействуют друг с другом. Вычисления могут выполняться на нескольких ядрах одного чипа с вытесняющим разделением времени потоков на одном процессоре, либо выполняться на физически отдельных процессорах.
КРИТИЧЕСКИЕ УЧАСТКИ
• Критические участки (critical regions) – ветки кода, совместно использующие данные • Состояние гонки (race condition) – два потока одновременно находятся в критическом участке – Возникает не определённо (undetermined) – Трудно воспроизвести – сложно обнаружить при отладке • Для предотвращения состояний гонок код д. б. атомарным (atomic) (без перерывов)
ВОЗНИКНОВЕНИЕ ОДНОВРЕМЕННОГО ДОСТУПА
• Одновременный доступ при однопроцессорной обработке: Получение прерывания, Явная перепланировка выполнения кода ядра • При симметричной многопроцессорности (с 2.0): Код ядра может одновременно выполняться на нескольких процессорных ядрах • С серии 2.6 ядро Linux является вытесняемым (preemptive)
СОГЛАСОВАННОСТЬ НА УРОВНЕ ЯДРА
• Параллелизм (concurrency) – возможность параллельного выполнения кода: Критические участки не выполняются одновременно, Остальной код может выполняться одновременно
• Синхронизация (synhronization) – защита кода от возникновения состояния гонок
• Одновременный доступ (concurrent access) – одновременное выполнение критического участка кода
ВИДЫ ПАРАЛЛЕЛИЗМА
• Псевдо-параллелизм (pseudo-concurrency) – один код выполняется во время приостановки выполнения другого – Пример. В пространстве пользователя программы выполняются вытесняемо (preemptively): вытеснение во время работы одного процесса и начало работы другого • Истинный параллелизм (true concurrency) – при симметричной многопроцессорности два процессора могут одновременно выполнять один код • Их причины и семантика разные – приводят к одинаковым состояниям гонок – аналогичные средства защиты • Критические участки не должны участвовать в параллелизме – не должны выполняться один во время прерывания другого или одновременно
ПРИЧИНЫ ПАРАЛЛЕЛИЗМА
• Прерывания. Могут возникать асинхронно • Вытеснение ядра. В режиме ядра одно задание м. вытеснить другое • Переход в состояние ожидания и синхронизация с пространством пользователя • Симметричная многопроцессорность. Несколько процессоров могут выполнять код одновременно
БЕЗОПАСНОСТЬ
• Безопасный при прерываниях (interruptsafe) – код, который безопасно выполнять с обработчиком прерывания • Безопасный при вытеснениях (preemptsafe) – код, который имеет защиту от одновременного доступа к ресурсам при вытеснении кода ядра • Безопасный при симметричной многопроцессорности (SMP-обработке) (SMP-safe) – код, который безопасно выполнять с обработчиком прерывания
АТОМАРНЫЕ ОПЕРАЦИИ
Атомарные операции (atomic operations) – инструкции, которые выполняются, не прерываясь – атомарно. Параллельное выполнение двух атомарных операций с одной и той же переменной невозможно – состояние гонки возникнуть не может. Под атомарными операциями подразумеваются команды изменения данных в оперативной памяти, которые выполняются процессором с полной блокировкой шины памяти, т. е. ни один другой процессор гарантированно не будет конкурировать с монополистом. В Linux в качестве атомарной выбраны операции инкремента и декремента с проверкой счетчика на равенство нулю. Эти примитивы являются наиболее общими случаями для координации параллельных вычислений, на основе которых можно построить семафоры, спин-блокировку и другие, более сложные механизмы координации работы процессоров.
Семафоры — стандартное средство синхронизации процессов в Unix. Для того чтобы их можно было использовать и в SMP-системах, нужно обеспечить атомарность изменения счетчика семафора, поэтому в многопроцессорных версиях функций up (увеличение счетчика семафора) и down (его уменьшение) также используются атомарные команды. Основное отличие семафора от атомарных операций в том, что он предоставляет стандартный сервис, доступный для пользовательских программ.
Смысл механизма спин-блокировки состоит в том, чтобы предоставить процессу возможность монопольно захватить какой-либо объект памяти. При этом получить доступ на чтение объекта могут несколько процессов одновременно, но запись может происходить только в том случае, когда нет других читающих и пишущих процессов.
