Архитектура операционных систем 3. Процессы и потоки
Процесс
Процесс 2
Образ процесса
Структуры управления процессом
Process Control Block
Диспетчеризация
Модель состояний процесса 1
Модель состояний процесса 2
Планирование процессов
Управление процессами
Создание процесса
Создание процесса 2
Иерархия процессов (UNIX)
Иерархия процессов (Windows)
Создание процесса (UNIX)
Создание процесса (UNIX) 2
Создание процесса (UNIX) 3
Что в Linux?
Создание процесса (NT)
Переключение между процессами
Переключение контекста
Потоки (нити)
Потоки, зачем они нужны
Параллелизм
Параллелизм 2
Параллелизм 3
Решение – потоки!
Потоки и процессы
Потоки и процессы 2
Потоки и процессы 3
Потоки режима ядра и пользователя
Потоки режима пользователя
Сравнение производительности
Обобщение
99.97K
Category: programmingprogramming

Архитектура операционных систем. Процессы и потоки

1. Архитектура операционных систем 3. Процессы и потоки

2. Процесс

• Определения:
– Это программа в состоянии выполнения
– Объект, выполняемый на процессоре
• Процессы – фундаментальное понятие в ОС
– Как исполняемый объект, процесс позволяет
параллельное выполнение нескольких программ в
системе (ЦП переключается между процессами)
– Всё ПО, работающее на компьютере, включая саму
ОС, организовано в виде множества процессов
2

3. Процесс 2

• Процесс состоит из трех основных компонент
– Исполняемого программного кода
– Ассоциированных с ним данных, необходимых для
выполнения этой программы
– Контекста (информация, необходимая ОС для
управления процессом)
• № процесса
• Регистры ЦП
• Содержимое стэка
• Контекст – основа для переключения процессов
• ОС ведёт список всех процессов, находящихся в
системе
3

4. Образ процесса

• Это выделенное место в памяти
• Каждый процесс выполняется в
собственном виртуальном адресном
пространстве, которое состоит из:
макс.
стэк
– Сегмента стэка: используется для
вызовов функций и системных вызовов
– Сегмента данных: переменные,
статические и динамические
выделяемые из кучи
– Сегмент кода: код программы, обычно
доступ в режиме только для чтения
Сегмент стэка
Сегмент данны
куча
• Запуск одной и той же программы
несколько раз – порождает новые
процессы, у каждого из которых своё
виртуальное адресное пространство и
окружение
данные
код программы
0
Сегмент кода
4

5. Структуры управления процессом

• Таблица процессов. Одна запись на каждый
процесс
• Блок управления процессом: Process Control
Block (PCB)
– Описывает свой процесс и его текущее
состояние
• Образ процесса (Process Image)
– Память, выделенная для процесса
5

6. Process Control Block

• Содержит всю информацию, необходимую для
приостановки и последующего возобновления процесса
– Идентификатор процеса
• № процесса, информация о пользователе, …
– Состояние процессора
• Регистры, указатели стэка, и т.д.
– Состояние процесса
Информация для планировщика: приоритет, …
Привилегии: доступ к памяти, допустимые инструкции
Информация о виртуальной памяти, присвоенной процессу
Статистика и ограничения (ограничения по времени выполнения,
статистика о затраченном процессорном времени)
• Ввод/вывод: владение ресурсами, открытые файлы, выделенные
устройства
6

7. Диспетчеризация

• «Диспетчер» отправляет процессы на
выполнение: выделяет время ЦП, переключает
ЦП с одного процесса на другой
• В любой момент времени, процесс может
находится в каком-либо состоянии





Ожидания ввода/вывода
Выполнения
Готовности к выполнению
Выгруженном

7

8. Модель состояний процесса 1

• Можно выделить три основных состояния
– Выполнения (исполняется на ЦП)
– Готовности (временно остановлен)
– Блокировки (ожидает внешнего события)
Ожидание события
Выполнение
1.
2.
Диспетчеризация
Таймаут
Блокировка
3.
4.
Готовность
1. Процесс заблокирован для В/В
2. Диспетчер планирует другой
процесс
3. Диспетчер планирует этот
процесс
4. В/В произошёл, процесс
возобновляет выполнение
Событие произошло
8

9. Модель состояний процесса 2

Диспетчеризация
Новый
Принят
Завершение
Готов
Выполняется
Завершен
Таймаут
Событие произошло
Ожидание события
Заблокирован
• Модель из пяти состояний
– Новый: процесс создан, но ещё не помещён операционной системой в
пул выполняемых процессов. Создан PCB, но процесс ещё не в памяти
– Готовность: процесс полностью готов для выполнения
– Выполнение: процесс исполняется
– Блокировка: процесс ожидает внешнего события (В/В, и т.п.)
– Завершен: процесс удаляется из пула выполняемых процессов (он
закончил работу)
9

10. Планирование процессов

• В ОС есть различные очереди (или списки)
для планирования процессов
– Очередь задач: множество всех процессов в
системе
– Очередь готовых: множество всех процессов,
готовых для выполнения
– Очередь ожидающих: множество всех
заблокированных процессов
• Процессы перемещаются между этими
очередями
10

