Файл: Курс лекций по дисциплине Операционные системы 2 Содержание.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 28.03.2024

Просмотров: 51

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

27
Все системные вызовы могут быть изменены и превращены в неблокирующие
(например, считывание с клавиатуры будет просто возвращать нуль байтов, если в буфере на данный момент отсутствуют символы), но изменения, которые для этого необходимо внести в операционную систему, не вызывают энтузиазма. Кроме того, одним из аргументов за использование потоков, реализованных на пользовательском уровне, было именно то, что они могут выполняться под управлением существующих операционных систем. Вдобавок ко всему изменение семантики системного вызова read потребует изменений множества пользовательских программ.
Использование набора потоков, реализованного на пользовательском уровне, связано еще с одной проблемой: если начинается выполнение одного из потоков, то никакой другой поток, принадлежащий этому процессу, не сможет выполняться до тех пор, пока первый поток добровольно не уступит центральный процессор. В рамках единого процесса нет прерываний по таймеру, позволяющих планировать работу процессов по круговому циклу (поочередно). Если поток не войдет в систему поддержки выполнения программ по доброй воле, у планировщика не будет никаких шансов на работу
Проблему бесконечного выполнения потоков можно также решить путем передачи управления системе поддержки выполнения программ, за счет запроса сигнала
(прерывания) по таймеру с периодичностью один раз в секунду, но это для программы далеко не самое лучшее решение. Возможность периодических и довольно частых прерываний по таймеру предоставляется не всегда, но даже если она и предоставляется, общие издержки могут быть весьма существенными. Более того, поток может также нуждаться в прерываниях по таймеру, мешая использовать таймер системе поддержки выполнения программ. Другой наиболее сильный аргумент против потоков, реализованных на пользовательском уровне, состоит в том, что программистам потоки обычно требуются именно в тех приложениях, где они часто блокируются, как, к примеру, в многопоточном веб-сервере.
3.2. Реализация потоков в ядре
Теперь давайте рассмотрим, что произойдет, если ядро будет знать о потоках и управлять ими. Как показано на рис. 1.б, здесь уже не нужна система поддержки исполнения программ. Также здесь нет и таблицы процессов в каждом потоке.
Вместо этого у ядра есть таблица потоков, в которой отслеживаются все потоки, имеющиеся в системе. Когда потоку необходимо создать новый или уничтожить существующий поток, он обращается к ядру, которое затем производит создание или разрушение путем обновления таблицы потоков в ядре. В таблице потоков, находящейся в ядре, содержатся регистры каждого потока, состояние и другая информация. Все информация аналогична той, которая использовалась для потоков, создаваемых на пользовательском уровне, но теперь она содержится в ядре, а не в пространстве пользователя (внутри системы поддержки исполнения программ). Эта информация является подмножеством той информации, которую поддерживают традиционные ядра в отношении своих однопоточных процессов, то есть подмножеством состояния процесса.
Вдобавок к этому ядро также поддерживает традиционную таблицу процессов с целью их отслеживания. Все вызовы, способные заблокировать поток, реализованы как системные вызовы, с более существенными затратами, чем вызов процедуры в системе поддержки исполнения программ. Когда поток блокируется, ядро по своему выбору может запустить либо другой поток из этого же самого процесса (если имеется готовый к выполнению поток), либо поток из другого процесса. Когда потоки реализуются на пользовательском уровне, система поддержки исполнения программ работает с запущенными потоками своего собственного процесса до тех пор, пока ядро не заберет у нее центральный процессор (или не останется ни одного готового к выполнению потока).
Поскольку создание и уничтожение потоков в ядре требует относительно более весомых затрат, некоторые системы с учетом складывающейся ситуации используют


