Рубрики
Без рубрики

Многопоточность и параллельное программирование

Многопоточность – это широко распространенная модель программирования и выполнения, которая позволяет существовать нескольким потокам… Помечено как программирование, многопоточность, java, производительность.

Многопоточность – это широко распространенная модель программирования и выполнения, которая позволяет нескольким потокам существовать в контексте одного процесса. Каждый из этих потоков может выполняться параллельно, и эти потоки имеют одинаковое адресное пространство. Хорошо, давайте начнем с самого начала.

Что такое поток?

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

Я бы сказал, что Специалист по Информатике увидел бы Поток точно так же , как химик увидел бы An Атом .

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

Что такое Процесс?

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

В отличие от потоков, процессы не совместно используют ресурсы друг с другом. процесс – это единица ресурсов, в то время как поток – это единица планирования и выполнения.

Пул потоков

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

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

Описательные Программные Представления Потоков

Мы бы взглянули на потоки, реализованные из двух классов в Java, Исполнители и Запускаемые .

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

Класс Executors предоставляет удобные фабричные методы для создания различных видов услуг исполнителя. В приведенном ниже примере мы используем исполнителя с пулом потоков размером один.

Результат выглядит аналогично приведенному выше образцу, но при запуске кода вы заметите важное отличие: процесс java никогда не останавливается! Исполнители должны быть остановлены явно – в противном случае они продолжают прослушивать новые задачи.

ExecutorService предоставляет два метода для этой цели: shutdown() ожидает завершения текущих задач, в то время как завершите работу сейчас()

  • Работоспособный A Runnable – это функциональный интерфейс, определяющий единственный метод void без аргументов run() . Перед запуском нового потока вы должны указать код, который будет выполняться этим потоком, часто называемый задачей, и это делается путем реализации Runnable . Обратите внимание, что у вас может быть как можно больше задач.

В приведенном выше примере мы используем лямбда-выражения Java 8 для вывода имени текущего потока на консоль. Сначала мы выполняем runnable непосредственно в основном потоке, прежде чем запускать новый поток. Смотрите примеры результатов ниже.

Hello main
Hello Thread-0
Done!

Или это:

Hello main
Done!
Hello Thread-0

У нас есть два возможных выхода, потому что из-за параллельного выполнения мы не можем предсказать, будет ли runnable вызываться до или после печати Done . Порядок не является детерминированным, что делает параллельное программирование сложной задачей в более крупных приложениях. Хотя потоки также могут быть переведены в спящий режим на определенное время.

Многопоточность в глубину

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

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

Существует несколько языков программирования, которые предоставляют место для многопоточности , и большинство языков являются объектно-ориентированными языками программирования (ООП). Такие языки, как Java , C , C++ и даже .NET рамки. Некоторые другие интерпретируемые языки также сделали сокращение, например Ruby MRI для Ruby и Python для Python . Если бы вы ждали, чтобы увидеть Javascript , ну, вы этого не сделаете, потому что JavaScript не поддерживает многопоточность, и это потому, что интерпретатор JavaScript в браузере представляет собой один поток.

Сильно многопоточные приложения

Почти все хорошо построенные приложения поддерживают многопоточность. Давайте посмотрим на браузеры. Большинство браузеров являются многопоточными из firefox в Сафари в Chrome и многие другие. Но сегодня мы бы больше поговорили о Хром .

Google Chrome Chrome имеет многопроцессорную архитектуру, и каждый процесс в значительной степени многопоточен. Основная цель состоит в том, чтобы основной поток (поток “UI” в процессе браузера) и поток ввода-вывода (поток каждого процесса для обработки IPC) оставались отзывчивыми. Это означает передачу любых блокирующих операций ввода-вывода или других дорогостоящих операций другим потокам.

В Chrome каждая открываемая вами вкладка получает свой собственный процесс обработки содержимого. Пять вкладок, 5 процессов, сто вкладок, 100 процессов. Такой подход максимизирует производительность, но вы платите значительный штраф за потребление памяти и время автономной работы. Вы когда-нибудь задумывались, почему потребление процессора Chrome в вашем диспетчере задач всегда велико? Ну, вот и ты.

Каждый процесс chrome имеет,

  • A основной поток Этот поток обновляет пользовательский интерфейс и запускает большую часть Blink.
  • Поток ввода-вывода Этот поток обрабатывает IPCS и сетевые запросы
  • Еще несколько потоков специального назначения .
  • Пул потоков общего назначения .

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

Потоки Против Процессов

Потоки отличаются от обычного многозадачного процесса во многих отношениях:

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

Параллелизм

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

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

Вывод

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

Оригинал: “https://dev.to/kwereutosu/multi-threading-and-parallel-programming-1l9m”