Сокрушительный параллелизм (3): переключение контекста потока Java

Java задняя часть база данных JVM

0 Предисловие

В прошлую эру однопроцессорных систем одна задача могла одновременно выполнять только одну программу. Позже он развился до стадии многозадачности, на которой компьютер может выполнять несколько задач или процессов параллельно в один и тот же момент времени. Хотя и не совсем "тот самый момент времени", ноНесколько задач или процессов совместно используют ЦП и оставляют операционной системе выполнять текущее переключение ЦП между несколькими задачами, чтобы каждая задача имела возможность получить определенный временной интервал для запуска..

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

Многопоточность сложнее, чем многозадачность.Многопоточность выполняется параллельно в одной и той же программе, поэтому одновременные операции чтения и записи будут выполняться в одном и том же пространстве памяти.. Вероятно, это проблема, с которой никогда не сталкивались в однопоточных программах. Некоторые из этих ошибок не обязательно проявляются и на однопроцессорных машинах, потому что два потока никогда не выполняются по-настоящему параллельно. Однако появление более современных компьютеров с многоядерными процессорами означает, чтоРазличные потоки могут выполняться параллельно разными ядрами ЦП..

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

1 Многоядерный, многопроцессорный, гиперпотоковый, многопоточный

1.1 Почему многоядерный

Первое, о чем нужно поговорить, это многоядерность, многопроцессорность и гиперпоточность, Эти три понятия на самом деле являются концепциями проектирования архитектуры ЦП.Кроме процессорного ядра современный ЦП также включает в себя регистры, устройства хранения кэш-памяти L1L2, устройства арифметики с плавающей запятой, устройства целочисленной арифметики и другие вспомогательные вычислительные устройства, а также внутренние шины и т. д.. Многоядерный ЦП означает, что в ЦП есть несколько процессорных ядер.В чем преимущество этого? Например, теперь мы хотим запустить многопоточную программу на компьютере. Поскольку это поток в процессе, ему необходимо совместно использовать некоторые переменные хранения. Если компьютер представляет собой одноядерный однопоточный процессор,Это означает, что разные потоки этой программы должны часто обмениваться данными по внешней шине между процессорами, а также решать проблему несогласованности данных, вызванную разными кэшами между разными процессорами, поэтому в этом сценарии многоядерная архитектура с одним процессором может играют роль.Большое преимущество, связь осуществляется по внутренней шине, совместно использующей один и тот же кеш.

1.2 Зачем нам больше процессоров?

Преимущества многоядерности упоминались ранее, так зачем вам больше процессоров? Это на самом деле очень легко представить: если вы хотите запустить несколько программ (процессов), если есть только один ЦП, это означает, что переключение контекста процесса должно выполняться часто, потому что даже если один ЦП является многоядерным, он только несколько ядер процессора, другое оборудование используется совместно, поэтомуНесколько процессов вынуждены часто выполнять переключение контекста процесса, что очень дорого..

1.3 Почему гиперпоточность

Концепция гиперпоточности была предложена Intel.Проще говоря, это два реальных параллельных потока на одном процессоре., звучит маловероятно, потому что ЦП тайм-шеринг, на самом деле тут тоже тайм-шеринг,Поскольку ранее было упомянуто, что процессор имеет другие устройства помимо ядра процессора, и процесс выполнения фрагмента кода - это не только работа ядра процессора, если два потока A и B, A использует ядро ​​​​процессора, B использует кеш или другое устройство, два потока AB могут выполняться одновременно, но если оба AB обращаются к одному и тому же устройству, то другой поток может выполняться только после завершения выполнения предыдущего потока.. Принцип достижения этого параллелизма заключается в следующем.Добавлено координирующее вспомогательное ядро ​​к ЦП, по данным, предоставленным Intel, такое устройство увеличит площадь устройства на 5%, но повысит производительность на 15-30%.

1.4 Почему многопоточность

