- •Понятие ресурса
- •5.1.2 Модель процесса (слайд №38)
- •5.1.3 Создание процесса (слайд №39)
- •5.1.4 Завершение процесса
- •5.1.5 Иерархия процессов
- •5.1.6 Состояние процессов
- •Многопоточность
- •Однопоточные и многопоточные процессы
- •5.2.2 Модель потока
- •5.2.4 Реализация потоков в пространстве пользователя, ядра и смешанное
- •5.3. Взаимодействие между процессами (слайд №42)
- •5.3.1. Передача информации от одного процесса другому
- •Взаимоблокировка процессов (слайд №52)
- •7.1 Взаимоблокировка процессов
- •5.3.2 Состояние состязания
- •5.3.3 Критические области
- •5.3.4 Взаимное исключение с активным ожиданием
- •7.3 Методы борьбы с взаимоблокировками
- •7.3.1 Пренебрежением проблемой в целом (страусовый алгоритм)
- •7.3.2 Обнаружение и устранение взаимоблокировок
- •7.3.3 Динамическое избежание взаимоблокировок
- •7.3.4 Предотвращение четырех условий, необходимых для взаимоблокировок
- •Планирование процессов (слайд №43)
- •6.1 Основные понятия планирования процессов
- •6.3.2 Приоритетное планирование
- •6.3.3 Методы разделения процессов на группы
- •6.4 Планирование в системах реального времени (слайд №49, 50, 51)
- •6.4.1 Планирование однородных процессов
- •6.4.2 Общее планирование реального времени
- •6.4.3 Статический алгоритм планирования rms (Rate Monotonic Scheduling)
- •6.4.4 Динамический алгоритм планирования edf (Earliest Deadline First)
5.2.2 Модель потока
С каждым потоком связывается:
Счетчик выполнения команд
Регистры для текущих переменных
Стек
Состояние
Потоки делят между собой элементы своего процесса:
Адресное пространство
Глобальные переменные
Открытые файлы
Таймеры
Семафоры
Статистическую информацию.
В остальном модель идентична модели процессов.
В POSIX и Windows есть поддержка потоков на уровне ядра.
В Linux есть новый системный вызов clone для создания потоков, отсутствующий во всех остальных версиях системы UNIX.
В POSIX есть новый системный вызов pthread_create для создания потоков.
В Windows есть новый системный вызов Createthread для создания потоков.
5.2.4 Реализация потоков в пространстве пользователя, ядра и смешанное
А - потоки в пространстве пользователя B - потоки в пространстве ядра
Реализация многопоточности в ОС, как и многих других возможностей, имеет несколько уровней абстракции. Самый высокий из них – пользовательский уровень. С точки зрения пользователя и его программ, управление потоками реализовано через библиотеку потоков пользовательского уровня (user threads). Отметим, что существует несколько моделей потоков пользовательского уровня, среди которых:
POSIX Pthreads – потоки, специфицированные стандартом POSIX и используемые в POSIX-приложениях (рассмотрены позже в данной лекции);
Mac C-threads – пользовательские потоки в системе MacOS;
Solaris threads – пользовательские потоки в ОС Solaris (рассмотрены позже в данной лекции).
Низкоуровневые потоки, в которые отображаются пользовательские потоки, называются потоками ядра (kernel threads). Они поддержаны и используются на уровне ядра операционной системы. Как и подходы к пользовательским потокам, подходы к архитектуре и реализации системных потоков и к отображению пользовательских потоков в системные в разных ОС различны. Например, собственные модели потоков ядра со своей спецификой реализованы в следующих ОС:
Windows 95/98/NT/2000/XP/2003/2008/7;
Solaris;
Tru64 UNIX;
BeOS;
Linux.
Описание рисунка. В случае А ядро о потоках ничего не знает. Каждому процессу необходима таблица потоков, аналогичная таблице процессов.
Преимущества случая А:
Такую многопоточность можно реализовать на ядре не поддерживающем многопоточность
Более быстрое переключение, создание и завершение потоков
Процесс может иметь собственный алгоритм планирования.
Недостатки случая А:
Отсутствие прерывания по таймеру внутри одного процесса
При использовании блокирующего (процесс переводится в режим ожидания, например: чтение с клавиатуры, а данные не поступают) системного запроса все остальные потоки блокируются.
Сложность реализации
Существуют различные модели многопоточности – способы отображения пользовательских потоков в потоки ядра. Теоретически возможны (и на практике реализованы) следующие модели многопоточности:
- Модель много / один (many-to-one) – отображение нескольких пользовательских потоков в один и тот же поток ядра. Используется в операционных системах, не поддерживающих множественные системные потоки (например, с целью экономии памяти). Данная модель изображена на рис. 10.2.
Рис. 10.2. Схема модели многопоточности "много / один".
- Модель один / один (one-to-one) – взаимно-однозначное отображение каждого пользовательского потока в определенный поток ядра. Примеры ОС, использующих данную модель, - Windows 95/98/NT/2000/XP/2003/2008/7; OS/2. Данная модель изображена на рис. 10.3.
Рис. 10.3. Схема модели многопоточности "один / один".
- Модель много / много (many-to-many) – модель, допускающая отображение нескольких пользовательских потоков в несколько системных потоков. Такая модель позволяет ОС создавать большое число системных потоков. Характерным примером ОС, использующей подобную модель, является ОС Solaris, а также Windows NT / 2000 / XP / 2003 / 2008 / 7 с пакетом ThreadFiber. Данная модель изображена на рис. 10.4.
Рис. 10.4. Схема модели многопоточности "много / много".