11. Управление процессами


Используется одна очередь «готовых» и одна очередь «заблокированных»
Недостатки:
– При наступлении события, все ожидающие этого события процессы нужно переместить
из «заблокированных» в очередь «готовых»
– ОС нужно просмотреть все заблокированные процессы в очереди, чтобы выбрать
правильный
Решение: Использовать несколько очередей «заблокированных» процессов
Поступление
Произошло
событие
Очередь «готовых»
Диспетчинг
Освобождение
ЦП
Таймаут
Очередь «заблокированных»
Ожидание события
11

12. Создание процесса

• Загрузка системы
– При инициализации системы создаются несколько процессов
– В Unix, это процессы «демоны» sched (pid 0), init (pid 1), и другие более
высокоуровневые (веб-сервер, емейл-сервер и т.п.). Ядро – не процесс!
– В NT, ядро - это системный процесс System (pid 4), далее загружаются
система управления подсистемами smss.exe и т.д.
• Текущий процесс порождает дочерний процесс
– Напр. веб-сервер может порождать дочерний процесс для каждого
нового запроса. Ужас! :)
– В UNIX процесс init ожидает авторизации пользователя для того, чтобы
запустить оболочку (новый процесс)
• Пользователь создаёт новый процесс
– Пользователь вызывает команду из текстовой оболочки, или запускает
новую программу через графическую оболочку. Это создаёт новый
процесс, родитель которого – оболочка.
12

13. Создание процесса 2

• Присвоить уникальный идентификатор
новому процессу
• Выделить место для процесса
– Программа, данные, стэк
• Инициализировать PCB
• Добавить процесс в очередь «готовых» к
выполнению
13

14. Иерархия процессов (UNIX)

• Строгая иерархия между процессами:
дочерний и родительский процессы всегда
взаимосвязаны
• Группы процессов
• Напр. интерпретатор командной строки (shell)
является родительским для всех процессов,
которые пользователь запускает из командной
строки
– Если пользователь посылает сигнал (напр. SIGKILL)
группе процессов, то сигнал доставляется каждому
процессу из группы
14

15. Иерархия процессов (Windows)

• Её нет. Все равны.
• Хэндл процесса: когда новый процесс
создаётся родительским, то родитель
получает хэндл дочернего процесса. Т.о.
может им управлять.
• Этот хэндл можно передавать другим
процессом (в отличие от Unix, где
родительский процесс не может менять
множество дочерних процессов)
15

16. Создание процесса (UNIX)

• Процессы создаются через fork() / exec()
– fork() создаёт точный клон вызывающего процесса, т.н.
«дочерний» процесс
– exec() заменяет образ процесса этого клона новой
программой, которая должна быть выполнена
– Поэтому всегда есть иерархия
• После создания у родительского и дочернего процессов
собственные, разные адресные пространства.
Некоторые ресурсы могут быть общими (напр.
открытые файлы)
• Поэтому системный вызов fork() «возвращается
дважды»
– Один раз в родительский процесс, и один раз во вновь
созданный
16

17. Создание процесса (UNIX) 2

Родительский
PCB
Похожие, но не копия
Адресное
пространство
родителя
(код,
статические
данные, куча,
стэк)
идентичная
копия
(единственно
е исключение
– аргумент
PID на
вершине
стэка)
Дочерний
PCB
Адресное
пространство
дочернего
процесса
(код,
статические
данные, куча,
стэк)
17

18. Создание процесса (UNIX) 3

• Как же создать новую программу, а не ещё
одну копию старой?
• «Легко». Вначале fork(), потом exec().
• exec() не создаёт нового процесса, а заменяет
данные текущего процеса новыми данными
• У такой модели есть недостатки:
– fork() очень медленный (нужно создать полную
копию всего)
– Решения в виде vfork(), copy-on-write, и т.п.
18

19. Что в Linux?

• clone() заменяет fork() (и vfork() тоже). У clone()
есть дополнительные опции.
• Но всё-равно нужно чётко понимать, как
работает fork()
• В Linux exec() не является системным вызовом.
• execve() – единственный системный вызов,
аналогичный по функционалу exec()
• Всё-равно нужно чётко понимать, как работает
exec()
19

20. Создание процесса (NT)

• Процессы создаются через системный
вызов NtCreateProcess().
20

21. Переключение между процессами

• При необходимости переключиться на другой
процесс, ОС выполняет «переключение
контекста»
– Состояние старого процесса сохраняется в его PCB
– Состояние нового процесса восстанавливается из
его PCB
• Время затраченное на переключение
контекста – накладные расходы ОС
• Зависит от аппаратной реализации
21

22. Переключение контекста

• События, вызывающие переключение
контекста:
• Прерывания
• Исключения
• Системные вызовы
22

23. Потоки (нити)

• Процесс состоит как минимум из:
– Адресного пространства
• Набор инструкций (код) программы
• Данные для программы
– Состояния потока выполнения
• Счётчик команд (регистр IP)
• Указатель стэка SP
• Другие регистры
– Множества ресурсов ОС
• Открытые файлы, сетевые соединения, …
• И всё это в одном понятии процесса. Не есть
хорошо.
• Разделим соответственно на 3 области
23