Этот вопрос может быть одним из наиболее часто задаваемых вопросов на собеседованиях.Переменные могут совместно использоваться несколькими потоками в процессе, а накладные расходы на связь между потоками также невелики, что позволяет лучше использовать производительность многоядерных процессоров.Многопоточные программы, работающие на многоядерных процессорах, часто работают быстрее, чем одиночные -поточные программы., иногда даже многопоточные программы на одноядерном процессоре будут иметь лучшую производительность,Поскольку, хотя многопоточность будет иметь накладные расходы на переключение контекста и создание и уничтожение потоков, однопоточные программы будут заблокированы вводом-выводом и не смогут в полной мере использовать ресурсы ЦП в сочетании с низкими накладными расходами контекста потока и большим количеством приложений пулов потоков, многопоточность во многих сценариях, имеют более высокую эффективность.

1.5 Потоки и процессы

Процесс — это единица управления операционной системы, а поток — единица управления процессом.; процесс содержит по крайней мере один поток выполнения. Будь то однопоточный или многопоточный,Каждый поток имеет счетчик программ (записывает следующую команду для выполнения), набор регистров (содержит рабочие переменные для текущего потока), стек (записывает историю выполнения, где каждый кадр содержит процедуру, которая была вызвана, но не возвращена).. Хотя поток является паразитным в процессе, он отличается от его процесса и может обрабатываться отдельно:Процесс — это основная единица системного распределения ресурсов, а поток — основная единица планирования ЦП..

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

  1. Шкала деления потока меньше, чем процесс, поток принадлежит процессу;
  2. Процесс — это базовая единица, занятая такими ресурсами, как ЦП и память., потоки не могут самостоятельно занимать эти ресурсы;
  3. Процессы независимы друг от друга и коммуникация затруднена, а область памяти разделяется между потоками, что удобно для общения;
  4. процесс выполняется,Включают:Фиксированный вход, порядок исполнения и выход,И этими процессами процесса будет управлять приложение;

进程&线程表项

2 контекстный переключатель

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

Многозадачные системы часто требуют одновременного выполнения нескольких задач. Количество заданий часто превышает количество ЦП в машине, но ЦП может выполнять только одну задачу за раз. Как сделать так, чтобы пользователи чувствовали, что эти задачи выполняются одновременно? Разработчик операционной системыУмело использует метод ротации временных интервалов, ЦП обслуживает каждую задачу в течение определенного времени, а затем сохраняет состояние текущей задачи и продолжает обслуживать следующую задачу после загрузки состояния следующей задачи..Состояние задачи сохраняется и перезагружается, этот процесс называется переключением контекста. Способ чередования временных интервалов позволяет выполнять несколько задач на одном ЦП.

任务的状态保存及再加载, 这段过程就叫做上下文切换

2.1 Основные понятия

Переключение контекста (иногда называемое переключением процесса или переключением задачи) относится к переключению ЦП с одного процесса или потока на другой.

  1. процесс(иногда называется задачей) — это экземпляр работающей программы.
  2. В системе Linuxнитьэто те, которые могут работать параллельно и совместно использовать одно и то же адресное пространство (область памяти) и другие ресурсы со своим родительским процессом (процессом, который их создал)легкий процесс.
  3. контекстОтносится к содержимому регистров ЦП и счетчика программ в определенный момент времени.
  4. регистрЭто небольшой объем быстрой памяти внутри ЦП (в отличие от относительно медленной основной памяти ОЗУ вне ЦП).Регистры улучшают скорость работы компьютерных программ, обеспечивая быстрый доступ к часто используемым значениям (обычно промежуточным значениям операций)..
  5. Счетчик программ представляет собой специальный регистр., который указывает, где в последовательности инструкций ЦП выполняет,Сохраненное значение — это позиция выполняемой инструкции или позиция следующей выполняемой инструкции., в зависимости от конкретной системы.

Переключение контекста можно рассматривать как ядро ​​(ядро операционной системы), выполняющее следующие действия на ЦП для процессов (включая потоки):

  1. приостановить процесс, хранить состояние (контекст) этого процесса в ЦП где-то в памяти;
  2. возобновить процесс, получить контекст следующего процесса в памяти и восстановить его в регистрах ЦП;
  3. перейти к месту, указанному счетчиком программ(т. е. перейти к строке кода, где процесс был прерван), чтобы возобновить процесс.

2.2 Тип переключателя

