В моей предыдущей статье "Если кто-то спросит вас, что такое модель памяти Java, пришлите ему эту статью.«В статье представлена модель памяти Java. Благодаря этой статье каждый должен знать концепцию и функции модели памяти Java. В этой статье упоминается, что при параллельном программировании Java обычно возникают три проблемы, а именно: Проблемы атомарности, проблемы согласованности и проблемы упорядочения.
В приведенной выше статье кратко показано, что по разным причинам в многопоточных сценариях могут возникать проблемы с атомарностью, согласованностью и упорядочением. Но это не глубоко.Эта статья основана на предыдущей.Давайте посмотрим.В параллельном программировании,откуда берутся эти проблемы?
Во-первых, давайте начнем с операционной системы и сначала разберемся с некоторыми основами.
Срез процессорного времени
Многие знают, что сейчас мы используем операционные системы, будь то Windows, Linux или MacOS, которые на самом деле являются многопользовательскими, многозадачными и с разделением времени операционными системами. «Пользователи», использующие эти операционные системы, могут делать несколько дел «одновременно», что уже является повседневной привычкой и не ощущается ничего особенного.
Но на самом деле для однопроцессорного компьютера в ЦП одновременно может выполняться только одно дело.
Чтобы выглядеть как «выполнение нескольких дел одновременно», операционная система с разделением времени делит процессорное время на длинные и короткие интервалы времени, которые в основном одинаковы, то есть «кванты времени». " для использования.
Если «пользователь» не выполнил всю задачу до конца временного интервала, «пользователь» должен войти в состояние готовности, отказаться от ЦП и дождаться следующего цикла. В это время ЦП выделяется для использования другим «пользователем».
ЦП похож на телефонную будку, им могут пользоваться все пользователи, но у него есть правила, согласно которым каждый пользователь может использовать его только в течение определенного периода времени после входа в телефонную будку. Если время истекло, а пользователь не закончил вызов, ему будет предложено повторно поставить в очередь.
Различные операционные системы имеют разные алгоритмы планирования для выбора «пользователей» для распределения временных интервалов.Обычно используемые из них — FCFS, циклический перебор, SPN, SRT, HRRN, обратная связь и т. д. расширен.
Существуют разные стратегии, для которых эта телефонная будка может позволить совершать звонки.Разные телефонные будки имеют разные правила.Некоторые телефонные будки используют механизм очередей (FCFS), а некоторые отдают приоритет человеку с наименьшим временем звонка (SPN). и т.п.
процесс и поток
Когда я представил кванты времени ЦП, я упомянул, что ЦП будет выделять кванты времени «пользователям» в соответствии с различными алгоритмами планирования. «Пользователи» здесь раньше относились к процессам. С непрерывным развитием операционной системы теперь обычно относится к потоки.
В операционных системах, в которых раньше не было потоков, выделение ресурсов и их выполнение выполнялись процессами. С развитием технологий, чтобы уменьшить накладные расходы, вызванные переключением процессов, и улучшить возможности параллелизма, в операционную систему вводятся потоки. Разделить работу, изначально принадлежавшую процессу, на две части, при этом процесс по-прежнему отвечает за выделение ресурсов, а поток отвечает за выполнение.
То есть процесс — это основная единица распределения ресурсов, а поток — основная единица планирования.
Проблемы параллелизма в многопоточности
После понимания приведенных выше базовых знаний, связанных с оборудованием и операционными системами, давайте рассмотрим проблемы параллелизма в многопоточных сценариях.
О проблемах атомарности, видимости и упорядоченности в параллельном программировании я в "модель памяти» было представлено в статье.
В тексте упоминается, что проблема когерентности кеша на самом деле является проблемой видимости. А оптимизация процессора может привести к проблемам с атомарностью. Перестановка инструкций может вызвать проблемы с заказом. Некоторые читатели не очень хорошо понимают эту часть. Поскольку предыдущая статья в основном знакомила с моделью памяти, она не анализировалась, а давала только вывод.Здесь я подробно разберу эту часть.
Проблемы с видимостью из-за проблем с когерентностью кешамодель памяти«Введение очень ясное, поэтому я не буду здесь вдаваться в подробности, а в основном объединим эту статью для анализа вопросов атомарности и упорядочения.
проблема атомарности
Когда мы говорим атомарность, мы на самом деле имеем в виду, что если операция в многопоточном сценарии не может гарантировать атомарность, результаты обработки будут несовместимы с ожиданиями.
Как мы упоминали ранее, поток — это основная единица планирования ЦП. ЦП имеет концепцию кванта времени и будет планировать потоки в соответствии с различными алгоритмами планирования. Таким образом, в многопоточных сценариях возникнут проблемы с атомарностью. потому что поток выполняет读改写
операция, после исполнения读改
После этого, когда квант времени будет исчерпан, будет предложено отказаться от ЦП и дождаться перепланирования. В этой ситуации,读改写
Это не атомарная операция.
Точно так же, как мы идем к телефонной будке, чтобы позвонить, всего есть три шага: найти телефон, набрать номер и поговорить. Из-за ограниченного количества времени, которое мы можем оставаться в телефонной будке, можно просто найти номер телефона и быть выгнанным, когда время истечет.
В одном потоке读改写
Не имеет значения, если это не атомарно, потому что операция всегда может быть выполнена, пока поток снова запланирован. Но могут возникнуть проблемы в многопоточных сценариях. Поскольку несколько потоков могут работать с одним и тем же общим ресурсом.
такие как классикаi++
операция, для простогоi++
В работе есть три шага:load
, add
,save
. Общая переменная будет обрабатываться несколькими потоками одновременно, поэтому операция чтения-изменения-записи не является атомарной.После операции значение общей переменной будет несовместимо с ожидаемым значением.Например: если i= 1, мы делаем это дваждыi++
Операция, мы ожидаем, что результат будет 3, но возможно, что результат будет 2.
проблема с заказом
Более того, мы знаем, что помимо введения табличек времени, из-за оптимизации процессора и перестановки директив, ЦП может также работать с трудным входным кодом, таким какload
->add
->save
может быть оптимизирован дляload
->save
->add
. Это проблема порядка.
Когда мы звоним по телефону, помимо того, что нас выгоняют на полпути, обычными шагами являются поиск телефона, набор номера и общение. Но телефонные будки должны быть оптимизированы, чтобы мы могли находить звонки, общаться и набирать номера. Это определенно не то, чего мы хотим.
еще только сейчасi++
Операция, в случае удовлетворения атомарности, если порядок не выполняется, полученный результат может быть не тем, что мы хотим.
Суммировать
Эта статья в основном представляет причины атомности и проблемы упорядочения в одновременном программировании. Для видимости, пожалуйста, обратитесь к "модель памяти". Решения этих трех задач приведены вмодель памяти" также вводится, больше можно обратиться к книгам, связанным с многопоточностью. Холлис опубликует дополнительные статьи для более глубокого анализа, так что следите за обновлениями.
использованная литература
Если кто-то спросит вас, что такое модель памяти Java, пришлите ему эту статью. Индикаторы производительности сервера (2) — анализ загрузки ЦП и устранение неполадок Разговор о параллелизме (5) — принципе реализации атомарной операции