Преподаватель
Спонсор: Microsoft
Опубликован: 13.11.2010 | Уровень: для всех | Доступ: свободно
Лекция 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 >
Гульжан Мурсакимова
Гульжан Мурсакимова
На каком этапе графического конвейера происходит отсечение невидимых объектов?
Василий Четвертаков
Василий Четвертаков
Почему следует исключить race condition?
Айрат Хисматуллин
Айрат Хисматуллин
Россия
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород