Насколько я понимаю, системы с несколькими ЦП могут столкнуться с трудностями из-за упорядочения операций чтения и записи в памяти относительно других операций чтения и записи в памяти, но является ли это проблемой для большинства современных систем?
Нет. Любые современные системы с «менее строгим» упорядочением памяти будут иметь способы сделать упорядочение памяти более строгим там, где это имеет значение (например, ограждения).
Есть ли какие-либо преимущества в использовании семафорных мьютекс-блокировок VS?
Мьютексы, как правило, проще и быстрее (так же, как логическое значение проще, чем счетчик);но игнорируя накладные расходы, мьютекс эквивалентен семафору с «счетчиком ресурсов = 1».
Что может произойти, если мы воспользуемся решением Петерсона для решения проблемы критической секции на современном компьютере?
Большая проблема здесь заключается в том, что большинство современных операционных систем поддерживают некоторые виды многозадачности (например, несколько процессов, где каждый процесс может иметь несколько потоков), обычно есть 100 других процессов (только для одной ОС), и современныеаппаратное обеспечение имеет управление питанием (где вы пытаетесь избежать энергопотребления, переводя процессоры в спящий режим, когда они не могут выполнять полезную работу). Это означает, что (неограниченное) ожидание вращения / занятости является ужасной идеей (например, вы можете потратить впустую N процессоров, пытаясь получить блокировку, в то время как задача, которая в данный момент удерживает блокировку, не выполняется ни на одном процессоре, потому что планировщик решил, что1234 другие задачи должны получить 10 мс процессорного времени каждая).
Вместо этого;чтобы избежать (чрезмерного) вращения, вы хотите попросить планировщик заблокировать вашу задачу до тех пор, пока блокировка не будет фактически получена;и (особенно для сильно спорных блокировок) вы, вероятно, захотите «справедливости» (чтобы избежать риска проблем со временем, которые приводят к тому, что некоторые задачи часто оказываются удачными, в то время как другие задачи голодают и не достигают прогресса).
«нет вращения» или «короткое вращение» (чтобы избежать накладных расходов планировщика в тех случаях, когда задача, удерживающая блокировку, действительно может / действительно снимает ее быстро);затем задача ставится в очередь FIFO, а планировщик отдает ЦП другой задаче или переводит процессор в спящий режим;где, если блокировка снята, планировщик запускает первую задачу в очереди FIFO. Конечно, это никогда не бывает так просто (например, для повышения производительности вы хотите сделать как можно больше в пользовательском пространстве; вам необходимо особое внимание и взаимодействие между пользовательским пространством и ядром, чтобы избежать условий гонки - блокировка снимается до того, как задачапоставить в очередь ожидания).
К счастью, современные системы также предоставляют более простые способы реализации блокировок (например, «атомарное сравнение и своп»), поэтому нет необходимости прибегать к алгоритму Петерсона (даже если он только для вставки /удаление задач из очереди FIFO реальной блокировки).