Подтвердить что ты не робот

Упреждающие потоки Vs Non Preemptive threads

Может кто-нибудь объяснить, пожалуйста, разницу между моделью вытесняющих потоков и моделью не вытесняющих потоков?

Согласно моему пониманию:

  • Модель без вытеснения потоков: после запуска потока его нельзя остановить или передать управление другим потокам, пока поток не завершит свою задачу.
  • Модель вытесняющих потоков: среде выполнения разрешено входить и передавать управление из одного потока в другой в любое время. Потоки с более высоким приоритетом имеют приоритет перед потоками с более низким приоритетом.

Может кто-нибудь, пожалуйста:

  1. Объясните, если понимание правильно.
  2. Объясните достоинства и недостатки обеих моделей.
  3. Пример того, когда использовать то, что будет действительно полезно.
  4. Если я создаю поток в Linux (system v или Pthread) без упоминания каких-либо опций (есть ли??) по умолчанию, то используемой моделью потоков является модель вытесняющих потоков?
4b9b3361

Ответ 1

  • Нет, ваше понимание не совсем правильно. Неприемлемые (так называемые кооперативные) потоки, как правило, вручную дают управление, чтобы другие потоки выполнялись до их завершения (хотя для этого потока требуется вызов yield() (или что-то еще)).
  • Предотвращение нарезания резьбы проще. Кооперативные потоки имеют меньше накладных расходов.
  • Обычно используется превентивный. Если вы обнаружите, что в вашем проекте много накладных расходов на потоки, совлокальные потоки были бы возможной оптимизацией. Во многих (наиболее?) Ситуациях это будет довольно большой инвестицией с минимальным выигрышем, хотя.
  • Да, по умолчанию вы получите превентивный поток, хотя, если вы посмотрите на пакет CThreads, он поддерживает совместную потоковую обработку. Немногие люди (сейчас) хотят совлокальных потоков, которые я не уверен, что они были обновлены за последнее десятилетие, хотя...

Ответ 2

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

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

Большие преимущества совлокальных потоков - это большая эффективность (по крайней мере, на одноядерных машинах) и более простая обработка concurrency: она существует только тогда, когда вы получаете управление, поэтому блокировка не требуется.

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

Вы можете смешать их, конечно. Единственный превентивный поток может содержать много взаимодействующих потоков внутри него.

Ответ 3

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

невытесняющее:

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

  2. Проще в обращении, поскольку его можно обрабатывать на одноядерном процессоре

Преимущественное:

Преимущество:

  1. В этой модели у нас есть приоритет, который помогает нам лучше контролировать запущенный процесс

  2. Лучший параллелизм - это отскок

  3. Обработка системных вызовов без блокировки всей системы

Неудобство:

  1. Требуются более сложные алгоритмы для синхронизации, а обработка критических разделов неизбежна.

  2. Накладные расходы, которые идут с этим

Ответ 4

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

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

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

Однако, как только поток с более высоким приоритетом просыпается или разблокируется, он прерывает поток с более низким приоритетом и запускается до тех пор, пока не завершится, не заблокируется снова или не будет вытеснен потоком с еще более высоким приоритетом.

Спецификация языка Java иногда позволяет виртуальным машинам запускать потоки с более низким приоритетом вместо запускаемого потока с более высоким приоритетом, но на практике это необычно.

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

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

Что касается преимуществ, как Дероберт, так и Бедия подчеркнули их довольно четко.