Потоки (threads) и многопоточное выполнение программ (multi-threading)
Потоки в Windows 2000
Как уже отмечалось, в системе Windows реализована модель многопоточности "один / один". Каждый поток содержит:
- идентификатор потока (thread id);
- набор регистров
- отдельные стеки для пользовательских и системных процедур;
- область памяти для локальных данных потока (thread-local storage – TLS).
Потоки в Linux
В системе Linux потоки называются tasks (задачами),а не threads. Поток создается системным вызовом clone(). Данный системный вызов позволяет дочерней задаче использовать общее адресное пространство с родительской задачей (процессом).
Потоки в Java
Как уже отмечалось, Java – первая платформа для разработки программ, в которой многопоточность поддержана на уровне языка и базовых библиотек. Потоки в Java могут быть созданы следующими способами:
- Как расширения класса Thread
- Как классы, реализующие интерфейс Runnable, который содержит единственный метод run – исполняемое тело потока.
Потоки в Java управляются JVM. Возможно создание групп потоков и иерархии таких групп.
Возможные состояния потоков в Java изображены на рис. 10.7. Подобно потокам в ОС, поток в Java создается и находится в состоянии новый, затем – выполняемый ; при вызове методов типа wait, sleep и др. поток переходит в состояние ожидания; при завершении метода run поток завершается.
Ключевые термины
Mac C-threads – пользовательские потоки в системе MacOS.
POSIX Pthreads – потоки, специфицированные стандартом POSIX и используемые в POSIX-приложениях.
Solaris threads – пользовательские потоки в ОС Solaris.
Thread – класс, представляющий поток, в языке Java.
Атрибуты потока – совокупность атрибутов POSIX-потока, описываемая типом pthread_attr_t.
Группа потоков (thread group) – совокупность потоков, имеющей свое собственное имя, над потоками которой определены групповые операции.
Дескриптор потока – ссылка на POSIX-поток, описываемая типом pthread_t.
Задача (task) – название потока в Linux.
Исключение (exception) – высокоуровневый механизм обработки ошибочных ситуаций в объектно-ориентированных языках и операционных системах.
Локальные данные потока (thread-local storage - TLS) – данные, принадлежащие только определенному потоку и используемые только этим потоком.
Модель многопоточности – способ отображения пользовательских потоков в потоки ядра.
Модель много / много - модель многопоточности,при которой различные пользовательские потоки могут быть отображены в различные потоки ядра.
Модель много / один - модель многопоточности, при которой несколько пользовательских потоков могут быть отображены в один поток ядра.
Модель один / один – модель многопоточности, при которой каждый пользовательский поток отображается в один определенный поток ядра.
Мьютекс (mutex) – аналог семафоров, обеспечивающий взаимное исключение, используемый в операционных системах.
Облегченный процесс (lightweight process) – процесс, работающий в общем пространстве виртуальной памяти с процессом-родителем.
Поток (thread) – запускаемый из какого-либо процесса более эффективный вариант параллельного процесса, выполняемый в том же адресном пространстве, что и процесс-родитель.
Поток пользовательского уровня (user thread) - высокоуровневый поток, операции над которым включены в интерфейс пользователя ОС.
Поток ядра (kernel thread) - низкоуровневый системный поток, поддержанный и использующийся на уровне ядра операционной системы; используется для реализации потоков пользовательского уровня.
Пул потоков (ThreadPool) – эффективный механизм структурирования потоков в группы в .NET.
Сигналы (в UNIX) – низкоуровневый механизм обработки ошибочных ситуаций.
"Тяжеловесный" (heavyweight) процесс – название классического процесса, работающего в собственном адресном пространстве, в противоположность облегченному процессу.
Условная переменная (conditional variable) - синхронизирующий объект, используемый в операционных системах, с операциями wait и signal.
Краткие итоги
Многопоточность (multi-threading) – современное направление программирования, особенно актуальное в связи с широким распространением параллельных компьютерных архитектур. Поток – особый вид процесса, выполняемый в общем адресном пространстве с процессом-родителем. Поток характеризуется своим стеком, потоком управления и значениями регистров. Облегченный процесс (lightweight process) – механизм, с помощью которого реализуются потоки в ОС.
Впервые понятие процесса, близкое современной концепции потока, было реализовано в системе "Эльбрус" в конце 1970-х гг. Многопоточность появилась в UNIX, затем – в Solaris и Windows NT. В различных ОС архитектуры библиотек поддержки многопоточности различаются. В Java-технологии, а вслед за ней – в .NET, впервые многопоточность была реализована на уровне языка и базовых библиотек.
Архитектура потоков – многоуровневая: потоки пользовательского уровня реализуются с помощью системных потоков (потоков ядра). Существуют различные модели многопоточности (способы отображения пользовательских потоков в системные) – один-один, один-много, много-один.
Многопоточность ставит ряд интересных проблем: семантика системных вызовов fork и exec; прекращение потоков; обработка сигналов; структуризация потоков в группы; поддержка локальных данных потока (TLS); синхронизация потоков; тупики (взаимная блокировка потоков) и их предотвращение.
POSIX threads (Pthreads) - стандартизация API для поддержки многопоточности для операционных систем типа UNIX. Поток характеризуется своим дескриптором и атрибутами. Для синхронизации потоков используются мьютексы и условные переменные.
Потоки в ОС Solaris отличаются тем, что явно присутствует понятие облегченного процесса, наряду с понятиями пользовательского и системного потоков. Каждый традиционный процесс хранит список созданных в нем облегченных процессов. Используется модель многопоточности "много-много".
В Windows 2000 используется модель многопоточности "один-один". Каждый поток содержит свой номер, набор регистров, отдельные стеки для пользовательских и системных процедур, локальную память потока (TLS).
В Linux потоки называются задачами (tasks) и создаются системным вызовом clone.
Потоки в Java поддержаны на уровне языка и базовых библиотек. Представляются объектами класса Thread и его подклассов. Управляются виртуальной машиной Java. Возможно создание групп потоков. Состояния потоков аналогичны используемым в ОС.
Набор для практики
Вопросы
- Что такое поток?
- Чем отличаются однопоточные и многопоточные процессы?
- В чем преимущества многопоточности?
- В какой системе впервые было реализовано понятие процесса, близкое современному понятию потока?
- В какой ОС многопоточность впервые появилась "официально"?
- На какой платформе разработки программ многопоточность впервые была реализована на уровне языка и базовых библиотек?
- Что такое пользовательские потоки?
- Что такое системные потоки и чем они отличаются от пользовательских?
- Какие существуют модели многопоточности?
- В чем суть модели много/много?
- В чем суть модели много/один?
- В чем суть модели один/один?
- Каковы проблемы многопоточности?
- Что такое сигнал и как он обрабатывается в многопоточной программе?
- Что такое исключение и как оно обрабатывается в многопоточной программе?
- Что такое группа потоков?
- Что такое пул потоков?
- Что такое локальная память (данные) потока?
- Что такое Pthread?
- Какими типами данных описывается поток в POSIX?
- Какие средства синхронизации потоков используются в POSIX?
- В чем отличие потоков в Solaris от потоков в других системах?
- Что такое облегченный процесс?
- В чем отличие потоков в Windows 2000?
- В чем отличие потоков в Linux?
- Как представляются потоки в Java, каковы операции над ними и состояния потоков?
Упражнения
- Проанализируйте и опишите преимущества, недостатки и проблемы многопоточности.
- Реализуйте модель многопоточности один/один.
- Реализуйте модель многопоточности много/один.
- Реализуйте модель многопоточности много/много.
- Напишите на Си программу параллельного умножения матриц с использованием POSIX-потоков.
- Напишите на Си программу параллельного умножения матриц с использованием потоков Solaris.
- Напишите на Java программу параллельного умножения матриц с использованием Java-потоков.
Темы для курсовых работ, рефератов, эссе
- История концепции потока и многопоточности в операционных системах и языках программирования (реферат).
- Обзор многопоточности в UNIX, Linux, Solaris (реферат).
- Обзор многопоточности в POSIX (реферат).
- Обзор многопоточности в MacOS (реферат).
- Обзор многопоточности в Java (реферат).
- Обзор многопоточности в .NET (реферат).
- Обзор многопоточности в Windows 2000 / XP / 2003 / 2008 / 7.
- Разработка на Си программы параллельного умножения матриц с использованием POSIX-потоков.
- Разработка на Си программы параллельного умножения матриц с использованием потоков Solaris.
- Разработка на Java программы параллельного умножения матриц с использованием Java-потоков.