28 более правильный подход и используют свои потоки повторно. При уничтожении потока он помечается как неспособный к выполнению, но это не влияет на его структуру данных, имеющуюся в ядре. Чуть позже, когда должен быть создан новый поток, вместо этого повторно активируется старый поток, что приводит к экономии времени. Повторное использование потоков допустимо и на пользовательском уровне, но для этого нет достаточно веских оснований, поскольку издержки на управление потоками там значительно меньше. Для потоков, реализованных на уровне ядра, не требуется никаких новых, неблокирующих системных вызовов. Более того, если один из выполняемых потоков столкнется с ошибкой обращения к отсутствующей странице, ядро может с легкостью проверить наличие у процесса любых других готовых к выполнению потоков, и при наличии таковых, запустить один из них на выполнение, пока будет длиться ожидание извлечения запрошенной страницы с диска. Главный недостаток этих потоков состоит в весьма существенных затратах времени на системный вызов, поэтому если операции над потоками (создание, удаление и т. п.) проводятся довольно часто, то это влечет за собой более существенные издержки.
Хотя потоки, создаваемые на уровне ядра, и позволяют решить ряд проблем, но справиться со всеми существующими проблемами они не в состоянии. Что будет, к примеру, когда произойдет разветвление многопоточного процесса? Будет ли у нового процесса столько же потоков, сколько было у старого, или будет только один поток? Во многих случаях наилучший выбор зависит от того, выполнение какого процесса запланировано следующим. Если он собирается вызвать команду exec, чтобы запустить новую программу, то, наверное, правильным выбором будет наличие только одного потока. Но если он продолжит выполнение, то правильнее было бы, наверное, воспроизвести все имеющиеся потоки. Другой проблемой являются сигналы. Стоит вспомнить, что сигналы посылаются процессам, а не потокам, по крайней мере, так делается в классической модели.
Какой из потоков должен обработать поступающий сигнал? Может быть, потоки должны зарегистрировать свои интересы в конкретных сигналах, чтобы при поступлении сигнала он передавался потоку, который заявил о своей заинтересованности в этом сигнале? Тогда возникает вопрос: что будет, если на один и тот же сигнал зарегистрировалось два или более двух потоков? И это только две проблемы, создаваемые потоками, а ведь на самом деле их значительно больше.
3.3. Гибридная реализация
В попытках объединить преимущества создания потоков на уровне пользователя и на уровне ядра была исследована масса различных путей. Один из них, показанный на рис. 2, заключается в использовании потоков на уровне ядра, а затем нескольких потоков на уровне пользователя в рамках некоторых или всех потоков на уровне ядра. При использовании такого подхода программист может определить, сколько потоков использовать на уровне ядра и на сколько потоков разделить каждый из них на уровне пользователя. Эта модель обладает максимальной гибкостью.


29
Рис. 2. Разделение на пользовательские потоки в рамках потока ядра
При таком подходе ядру известно только о потоках самого ядра, работу которых оно и планирует. У некоторых из этих потоков могут быть несколько потоков на пользовательском уровне, которые расходятся от их вершины. Создание, удаление и планирование выполнения этих потоков осуществляется точно так же, как и у пользовательских потоков, принадлежащих процессу, запущенному под управлением операционной системы, не способной на многопоточную работу. В этой модели каждый поток на уровне ядра обладает определенным набором потоков на уровне пользователя, которые используют его по очереди.

30
Лекция 4
1   2   3   4   5   6   7   8   9   10

Тема: Планирование процессов и потоков
План:
1. Планирование: задачи и алгоритмы.
2. Планирование в пакетных ОС.
3. Планирование в интерактивных ОС.
4. Планирование в ОС реального времени.
5. Планирование потоков.
6. Приоритетное планирование потоков в ОС Windows.
Литература:
1. Коньков К.А. Устройство и функционирование ОС Windows. Практикум к курсу
«Операционные системы»: учебное пособие/ К.А. Коньков. – М.: Интернет-
Университет Информационных Технологий; БИНОМ. Лаборатория знаний, 2008. – с. 64 – 98.
2. Назаров С.В., Гудыно Л.П., Кириченко А.А. Операционные системы. Практикум.
Под ред. С.В. Назарова. – М.: Кудиц-ПРЕСС, 2008. – с. 75-134.
3. Э. Таненбаум. Современные операционные системы. – 3-е издание. – СПб.: Питер,
2010. Гл. 1. с. 97-183.
4. Гордеев А.В. Операционные системы– 2-е издание. – СПб.: Питер, 2004. Гл. 1. с.
50-71.
1. Планирование
Все потоки мультипрограммного вычислительного процесса должны иметь доступ к системным ресурсам – кучам, портам, файлам, окнам и т.д. Потоки взаимодействуют друг с другом в двух основных случаях: совместно используя разделяемый ресурс и уведомляя друг друга о завершении каких-либо операций.
Выбор текущего потока из нескольких активных потоков, пытающихся получить доступ к процессору, называется планированием. Планирование – очень важная и критичная для производительности операция, поэтому система предоставляет много рычагов для еѐ гибкой настройки.
Выбранный для выполнения поток работает в течение некоторого периода, называемого квантом, по истечении которого поток вытесняется, то есть процессор передается другому потоку. Предполагается, что поток не знает, в какой момент он будет вытеснен. Поток также может быть вытеснен, даже если его квант ещѐ не истек. Это происходит, когда к выполнению готов поток с более высоким приоритетом.
Если аппаратный таймер обеспечивает периодические прерывания с частотой 50 или
60 Гц или с какой-нибудь другой частотой, планировщик должен принимать решения при каждом прерывании по таймеру или при каждом k-том прерывании. По реакции на прерывания по таймеру алгоритмы планирования можно разделить на две категории.
Неприоритетный алгоритм планирования выбирает запускаемый процесс, а затем просто дает ему возможность выполняться до тех пор, пока он не заблокируется (либо в ожидании завершения операции ввода-вывода, либо в ожидании другого процесса), или до тех пор, пока он добровольно не освободит центральный процессор. Даже если процесс будет работать в течение нескольких часов, он не будет приостановлен в принудительном порядке. В результате во время прерываний по таймеру решения приниматься не будут.