Переключение контекста имеет разное значение в разных случаях и указано в следующей таблице:

Вид переключения контекста описывать
переключение потоков Переключение между двумя потоками в одном процессе
переключатель процесса переключаться между двумя процессами
Переключатель режимов Переключение между пользовательским режимом и режимом ядра в заданном потоке
переключение адресного пространства Переключить виртуальную память на физическую память

2.3 Шаги переключения

Во время процесса переключения контекста ЦП прекратит обработку текущей программы и сохранит конкретное место, где выполняется текущая программа, чтобы она могла продолжать работать позже. С этой точки зрения переключение контекста немного похоже на то, когда мы читаем несколько книг одновременно, при переключении между книгами туда и обратно нам нужно помнить текущий номер страницы каждой книги.В программе информация о «номере страницы» при переключении контекста сохраняется в блоке управления процессом (PCB, блок управления процессом). Печатные платы также часто называют «коммутационными кадрами». Информация о «номере страницы» хранится в памяти ЦП до тех пор, пока она не будет использована снова..

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

  1. Сохраните состояние процесса A(регистры и данные операционной системы);
  2. Обновите информацию в печатной плате, внести соответствующие изменения в «рабочее состояние» процесса A;
  3. Поместите плату процесса A в очередь соответствующего состояния;
  4. Измените информацию о плате процесса B на «рабочее состояние» и выполните процесс B.;
  5. После выполнения B извлеките плату процесса A из очереди, восстановите контекст при переключении процесса A и продолжите выполнение A.;

Шаги для переключения потоков и переключения процессов также различаются. Переключение контекста процесса делится на два этапа:

  1. переключить каталог страниц, чтобы использовать новое адресное пространство;
  2. Переключить стек ядра и аппаратный контекст;

Для Linux самая большая разница между потоками и процессами — это адресное пространство.Для переключения потоков шаг 1 выполнять не нужно, а шаг 2 требуется как для переключения процессов, так и для переключения потоков.. Поэтому очевидно, что стоимость переключения процесса высока. Одно из основных различий между переключением контекста потока и переключением контекста процесса заключается в том, чтоПространство виртуальной памяти для переключения потоков остается прежним, но переключение процессов отличается. Обработка обоих переключателей контекстаделается через ядро ​​операционной системы. Этот процесс переключения ядра сопровождаетсяНаиболее значительным снижением производительности является переключение содержимого регистров..

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

Чтобы управлять внутренними процессами системы, операционная система создает запись в таблице процессов для каждого процесса:

进程表项

2.4 Переключить вид

В системе Linux вы можете использовать команду vmstat для просмотра количества переключений контекста.Ниже приведен пример использования vmstat для просмотра количества переключений контекста:

上线文切换查看

vmstat 1 относится к статистике один раз в секунду,Столбец cs относится к количеству переключений контекста., В нормальных условиях переключение контекста бездействующей системы составляет около 1500 в секунду.

3 Причины перехода

Существует три основные причины переключения контекста потока:

  1. обработка прерываний: Во время обработки прерывания другая программа «прерывает» текущую программу. Когда ЦП получает запрос на прерывание, он выполняет переключение контекста между выполняющейся программой и программой, инициировавшей запрос на прерывание.Прерывания делятся на аппаратные прерывания и программные прерывания., программные прерывания включают в себя приостановку потоков из-за блокировки ввода-вывода, отсутствия захвата ресурсов или пользовательского кода.
  2. многозадачность: В многозадачности ЦП переключается между различными программами, каждая программа имеет соответствующий временной интервал обработки, и ЦП выполняет переключение контекста в интервале двух временных интервалов.
  3. Переключатель пользовательского режима: Для некоторых операционных систем переключение контекста также выполняется при переключении пользовательского режима, хотя это и не требуется.

для нас частоИспользуется вытесняющая ОСВ общем, причины переключения контекста потока, вероятно, следующие:

  1. После того, как квант времени выполнения текущей задачи израсходован, системный ЦП обычно планирует следующую задачу;
  2. Текущая задача выполнения встречает блокировку ввода-вывода, планировщик приостанавливает эту задачу и переходит к следующей задаче;
  3. Несколько задач вытесняют ресурсы блокировки, текущая задача не захватывает ресурсы блокировки, она приостанавливается планировщиком и переходит к следующей задаче;
  4. Пользовательский код приостанавливает текущую задачу, освобождая процессорное время;
  5. аппаратное прерывание;