24. Потоки, зачем они нужны

• Потоки – для параллелизма и одновременности.
• Параллелизм – это физически одновременное выполнение для
достижения наибольшей производительности.
• Одновременность – логическое и/или физическое
одновременное выполнение. Далее «параллелизм».
• Один из вариантов достижения параллелизма –
использование множества процессов
– Программы в разных процессах изолированы друг от друга
• Потоки – другой способ достичь параллелизма
– Потоки работают внутри одного процесса, все потоки
процесса имеют одно адресное пространство, и те же
ресурсы ОС
– У потоков есть свой стэк и своё состояние ЦП
24

25. Параллелизм

• Возьмём пример про веб-сервер со слайда 12,
который должен обслуживать несколько запросов
параллельно
– Ожидая данных по запросу клиента из базы данных,
сервер мог бы загрузить данные с диска для другого
клиента, и обработать запрос третьего клиента
• Или, веб-браузер
– В момент обращения к веб-страничке, он мог бы
параллельно загружать данные из различных
источников
• Некая вычислительная программа, использующая
физический параллелизм
• Нужно обработать большой массив данных
25

26. Параллелизм 2

• В каждом из этих примеров параллелизма есть
общее:




Один код
Доступ к одним данным
Один уровень доступа
Одно множество ресурсов
• Но есть разное:
– Стэк и указатель на стэк SP
– Счётчик инструкций (регистр IP), указывающий на
следующую инструкцию
– Множество регистров ЦП
26

27. Параллелизм 3

• Как этого достичь?
• Используя знания о процессах, можно
– fork-нуть несколько процессов
– Заставить каждый из них отображать своё
виртуальное адресное пространство на одну и ту
же физическую память
• Неэффективно!
– Затраты на PCB, таблицы страниц, создание
операционной системой структур данных,
копирование адресного пространства, и т.д.
27

28. Решение – потоки!

• Основная мысль
– отделить понятие процесса (адресного
пространства, ресурсов ОС) от
– Минимальной нити, потока управления (т.е.
состояния выполнения – стэка, регистров ЦП)
• Иногда такое состояние выполнения
называют «лёгким процессом» или
потоком
28

29. Потоки и процессы

• Большинство современных ОС поддерживает два
объекта:
– Процесс, который определяет адресное пространство и
общие атрибуты процесса
– Поток, который определяет последовательный поток
выполнения в рамках процесса
• Поток привязывается к одному процессу (адресному
пространству)
– Но может быть много потоков в одном адресном
пространстве
– Лёгкий доступ к общим данным
– Создание потоков занимает очень мало времени
• Потоки стали единицей планирования
• Процессы – всего-лишь контейнер, в котором
выполняются потоки
29

30. Потоки и процессы 2

• Многопоточность полезна для:
– Обработки одновременных событий
– Построения параллельных программ
• Поддержка многопоточности – разделение
понятия процесса от минимального потока
управления
– Для параллельного выполнения не нужно
создавать новые процессы
– Быстрее, меньше требования к памяти
30

31. Потоки и процессы 3

• Раньше: «процесс» = адресное
пространство + ресурсы ОС +
подразумевался единственный поток
• Теперь: «процесс» = адресное пространство
+ ресурсы ОС + все потоки процесса
31

32. Потоки режима ядра и пользователя

• На уровне ядра
– Есть функция ядра для создания нового потока
• Выделяет стэк выполнения внутри адресного
пространства процесса
• Создаёт и инициализирует Thread Control Block
(указатель стэка и другие регистры ЦП)
– Каждый поток идентифицируется своим номером
(TID, по аналогии с PID)
• На уровне пользователя
– Есть возможность управлять потоками из
библиотеки режима пользователя
32

33. Потоки режима пользователя

• Библиотека pthreads
– Каждый поток представляется регистром PC,
остальными регистрами ЦП, стэком и
небольшим блоком TCB
– Создание потока, переключение между
потоками и синхронизация потоков
выполняется вообще без участия ядра!
– Потоки уровня пользователя могут быть в 10100 раз быстрее, чем потоки режима ядра
33

34. Сравнение производительности

• По данным Gribble, Lazowska, Levy, Zahorjan
из Университета им. Вашингтона:
– Создание потока режима ядра
pthread_create()/pthread_join() в 2.5 раза
быстрее создания нового процесса fork/exit.
– Создание потока режима пользователя в 20 раз
быстрее создания потока режима ядра
• В тестах использовалось ядро Linux
34

35. Обобщение

• Множество потоков в одном адресном
пространстве – это хорошо.
• Потоки режима ядра намного эффективнее
процессов, но есть потери на системные вызовы
• Потоки режима пользователя имеют преимущества
и недостатки
– Высокая скорость и «дешевизна» создания
– Могут быть проблемы с вводом/выводом и
блокировками, из-за того, что ядро «не знает» об этих
потоках
• Возможно решить проблемы на уровне
планировщика
35
English     Русский Rules