СПО (Корнилов) / Лекции / вар2 / Операционные системы (Корнилов)
.pdf
СПО Лекция 1 [23.12.04] |
11 |
Зачем?
•параллелизм при выполнении программы (пока одна нить ждет некоторого события, другая может выполняться)
•нити выполняются в общем адресном пространстве, что упрощает организацию взаимодействия параллельных ветвей процесса. (В случае взаимодействия процессов есть проблема: ОС обязана защищать адресные пространства процессов)
•разные нити могут выполняться на разных процессорах
Легкие процессы обычно порождаются на основе функций (частей программы).
Пример: Обсудить разницу в структуре однонитевой и многонитевой программы, обрабатывающей потоки сообщений, поступающие по нескольким каналам.
Замечания по терминологии
•В некоторых книгах по Windows вместо термина «нить» используется термин «поток». Видимо это связано с понятием « последовательное выполнение потока команд ». Термин занят в C++, и в некоторых ОС, где он обозначает метод обработки потоков данных от внешних устройств ( streamsдрайверы в ОС Solaris)
•В Windows процесс и нить различают по способности владеть ресурсами. Выделяемые системой ресурсы приписываются только процессу. Нить является объектом для планировщика процессов и принадлежит процессу.
Контекст (состояние) нити
Включает в себя все, что необходимо для продолжения работы нити после ее остановки. Все необходимое размещается в адресном пространстве процесса.
Часть контекста нити может быть разделяемое с другими нитями:
•куча (динамически распределяемая память процесса)
•глобальные данные процесса
•дескрипторы открытых файлов
Часть контекста нити может является локальной:
•стек
•содержимое регистров процессора
СПО Лекция 1 [23.12.04] |
12 |
Классификация ОС
Число нитей в |
|
Число адресных пространств |
адресном пространстве |
Одно |
Много |
Одна |
MS-DOS |
ранний UNIX |
Много |
VxWorks, JavaOS |
OS/2, Windows 95/NT, Solaris, Linux, HP-UX |
|
(не нужна защита) |
|
Состояние нити
Для каждой нити создается структура «Дескриптор нити или Thread Control Block (TCB)».
С точки зрения управляющей программы TCB, является объектом, который представляет нить и содержит информацию, необходимую для управления.
Обычно содержит: область сохранения регистров процессора; данные для планировщика (текущее состояние, приоритет, использованное процессорное время); учетную информацию о нити. После создания нить пребывает в одном из трех состояний, показанных ниже.
Активен
Планировщик |
I/O запрос |
Готов |
Блокирован |
I/O завершение
Переходы:
1.«Активен» -> «Блокирован»: по инициативе программы (системный вызов)
2.«Блокирован» -> «Готов»: в результате реакции на сигнал о завершении операции
3.«Активен» <-> «Готов»: в результате работы планировщика
В лабораторном практикуме дескриптор процесса представлен двумя структурами: DOSThread и DOSThreadManager
DOSThreadManager: |
|
- next |
// указатель на следующий объект |
- prev |
// указатель на предыдущий объект |
- thread |
// указатель на DOSThread |
- stack |
// указатель на область стека |
СПО Лекция 1 [23.12.04] |
13 |
- stkptr |
// указатель стека |
- wakeup |
// время, когда будить после delay |
- fpustate |
// состояние сопроцессора |
DOSThread: |
|
- state |
// состояние процесса |
- id |
// идентификатор |
- entry |
// указатель на DOSThreadManager |
- starttme |
// время создания |
- readytime |
// время в очереди готовых |
- activetime |
// время использования процессора |
Диспетчеризация. Цикл планирования
Диспетчер (планировщик) ОС предоставляет процессор в распоряжение нити. Приостанавливает выполнение одной нити и активизацию другой, готовой к выполнению.
Как передается управление планировщику?
(1)Принцип «спящей красавицы» (Windows 3.1):ждать пока процесс сам отдаст управление в результате выполнения некоторого системного вызова.
(2)Использовать прерывания от таймера по истечению определенного кванта времени, вызывать планировщик и переключать контекст.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Обработка |
|
|
|
|
|
|
|
|
|
|
|
|
|
события |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Планировщик |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Системный |
|
Активный |
|
|
||||||||
|
вызов |
|
процесс |
|
|
||||||||
Диспетчер (планировщик) включается по прерыванию таймера и, если истек установленный квант времени, то выполнить следующие действия:
•Сохранить состояние активной нити (регистры в области процесса)
•Выбрать следующую нить из очереди готовых для выполнения
•Восстановить состояние выбранной нити
•Передать управление нити
Что если очередь готовых пуста?
СПО Лекция 1 [23.12.04] |
14 |
Для этого существует фиктивная нить ядра ОС, которая ничего не делает. Зато всегда есть кому выделить процессор.
Что если происходит переключение с нити одного процесса на нить другого процесса?
Необходимо переключать активное адресное пространство (изменять регистр таблицы сегментов или страниц)
Сохранение-восстановление состояния должно выполняться в привилегированном режиме, поскольку связано с переключением адресных пространств. Обычно имеется аппаратная поддержка для выполнения этих действий.
По какому принципу выбирать нить для выполнения из очереди готовых (RANDOM, LIFO, FIFO)?
Создание процесса и нити
Создание нити в лабораторном практикуме (конструктор DOSThread)
•Создает дескриптор (DOSThreedManager)
•Выделяет память для стека
•Формирует начальное состояние стека, такое которое требуется планировщику для активизации нити. В частности, в стек должны быть занесены: адрес точки входа в процедуру нити, значения для регистров ЦП и регистра флагов.
•Разместить в очереди готовых к выполнению
Создание процесса в UNIX
…
If (!fork())
{
execl(prog,…,0);
exit(1);
}
…
Создание процесса в Win32API
Объект процесс и его главная нить создаются следующим вызовом
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
СПО Лекция 1 [23.12.04] |
15 |
LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles,
DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
lpApplicationName - полное путевое имя программы
lpCommandLine – командная строка (параметры)
lpProcessAttributes – атрибуты защиты и возможность наследования дескриптора процесса дочерними процессами
lpThreadAttributes - атрибуты защиты для главной нити
bInheritHandles - если TRUE то порождаемый процесс наследует объекты, которые разрешены для наследования
dwCreationFlags – режим создания процесса (CREATE_SUSPENDED не запускать сразу главную нить, класс приоритета процесса)
lpEnvironment – блок переменных окружения для создаваемого процесса (если задан)
lpCurrentDirectory – текущая директория для создаваемого процесса
lpStartupInfo – указатель на структуру STARTUPINFO, которая определяет как открывается окно для порождаемого процесса
lpProcessInformation – указатель на структуру PROCESS_INFORMATION, в которую записывается идентификационная информация о процессе
Примечание
Лучший способ завершить процесс – выполнить в нем ExitProcess, поскольку все подключенные DLL уведомляются о завершении программы.
Объект процесс остается в системе до тех пор пока на него существуют ссылки (при запуске их две: собственная и от родителя)
Создание нити
HANDLE
CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
lpThreadAttributes - атрибуты защиты для главной нити
dwStackSize – размер стека
lpStartAddress – указатель на функцию, на основе которой выполняется нить
lpParameter – параметр функции (число или указатель)
СПО Лекция 1 [23.12.04] |
16 |
dwCreationFlags - режим создания нити (CREATE_SUSPENDED не запускать сразу)
lpThreadId – указатель на поле, в котором возвращается идентфикатор нити
Лекция 4: Методы планирования процессов
Цели планирования
•Минимизировать время реакции системы (время на операцию) Операции: нажатие на клавишу в редакторе, компиляция, счетная задача
•Обеспечить максимальную пропускную способность: минимизировать накладные расходы на переключение между процессами; эффективно использовать ресурсы машины (не только ЦП!)
•Справедливое распределение процессора
Большинство исследований проводились в предположении: один пользователь – один процесс; один процесс – одна нить; программы независимы. Это упрощает задачу и позволяет сделать прогноз о поведении системы.
Любой метод планирования отдает предпочтение процессам определенного типа и ухудшает характеристики обработки для процессов других типов (ограниченные ЦП, ограниченные вводом-выводом, короткие, длинные).
Решение задачи планирования осложняется и тем, что поведение задач трудно предсказуемо.
Будем рассматривать два класса методов: для систем пакетной обработки (не прерываемые) и для систем разделения времени (прерываемые).
Всистемах пакетной обработки планирование осуществляется в виде упорядочения входной очереди задач и выполняется либо в момент поступления новой задачи в систему либо в момент выбора задачи для выполнения. Задача, выбранная для выполнения, выполняется от начала до конца без передачи процессора другим задачам.
Всистемах разделения времени процессор передается другой задаче либо по таймеру, либо по инициативе активной задачи в результате выполнения системного вызова.
FIFO (в порядке поступления) для систем пакетной обработки
В ранних системах просто выполнять по очереди до полного завершения. (Неэффективное использование процессора и устройств: пока ждем завершение ввода – вывода процессор простаивает)
Позднее – выполнение до системного вызова, приводящего к блокировке процесса
(+)простота
(+)гарантированное предоставление процессора
СПО Лекция 1 [23.12.04] |
17 |
(-) короткие задачи долго ждут в очереди
Round Robin (карусель) аналог FIFO для систем разделения времени
Фиксируется квант. По прерыванию от таймера задача помещается в конец очереди готовых процессов. Сейчас, в той или иной форме, любая ОС использует подобный алгоритм.
Это достаточно справедливый метод.
Важно! Величина кванта?
Если квант велик, то короткие долго ждут, что увеличивает среднее время реакции системы. Если квант мал, то велики накладные расходы на переключение между процессами. Обычно выдерживается соотношение 100:1, т.е. накладные расходы на переключение не превышают 1%.
Типичная величина кванта в современных системах 10-100мс при времени переключения 0.1 – 1мс
(+)простота
(+)гарантированное предоставление процессора
Сравнение FIFO и RR
Всегда ли RR лучше FIFO? Пусть имеется 10 готовых к выполнению задач, каждой требуется 100 сек процессорного времени, накладных расходов на переключение нет, квант для RR равен 1 сек.
Время реакции (время в системе: выполнение + ожидание):
#Задачи |
FIFO |
RR |
1 |
100 |
991 |
2 |
200 |
992 |
… |
|
|
9 |
900 |
999 |
10 |
1000 |
1000 |
ср. время |
550 |
995.5 |
(-) RR резко увеличивает среднее время выполнения для одинаковых задач.
STCF/SRTCF по наименьшему времени до завершения
STCF (SJF) – Shortest Time to Completion First (Sortest Job First) - не прерываемый SRTCF – Shortest Remaining Time to Completion First - прерываемый
Если целью является уменьшение среднего времени выполнения, то данные методы являются лучшими. Особенно выгодно для коротких задач и незначительно увеличивает время выполнения длинных задач.
(+) оптимальное среднее время выполнения (-) трудно предсказать оставшееся время (Время можно заказывать в параметрах задачи.)
СПО Лекция 1 [23.12.04] |
18 |
(-) Негарантированное обслуживание. Может привести к бесконечному откладыванию длинных задач
Утверждение об оптимальности справедливо лишь для фиксированной ситуации когда не поступают новые задачи. Это иллюстрируется следующим примером.
Пример: 5 задач А(2сек), B(4сек), C(1сек), D(1сек), E(1сек)
В момент времени 0 готовы задачи A и B, в момент времени 3 поступают задачи C,D,E
STCF |
|
|
|
|
|
|
|
|
|
|
1 |
2 |
3 |
6 |
7 |
8 9 |
|
|
|
|
|
A: * |
* |
|
|
|
|
|
|
|
|
|
B: - |
- * * * * |
|
|
|
|
|
|
|
||
C: |
|
|
- - - * |
|
|
|
|
|
|
|
D: |
|
|
- - - - * |
|
|
|
|
|
||
E: |
|
|
- - - - - * |
|
|
|
|
|
||
|
|
|
Задача |
A |
B |
C |
D |
E |
||
|
|
|
Вр. выполнения |
2 |
6 |
4 |
5 |
6 |
||
STCF: Tср = 23/5 = 4.6
Если бы обладали даром предвидения, то могли бы упорядочить так
1 2 |
4 |
5 |
6 |
7 |
9 |
|
|
|
|
|
A: - - - - - - - * * |
|
|
|
|
|
|||||
B: * * * * |
|
|
|
|
|
|
|
|
|
|
C: |
- * |
|
|
|
|
|
|
|
|
|
D: |
- - * |
|
|
|
|
|
|
|
||
E: |
- - - * |
|
|
|
|
|
|
|||
|
|
|
Задача |
|
B |
C |
D |
E |
A |
|
|
|
|
Вр. выполнения |
4 |
2 |
3 |
4 |
9 |
||
|
|
|
Tср = 22/5 = 4.4 |
|
|
|
|
|
||
Многоуровневые очереди для систем разделения времени
Относится к адаптивным методам. Основная идея: использовать информацию о прошлом поведении для предсказания будущего.
Впервые применен в системе CTSS. Ведется несколько RR очередей с разными приоритетами: Приоритет Квант
11
22
34
48
СПО Лекция 1 [23.12.04] |
19 |
Порядок работы:
1.Первый раз задача ставится в самую приоритетную очередь
2.Если задача полностью использует квант, то ставится в конец очереди с более низким приоритетом
3.Если квант использован не до конца, то ставится в конец очереди с более высоким приоритетом
По сути является аппроксимацией SRTCF
(+) Простой в реализации (-) Не гарантирует обслуживание, можно надолго заблокировать длинные задачи
Обеспечение гарантированного обслуживания
UNIX повышает приоритет ожидающим задачам. Проблема в том как часто и на сколько сильно следует повышать приоритет? Это сильно влияет на характеристики работы системы.
Планирование на основе лотерейных билетов:
Каждой задаче выдается определенное число лотерейных билетов. Таким образом доля процессорного времени пропорциональна числу выданных лотерейных билетов. По какому принципу выдавать лотерейные билеты? Если хотим аппроксимировать SRTCF, то коротким даем больше, а длинным меньше (1-для длинных, 10 – для коротких).
В конце кванта выбирается счастливый билет.
Это лучше простой приоритетной схемы, поскольку при добавлении или удалении задач изменения пропорционально сказываются на всех задачах.
Число коротких/ |
%времени на каждую |
%времени на каждую |
Число длинных |
короткую задачу |
длинную задачу |
1/1 |
91% |
9% |
0/2 |
0 |
50% |
2/0 |
50% |
0 |
10/1 |
10% |
1% |
1/10 |
50% |
5% |
Заключение по планированию
Детали того или иного алгоритма планирования (особенно в части его справедливости) особенно заметны при перегрузке системы, при этом время выполнения будет большим, независимо от того, какой метод использовался.
СПО Лекция 1 [23.12.04] |
20 |
|
Тср |
|
|
|
N |
|
В системах со свопингом применяют 2-х уровневое планирование: |
|
|
- уровень 1 |
– обычный |
|
- уровень 2 |
– для выгруженных из ОЗУ процессов |
|
Планирование процессов в Win32
32 уровня приоритета (0 – 31 max) |
|
|
|
|
На каждом уровне дисциплина планирования RR. |
|
|
||
Распределение приоритетов: |
|
|
|
|
Приоритет |
|
Классы приоритета |
|
|
нити |
IDLE |
NORMAL |
HIGH |
REALTIME |
TIMECRITICAL |
15 |
15 |
15 |
31 |
HIGHEST |
6 |
10 |
15 |
26 |
ABOVENORMAL |
5 |
9 |
14 |
25 |
NORMAL |
4 |
8 |
13 |
24 |
BELOWNORMAL |
3 |
7 |
12 |
23 |
LOWEST |
2 |
6 |
11 |
22 |
IDLE |
1 |
1 |
1 |
16 |
Класс приоритета назначается процессу. Для нити устанавливается приоритет.
Обычная программа запускается с классом приоритета NORMAL и с приоритетом нити NORMAL. Значения в таблице не стандартизованы и могут меняться для разных редакций Windows.
