Потоки и процессы в Solaris
В ОС Solaris, как уже было отмечено, используется модель потоков много / много. Кроме того, в системе используется также уже известное нам понятие облегченный процесс (lightweight process)промежуточное между концепцией пользовательского потока и системного потока. Таким образом, в ОС Solaris каждый пользовательский поток отображается в свой облегченный процесс, который, в своюочередь, отображается в поток ядра; последний может исполняться на любом процессоре (или ядре процессора) компьютерной системы.
Рис. 10.5.Потоки в Solaris.
Рис. 10.6.Процессы в Solaris.
На схеме видно, что каждый процесс содержит, кроме стандартной информации блока управления процессом, также список всех своих облегченных процессов для управления ими.
Потоки в Windows 2000
Как уже отмечалось, в системе Windows реализована модель многопоточности "один / один". Каждый поток содержит:
· идентификатор потока (thread id);
· набор регистров
· отдельные стеки для пользовательских и системных процедур;
· область памяти для локальных данных потока (thread-local storage – TLS).
Потоки в Linux
В системе Linux потоки называются tasks (задачами),а не threads. Поток создается системным вызовом clone(). Данный системный вызов позволяет дочерней задаче использовать общее адресное пространство с родительской задачей (процессом).
Потоки в Java
Как уже отмечалось, Java – первая платформа для разработки программ, в которой многопоточность поддержана на уровне языка и базовых библиотек. Потоки в Java могут быть созданы следующими способами:
· Как расширения класса Thread
· Как классы, реализующие интерфейс Runnable, который содержит единственный метод run– исполняемое тело потока.
Потоки в Java управляются JVM. Возможно создание групп потоков и иерархии таких групп.
Подобно потокам в ОС, поток в Java создается и находится в состоянии новый, затем – выполняемый ; при вызове методов типа wait, sleepи др.поток переходит в состояние ожидания; при завершении метода runпоток завершается.
Рис. 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.
Вопросы
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-потоков.