Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AOS_otvety_1.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.29 Mб
Скачать

Понятие гонок

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

Пример ситуации гонок: База данных, хранящая инфу о заказах и оплате клиента. С БД работает 2 потока: один пишет инфу о заказах, второй об оплате.

Итак:

  1. Работает поток А: сделал А1 и А2, считал инфу в буфер, но в файл пока ничего не сохранил, в файле нет инфы о заказе.

  2. Работает поток Б: сделал Б1 и Б2, в его буфере нет ничего про заказ клиента (инфа о нем хранится в буфере потока А)

  3. Поток А выполнилА3 и записал в файл свою информацию

  4. Поток Б выполнил Б3 записал в файл свою устаревшую информацию, затерев ту, что была записана – инфа о заказе потеряна.

Сложность проблемы заключается в нерегулярности ее возникновения.

Гонки – это ситуация, когда 2 или более потоков обрабатывают разделяемые данные и результат работы зависит от соотношения скоростей потоков (кто успел – обогнал, тот и съел);

Критическая секция кода и исключение гонок

Критическая секция – важное понятие синхронизации.

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

Критическая секция всегда определяется по отношению к критическим данным – данным, при несогласовании которых могут возникнуть непредсказуемые эффекты.

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

Такой прием называется взаимным исключением.

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

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

Блокирующие переменные

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

Для каждого набора критических данных заводится своя двоичная переменная, которая устанавливается в 0, когда поток входит в КС, и в 1 – когда он ее покидает.

Блокирующие переменные могут быть использованы при работе с любыми разделяемыми ресурсами.

Но нельзя прерывать поток между выполнением проверки состояния переменной и установки ее значения. Для этого можно:

- использовать встроенную в процессор единую команду анализа и присвоения значения логической переменной

- а если такой нет, специальными системными примитивами запрещать в это время все прерывания.

Недостаток такой системы:

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]