Спонсор: Microsoft
Санкт-Петербургский государственный университет
Опубликован: 13.11.2010 | Доступ: свободный | Студентов: 6726 / 1527 | Оценка: 4.64 / 4.23 | Длительность: 45:08:00
ISBN: 978-5-9963-0495-0
Лекция 10:

Потоки (threads) и многопоточное выполнение программ (multi-threading)

< Лекция 9 || Лекция 10: 1234 || Лекция 11 >

Потоки в Windows 2000

Как уже отмечалось, в системе Windows реализована модель многопоточности "один / один". Каждый поток содержит:

  • идентификатор потока (thread id);
  • набор регистров
  • отдельные стеки для пользовательских и системных процедур;
  • область памяти для локальных данных потока (thread-local storageTLS).

Потоки в Linux

В системе Linux потоки называются tasks (задачами),а не threads. Поток создается системным вызовом clone(). Данный системный вызов позволяет дочерней задаче использовать общее адресное пространство с родительской задачей (процессом).

Потоки в Java

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

  • Как расширения класса Thread
  • Как классы, реализующие интерфейс Runnable, который содержит единственный метод run – исполняемое тело потока.

Потоки в Java управляются JVM. Возможно создание групп потоков и иерархии таких групп.

Возможные состояния потоков в Java изображены на рис. 10.7. Подобно потокам в ОС, поток в Java создается и находится в состоянии новый, затем – выполняемый ; при вызове методов типа wait, sleep и др. поток переходит в состояние ожидания; при завершении метода run поток завершается.

Состояния потоков в Java.

увеличить изображение
Рис. 10.7. Состояния потоков в Java.

Ключевые термины

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. Возможно создание групп потоков. Состояния потоков аналогичны используемым в ОС.

Набор для практики

Вопросы

  1. Что такое поток?
  2. Чем отличаются однопоточные и многопоточные процессы?
  3. В чем преимущества многопоточности?
  4. В какой системе впервые было реализовано понятие процесса, близкое современному понятию потока?
  5. В какой ОС многопоточность впервые появилась "официально"?
  6. На какой платформе разработки программ многопоточность впервые была реализована на уровне языка и базовых библиотек?
  7. Что такое пользовательские потоки?
  8. Что такое системные потоки и чем они отличаются от пользовательских?
  9. Какие существуют модели многопоточности?
  10. В чем суть модели много/много?
  11. В чем суть модели много/один?
  12. В чем суть модели один/один?
  13. Каковы проблемы многопоточности?
  14. Что такое сигнал и как он обрабатывается в многопоточной программе?
  15. Что такое исключение и как оно обрабатывается в многопоточной программе?
  16. Что такое группа потоков?
  17. Что такое пул потоков?
  18. Что такое локальная память (данные) потока?
  19. Что такое Pthread?
  20. Какими типами данных описывается поток в POSIX?
  21. Какие средства синхронизации потоков используются в POSIX?
  22. В чем отличие потоков в Solaris от потоков в других системах?
  23. Что такое облегченный процесс?
  24. В чем отличие потоков в Windows 2000?
  25. В чем отличие потоков в Linux?
  26. Как представляются потоки в Java, каковы операции над ними и состояния потоков?

Упражнения

  1. Проанализируйте и опишите преимущества, недостатки и проблемы многопоточности.
  2. Реализуйте модель многопоточности один/один.
  3. Реализуйте модель многопоточности много/один.
  4. Реализуйте модель многопоточности много/много.
  5. Напишите на Си программу параллельного умножения матриц с использованием POSIX-потоков.
  6. Напишите на Си программу параллельного умножения матриц с использованием потоков Solaris.
  7. Напишите на Java программу параллельного умножения матриц с использованием Java-потоков.

Темы для курсовых работ, рефератов, эссе

  1. История концепции потока и многопоточности в операционных системах и языках программирования (реферат).
  2. Обзор многопоточности в UNIX, Linux, Solaris (реферат).
  3. Обзор многопоточности в POSIX (реферат).
  4. Обзор многопоточности в MacOS (реферат).
  5. Обзор многопоточности в Java (реферат).
  6. Обзор многопоточности в .NET (реферат).
  7. Обзор многопоточности в Windows 2000 / XP / 2003 / 2008 / 7.
  8. Разработка на Си программы параллельного умножения матриц с использованием POSIX-потоков.
  9. Разработка на Си программы параллельного умножения матриц с использованием потоков Solaris.
  10. Разработка на Java программы параллельного умножения матриц с использованием Java-потоков.
< Лекция 9 || Лекция 10: 1234 || Лекция 11 >
Гульжан Мурсакимова
Гульжан Мурсакимова
Василий Четвертаков
Василий Четвертаков