Почему сон в критической секции является проблемой параллелизма? - PullRequest
2 голосов
/ 12 ноября 2010

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

Я могу спать, потому что скажу, что я делаю ввод / вывод.

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010

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

Ввод-вывод почти наверняка должен выполняться вне любого критического раздела, как правило.Например, если вы читаете некоторые данные, вам нужно прочитать данные, затем войти в критическую секцию и добавить данные в некоторую структуру, чтобы все остальные могли ее видеть (например, добавить узел с указателем на него).данные в вектор), а затем покинуть CS.

Почти никогда нет веских причин для выполнения самого ввода-вывода в CS - обычно для ввода-вывода достаточно одного потока,и иметь очередь (или deque, или что-то еще) для обработки ввода или вывода из этого потока.Добавление чего-либо или чтение чего-либо из очереди защищено CS (или, возможно, семафором и т. Д.), Но происходит быстро , поэтому один поток может сделать свое дело, а затем быстро уйти с пути, чтобы другие потокиможет также.

1 голос
/ 12 ноября 2010

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

В случае, если вы не знакомы с ним, рассмотрите следующий пример.

Представьте себе три (3) задачи разного приоритета: tLow, tMed и tHigh.tLow и tHigh потребуется разное время для доступа к одному и тому же критическому ресурсу;tMed делает свое дело.

  1. tLow работает, tMed и tHigh в настоящее время заблокированы (но не в критической секции).
  2. tLow приходит и входит в критическую секцию.
  3. tHigh разблокирует и, поскольку это задача с наивысшим приоритетом в системе, она запускается.
  4. tHigh затем пытается войти в критический ресурс, но блокируется, так как tLow находится там.
  5. tMedразблокируется и, поскольку теперь она является задачей с наивысшим приоритетом в системе, она запускается.

tНе может выполняться, пока tLow не откажется от ресурса.tLow не может работать до тех пор, пока tMed не прекратит работу.Приоритет задач был инвертирован;Несмотря на то, что он имеет самый высокий приоритет, он находится внизу цепочки выполнения.

Надеюсь, это поможет.

0 голосов
/ 12 ноября 2010

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

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

Когда вы выполняете ввод-вывод, ваш процесс должен блокироваться до тех пор, покаО завершает.Таким образом, спать не нужно.Но это другая история.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...