После завершения обработки прерывания по таймеру работу возобновит ранее запущенный процесс, если только какой-нибудь процесс более высокого уровня не ожидал только что истекшей задержки по времени.

31
В отличие от этого приоритетный алгоритм планирования предусматривает выбор процесса и предоставление ему возможности работать до истечения некоторого строго определенного периода времени. Если до окончания этого периода он все еще будет работать, планировщик приостанавливает его работу и выбирает для запуска другой процесс (если есть доступный для этого процесс). Осуществление приоритетного алгоритма планирования требует наличия прерываний по таймеру, возникающих по окончании определенного периода времени, чтобы вернуть управление центральным процессором планировщику. Если прерывания по таймеру недоступны, остается лишь использовать неприоритетное планирование.
Категории алгоритмов планирования
Различные сферы приложений (и разные типы операционных систем) предназначены для решения разных задач. Иными словами, предмет оптимизации для планировщика не может совпадать во всех системах. При этом стоит различать три среды:
1) пакетную;
2) интерактивную;
3) реального времени.
В пакетных системах не бывает пользователей, терпеливо ожидающих за своими терминалами быстрого ответа на свой короткий запрос. Поэтому для них зачастую приемлемы неприоритетные алгоритмы или приоритетные алгоритмы с длительными периодами для каждого процесса. Такой подход сокращает количество переключений между процессами, повышая при этом производительность работы системы. Пакетные алгоритмы носят весьма общий характер и часто находят применение также и в других ситуациях, поэтому их стоит изучить даже тем, кто не работает в сфере корпоративных вычислений с использованием универсальных машин.
В среде с пользователями, работающими в интерактивном режиме, приобретает важность приоритетность, сдерживающая отдельный процесс от захвата центрального процессора, лишающего при этом доступа к службе всех других процессов. Даже при отсутствии процессов, склонных к бесконечной работе, один из процессов в случае программной ошибки мог бы навсегда закрыть доступ к работе всем остальным процессам. Для предупреждения такого поведения необходимо использование приоритетного алгоритма. Под эту категорию подпадают и серверы, поскольку они, как правило, обслуживают нескольких вечно спешащих (удаленных) пользователей.
В системах, ограниченных условиями реального времени, как ни странно, приоритетность иногда не требуется, поскольку процессы знают, что они могут запускаться только на непродолжительные периоды времени, и зачастую выполняют свою работу довольно быстро, а затем блокируются. В отличие от интерактивных систем в системах реального времени запускаются лишь те программы, которые предназначены для содействия определенной прикладной задаче. Интерактивные системы имеют универсальный характер и могут запускать произвольные программы, которые не выполняют совместную задачу или даже вредят друг другу.
Задачи алгоритма планирования
Задачи алгоритма планирования, которых следует придерживаться при различных обстоятельствах:
Все системы
Равнодоступность – предоставление каждому процессу справедливой доли времени центрального процессора.
Принуждение к определенной политике - наблюдение за выполнением установленной политики.
Баланс - поддержка загруженности всех составных частей системы.
Пакетные системы
Производительность - выполнение максимального количества заданий в час.