4 Коммутационные потери

Переключение контекста принесетпрямое и косвенноеДва фактора влияют на потребление производительности программы.

  1. прямое потребление: это означает, что необходимо сохранить и загрузить регистры ЦП, выполнить код системного планировщика, перезагрузить экземпляр TLB и очистить конвейер ЦП;
  2. косвенное потребление: относится к совместному использованию данных между многоядерными кэшами, влияние косвенного потребления на программу зависит от размера данных операции рабочей области потока;

5 Уменьшить переключение

Поскольку переключение контекста вызывает дополнительные накладные расходы, уменьшение количества переключений контекста может повысить эффективность многопоточных программ. А вот переключение контекста делится на два типа:

  1. переключение контекста yield: Относится к потоку выполнения, активно освобождающему ЦП,Пропорционально серьезности конфликта блокировок, чего можно избежать, уменьшив количество конфликтов при блокировках;
  2. Упреждающее переключение контекста: относится к потокуВынужден отказаться от ЦП, потому что выделенный временной интервал исчерпан или вытеснен другим потоком с более высоким приоритетом., как правило, из-за того, что количество потоков превышает количество доступных ядер ЦП, чего можно избежать, отрегулировав количество потоков и соответствующим образом уменьшив количество потоков.

Итак, способ уменьшить переключение контекстаПараллельное программирование без блокировок, алгоритм CAS, использование минимальных потоков и использование сопрограмм.

  1. параллелизм без блокировки: Когда многопоточность конкурирует, это вызовет переключение контекста, поэтому при многопоточной обработке данных вы можете использовать некоторые методы, чтобы избежать использования блокировок, например, сегментация идентификатора данных в соответствии с хэш-модулем, и разные потоки обрабатывают разные сегменты. данных;
  2. CAS-алгоритм: пакет Java Atomic использует алгоритм CAS для обновления данных без блокировки;
  3. несколько тем: Избегайте создания ненужных потоков, например, задач мало, но создается много потоков для обработки, из-за чего большое количество потоков будет находиться в состоянии ожидания;
  4. Используйте сопрограммы: реализовать планирование многозадачности в одном потоке и поддерживать переключение между несколькими задачами в одном потоке;

6 Количество потоков

Разумно установите количество потоков, ключевыми моментами являются:1. Минимизация затрат на переключение потоков и управление 2. Максимальное использование ЦП;

Для 1 требуется, чтобы количество потоков было как можно меньше, что может уменьшить накладные расходы на переключение и управление потоками;

Для 2 требуется как можно больше потоков, чтобы обеспечить максимальное использование ресурсов ЦП;

такДля задач, которые занимают короткое время, требуется иметь как можно меньше потоков., если потоков слишком много, время переключения и управления потоками может быть больше, чем время выполнения задачи, тогда эффективность низкая;

Для задач, которые занимают много времени, их следует разделить на задачи ЦП или задачи ввода-вывода.. Если это задача типа ЦП, количество потоков не должно быть слишком большим, но если это задача типа ввода-вывода, лучше иметь больше потоков, которые могут полностью использовать ЦП.

Высокий параллелизм, низкое потребление времени: рекомендуется иметь меньше потоков, пока выполняется параллелизм,Поскольку имеется много переключений контекста, а высокий уровень параллелизма означает, что ЦП находится в состоянии занятости, добавление большего количества потоков не позволит потокам получать кванты времени выполнения, но увеличит накладные расходы на переключение потоков.;Например, если параллелизм равен 100, пул потоков может быть установлен равным 10;

Низкий уровень параллелизма, большое потребление времени: рекомендуется использовать многопоточность, чтобы гарантировать, что есть свободные потоки для принятия новых задач; например, если параллелизм равен 10, пул потоков может быть установлен на 20;

Высокий параллелизм и большие затраты времени: 1. Проанализировать тип задачи, 2. Увеличить очередь, 3. Увеличить количество потоков.