Многозадачность. Потоки выполнения (Threads). Основные понятия
Содержание
- 1. Многозадачность. Виды многозадачности. Многозадачность на основе процессов и потоков
- 2. Многозадачность на основе процессов. Общие понятия
- 3. Многозадачность на основе потоков. Понятие потока выполнения
- 4. Общие сведения о потоках выполнения. Многопоточность
- 5. Виды состояний потоков выполнения
- 6. Приоритеты потоков. Основные понятия. Случаи переключения контекста
- 7. Синхронизация потоков. Монитор
- Связанные темы
Поиск на других ресурсах:
1. Многозадачность. Виды многозадачности. Многозадачность на основе процессов и потоков
В современных операционных системах реализован механизм многозадачности. С помощью этого механизма, в операционной системе может одновременно выполняться несколько программ (задач). Например, можно набирать текст программы на языке Java, которая использует потоки и одновременно слушать музыку Бетховена.
Различают два вида многозадачности:
- многозадачность на основе процессов — это средство параллельного выполнения двух или более программ на компьютере;
- многозадачность на основе потоков — это средство распараллеливания выполнения кода внутри одной отдельной программы (процесса).
Основное преимущество использования многозадачности — уменьшение времени ожидания выполнения нескольких задач. Уменьшение времени ожидания в современных интерактивных средах позволяет максимально использовать доступные вычислительные мощности в системе.
⇑
2. Многозадачность на основе процессов. Общие понятия
При использовании многозадачности на основе процессов, важным понятием является процесс. Процесс — это отдельная выполняющаяся программа. Значит, многозадачность на основе процессов — это средство параллельного выполнения двух или более программ на компьютере. Параллельное выполнение обеспечивается процессором (несколькими процессорами) таким образом, что каждой параллельно-выполняемой программе выделяется определенный квант времени (ресурса) процессора. В этом случае выполняемая программа считается наименьшей единицей кода.
Например, разработка программы с использованием компилятора языка Java является отдельным процессом, на который нет влияния из этой программы;
Процессы есть большими задачами и требуют больше системных ресурсов. Каждому процессу выделяется свое отдельное адресное пространство. Связь между процессами ограничена и ресурсоемка. Переключение контекста (изменение активности) между процессами также требует «больших усилий» от процессора и операционной системы.
⇑
3. Многозадачность на основе потоков. Понятие потока выполнения
Многозадачность на основе потоков еще называют многопоточность. При использовании многопоточности наименьшей единицей диспетчерского кода является поток выполнения. Одна программа может выполнять несколько потоков (задач) одновременно. Таким образом, многозадачность на основе потоков — это средство разбиения кода на отдельные параллельно-выполняемые части.
Например, в текстовом редакторе можно распечатывать документ одновременно с набором текста в другом документе.
Потоки выполнения внутри процессов по сравнению с процессами требуют гораздо меньше системных ресурсов. Потоки совместно используют единое адресное пространство одного процесса, в котором они распараллелены. Связь и переключение контекста (изменение активности) между процессами сравнительно слабо нагружает процессор и операционную систему.
⇑
4. Общие сведения о потоках выполнения. Многопоточность
Язык программирования Java содержит встроенные средства для реализации многопоточного программирования. С помощью этих средств существует возможность управлять так называемыми потоками выполнения.
Выполнение каждой программы может быть разбито на несколько потоков. Каждый поток выполнения представляет собой отдельный путь выполнения кода. Каждый поток выполнения создается в главном потоке и называется дочерним потоком. После создания нескольких потоков в программе, главный поток и дочерние потоки:
- могут длиться разный период времени;
- могут завершаться в разные моменты времени. Здесь возможна ситуация, когда главный поток завершается до завершения выполнения дочернего потока.
Для работы с потоками выполнения в языке Java реализованы обширные библиотеки классов.
⇑
5. Виды состояний потоков выполнения
Потоки выполнения могут быть в нескольких состояниях:
- поток выполняется;
- поток готов к выполнению;
- поток приостановлен;
- поток начинает выполняться после его остановки;
- поток заблокирован. Это случай, когда поток ожидает получения некоторого ресурса;
- поток прерван. Прерванный поток не может быть восстановлен.
⇑
6. Приоритеты потоков. Основные понятия. Случаи переключения контекста
При использовании потоков выполнения возникает понятие приоритета. Приоритет — это целочисленное значение, которое определяет поведение данного потока по отношению к другим потокам. Для нескольких потоков числовое значение приоритета задает относительный приоритет одного потока над другими. Если выполняется только один поток, то числовая величина приоритета не имеет значения. Приоритет потока учитывается в случаях, когда одновременно выполняются несколько потоков и происходит так называемое переключение контекста — переход от одного потока к другому.
Переход от одного потока к другому выполняется в следующих случаях:
- случай, когда поток с большим приоритетом вытесняет выполнение потока с меньшим приоритетом независимо от того, какие операции выполняет низкоприоритетный поток. Иными словами, поток с большим приоритетом получает право на выполнение при первой необходимости. Этот случай демонстрирует так называемую вытесняющую многозадачность;
- поток передает управление другому потоку добровольно. В этом случае управление передается другому потоку, который имеет самый высокий приоритет среди потоков, выполняемых в данный момент. Если добровольно нужно передать управление потокам с одинаковым приоритетом, то эти потоки по кругу разделяют время центрального процессора.
⇑
7. Синхронизация потоков. Монитор
В многозадачных средах потоки (программы) выполняются асинхронно. Асинхронность определяется хаотическим использованием имеющихся ресурсов исполняемым потоком.
Для двух (или более) параллельно выполняемых потоков могут возникать случаи, когда между ними нужно организовать синхронизацию. Одним из примеров необходимости применения синхронизации, является избежание конфликтов между потоками за совместно используемые ресурсы. Синхронизация — это механизм взаимодействия между двумя (или более) потоками с соблюдением определенных правил, чтобы избежать коллизий, одновременного или несогласованного использования общих ресурсов и тому подобное.
Для синхронизации в языке Java введено использование так называемых мониторов. Монитор — это технология синхронизации потоков, которая предусматривает хранение только одного потока выполнения, которому предоставляются привилегии доступа к ресурсу. Значит, монитор обеспечивает защиту ресурсов от их одновременного использования более чем одним потоком выполнения.
При использовании технологии монитора возникает такое понятие, как «вход потока в монитор«. Если нескольким потокам одновременно нужно подойти к общему ресурсу, то доступ имеет только тот поток, который вошел в монитор. Все остальные потоки ожидают до тех пор, пока монитор не освободится (поток, вошедший в монитор, не оставит его).
На рисунке 1 приведен пример работы монитора для 4-х потоков. Вход в монитор осуществляет поток Thread3. Этот поток имеет доступ к общему ресурсу. Все остальные потоки ожидают в очереди до тех пор, пока поток Thread3 не покинет монитор.
Рисунок 1. Доступ к общему ресурсу с использованием монитора
⇑
Связанные темы
- Средства Java для работы с потоками выполнения. Класс Thread. Интерфейс Runnable. Главный поток выполнения. Создание дочернего потока
- Методы класса Thread: getName(), run(), start(), sleep(). Примеры
- Методы класса Thread: join(), isAlive(), getPriority(), setPriority(). Примеры
- Примеры решения задач на потоки выполнения (Threads). Работа с файлами в потоках. Сортировка в потоках
⇑