Учебники

Параллелизм в Python — Темы

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

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

Состояния потока

Чтобы глубже понять функциональность потоков, нам нужно узнать о жизненном цикле потоков или различных состояниях потоков. Как правило, поток может существовать в пяти различных состояниях. Различные состояния показаны ниже —

Новый поток

Новый поток начинает свой жизненный цикл в новом состоянии. Однако на данном этапе он еще не начался и ему не было выделено никаких ресурсов. Можно сказать, что это просто экземпляр объекта.

Runnable

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

Бег

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

Невыполняющийся / ожидание

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

мертв

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

Следующая диаграмма показывает полный жизненный цикл потока —

мертв

Типы ниток

В этом разделе мы увидим различные типы потоков. Типы описаны ниже —

Потоки уровня пользователя

Это управляемые пользователями потоки.

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

Примеры потоков уровня пользователя:

  • Потоки Java
  • POSIX темы

мертв

Преимущества потоков уровня пользователя

Ниже приведены различные преимущества потоков уровня пользователя —

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

Недостатки пользовательских тем

Ниже приведены различные недостатки потоков уровня пользователя —

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

Потоки уровня ядра

Управляемые потоки операционной системы действуют на ядро, которое является ядром операционной системы.

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

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

мертв

Преимущества потоков на уровне ядра

Ниже приведены различные преимущества потоков уровня ядра —

  • Ядро может одновременно планировать несколько потоков из одного процесса на несколько процессов.

  • Если один поток в процессе заблокирован, ядро ​​может запланировать другой поток того же процесса.

  • Сами подпрограммы ядра могут быть многопоточными.

Ядро может одновременно планировать несколько потоков из одного процесса на несколько процессов.

Если один поток в процессе заблокирован, ядро ​​может запланировать другой поток того же процесса.

Сами подпрограммы ядра могут быть многопоточными.

Недостатки потоков на уровне ядра

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

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

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

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

Блок управления резьбой — TCB

Блок управления потоком (TCB) может быть определен как структура данных в ядре операционной системы, которая в основном содержит информацию о потоке. Информация о потоках, хранящаяся в TCB, выделяет некоторую важную информацию о каждом процессе.

Рассмотрим следующие моменты, связанные с темами, содержащимися в TCB —

  • Идентификация потока — это уникальный идентификатор потока (tid), назначенный каждому новому потоку.

  • Состояние потока — содержит информацию, относящуюся к состоянию (работает, работает, не работает, не работает) потока.

  • Счетчик программ (ПК) — указывает на текущую программную инструкцию потока.

  • Набор регистров — содержит значения регистров потока, назначенные им для вычислений.

  • Указатель стека — указывает на стек потока в процессе. Он содержит локальные переменные в области видимости потока.

  • Указатель на печатную плату — содержит указатель на процесс, который создал этот поток.

Идентификация потока — это уникальный идентификатор потока (tid), назначенный каждому новому потоку.

Состояние потока — содержит информацию, относящуюся к состоянию (работает, работает, не работает, не работает) потока.

Счетчик программ (ПК) — указывает на текущую программную инструкцию потока.

Набор регистров — содержит значения регистров потока, назначенные им для вычислений.

Указатель стека — указывает на стек потока в процессе. Он содержит локальные переменные в области видимости потока.

Указатель на печатную плату — содержит указатель на процесс, который создал этот поток.

печатная плата

Связь между процессом и нитью

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

В следующей таблице показано сравнение между процессом и потоком —

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

Концепция многопоточности

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

Понятие многопоточности можно понять с помощью следующего примера.

пример

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

Следующая диаграмма помогает нам понять, как в памяти существует несколько потоков:

Многопоточность

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

Плюсы многопоточности

Давайте теперь посмотрим на несколько преимуществ многопоточности. Преимущества заключаются в следующем —

  • Скорость обмена данными — многопоточность повышает скорость вычислений, поскольку каждое ядро ​​или процессор обрабатывает отдельные потоки одновременно.

  • Программа остается отзывчивой — она ​​позволяет программе оставаться отзывчивой, поскольку один поток ожидает ввода, а другой одновременно запускает графический интерфейс.

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

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

  • Совместное использование данных. Нет необходимости в дополнительном пространстве для каждого потока, поскольку потоки в программе могут совместно использовать одни и те же данные.

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

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

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

Использование ресурсов — запуск нескольких потоков в каждой программе улучшает использование процессора, а время простоя процессора уменьшается.

Совместное использование данных. Нет необходимости в дополнительном пространстве для каждого потока, поскольку потоки в программе могут совместно использовать одни и те же данные.

Минусы многопоточности

Давайте теперь рассмотрим несколько недостатков многопоточности. Недостатки заключаются в следующем —

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

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

Увеличение сложности — многопоточность может увеличить сложность программы, и отладка становится сложной.

Привести в состояние тупика — многопоточность может привести к потенциальному риску достижения состояния тупика.

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