Потоки и процессы в Solaris

 

В ОС Solaris, как уже было отмечено, используется модель потоков много / много. Кроме того, в системе используется также уже известное нам понятие облегченный процесс (lightweight process)промежуточное между концепцией пользовательского потока и системного потока. Таким образом, в ОС Solaris каждый пользовательский поток отображается в свой облегченный процесс, который, в своюочередь, отображается в поток ядра; последний может исполняться на любом процессоре (или ядре процессора) компьютерной системы.

 


Рис. 10.5.Потоки в Solaris.

 


Рис. 10.6.Процессы в Solaris.

 

На схеме видно, что каждый процесс содержит, кроме стандартной информации блока управления процессом, также список всех своих облегченных процессов для управления ими.

Потоки в Windows 2000

 

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

· идентификатор потока (thread id);

· набор регистров

· отдельные стеки для пользовательских и системных процедур;

· область памяти для локальных данных потока (thread-local storageTLS).

Потоки в 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-потоков.