Q1 Назначение и функции операционной системы. Операционная система представляет собой комплекс взаимосвязанных программных средств, обеспечивающий взаимодействие пользователя с вычислительной системой (ВС) и управляющая ресурсами ВС. ОС обеспечивает пользователя программами, имеющими простой, доступный интерфейс для работы с ПО и аппаратурой. ОС выполняет две по существу мало связанные функции: обеспечение пользователюпрограммисту удобств посредством предоставления для него расширенной машины и повышение эффективности использования компьютера путем рационального управления его ресурсами. ОС как расширенная машина: ОС ограждает программистов от аппаратуры дискового накопителя и предоставляет ему простой файловый интерфейс, операционная система берет на себя все малоприятные дела, связанные с обработкой прерываний, управлением таймерами и оперативной памятью, а также другие низкоуровневые проблемы. ОС как система управления ресурсами: ОС является распределение процессоров, памяти, устройств и данных между процессами, конкурирующими за эти ресурсы. ОС должна управлять всеми ресурсами вычислительной машины таким образом, чтобы обеспечить максимальную эффективность ее функционирования. Критерием эффективности может быть, например, пропускная способность или реактивность системы. Управление ресурсами включает решение двух общих, не зависящих от типа ресурса задач: • планирование ресурса - то есть определение, кому, когда, а для делимых ресурсов и в каком количестве, необходимо выделить данный ресурс; • отслеживание состояния ресурса - то есть поддержание оперативной информации о том, занят или не занят ресурс, а для делимых ресурсов - какое количество ресурса уже распределено, а какое свободно. Q2 Место ОС в структуре ВС. Операционная система представляет собой комплекс взаимосвязанных программных средств, обеспечивающий взаимодействие пользователя с вычислительной системой (ВС) и управляющая ресурсами ВС. ОС обеспечивает пользователя программами, имеющими простой, доступный интерфейс для работы с ПО и аппаратурой. Является "прослойкой" между аппаратурой и прикладным программный интерфейсом, позволяет не думать программисту или пользователю об аппартаной части вычислительной системы и методах его функционирования. что ещё добавить - пока не знаю.... 3. Эволюция ОС • Первый период - их ещё нет, но есть ЭВМ (1945 -1955) В середине 40-х были созданы первые ламповые вычислительные устройства. В то время одна и та же группа людей участвовала и в проектировании, и в эксплуатации, и в программировании вычислительной машины. Это была скорее научно-исследовательская работа в области вычислительной техники, а не использование компьютеров в качестве инструмента решения каких-либо практических задач из других прикладных областей. Программирование осуществлялось исключительно на машинном языке. Об операционных системах не было и речи, все задачи организации вычислительного процесса решались вручную каждым программистом с пульта управления. Не было никакого другого системного программного обеспечения, кроме библиотек математических и служебных подпрограмм. • Второй период - появляется прообраз, системы пакетной обработки (1955 - 1965) В эти годы появились первые алгоритмические языки, а следовательно и первые системные программы - компиляторы. Стоимость процессорного времени возросла, что потребовало уменьшения непроизводительных затрат времени между запусками программ. Появились первые системы пакетной обработки, которые просто автоматизировали запуск одной программ за другой и тем самым увеличивали коэффициент загрузки процессора. Системы пакетной обработки явились прообразом современных операционных систем, они стали первыми системными программами, предназначенными для управления вычислительным процессом. В ходе реализации систем пакетной обработки был разработан формализованный язык управления заданиями, с помощью которого программист сообщал системе и оператору, какую работу он хочет выполнить на вычислительной машине. Совокупность нескольких заданий, как правило в виде колоды перфокарт, получила название пакета заданий. • Третий период - первые ОС, универсальные, сложные, багнутые, но работающие(1965 1980) В это время в технической базе произошел переход от отдельных полупроводниковых элементов типа транзисторов к интегральным микросхемам, что дало гораздо большие возможности новому, третьему поколению компьютеров Для этого периода характерно также создание семейств программно-совместимых машин. Первым семейством программно-совместимых машин, построенных на интегральных микросхемах, явилась серия машин IBM/360. Построенное в начале 60-х годов это семейство значительно превосходило машины второго поколения по критерию цена/произ-водительность. Вскоре идея программно-совместимых машин стала общепризнанной. Программная совместимость требовала и совместимости операционных систем. Такие операционные системы должны были бы работать и на больших, и на малых вычислительных системах, с большим и с малым количеством разнообразной периферии, в коммерческой области и в области научных исследований. Операционные системы, построенные с намерением удовлетворить всем этим противоречивым требованиям, оказались чрезвычайно сложными "монстрами". Они состояли из многих миллионов ассемблерных строк, написанных тысячами программистов, и содержали тысячи ошибок, вызывающих нескончаемый поток исправлений. В каждой новой версии операционной системы исправлялись одни ошибки и вносились другие Однако, несмотря на необозримые размеры и множество проблем, OS/360 и другие ей подобные операционные системы машин третьего поколения действительно удовлетворяли большинству требований потребителей. Важнейшим достижением ОС данного поколения явилась реализация мультипрограммирования. Мультипрограммирование - это способ организации вычислительного процесса, при котором на одном процессоре попеременно выполняются несколько программ. Пока одна программа выполняет операцию вводавывода, процессор не простаивает, как это происходило при последовательном выполнении программ (однопрограммный режим), а выполняет другую программу (многопрограммный режим). При этом каждая программа загружается в свой участок оперативной памяти, называемый разделом. Наряду с мультипрограммной реализацией систем пакетной обработки появился новый тип ОС - системы разделения времени. Вариант мультипрограммирования, применяемый в системах разделения времени, нацелен на создание для каждого отдельного пользователя иллюзии единоличного использования вычислительной машины. Другое нововведение - спулинг (spooling). Спулинг в то время определялся как способ организации вычислительного процесса, в соответствии с которым задания считывались с перфокарт на диск в том темпе, в котором они появлялись в помещении вычислительного центра, а затем, когда очередное задание завершалось, новое задание с диска загружалось в освободившийся раздел. • Четвертый период (1980 - настоящее время) Следующий период в эволюции операционных систем связан с появлением больших интегральных схем (БИС). В эти годы произошло резкое возрастание степени интеграции и удешевление микросхем. Компьютер стал доступен отдельному человеку, и наступила эра персональных компьютеров. С точки зрения архитектуры персональные компьютеры ничем не отличались от класса миникомпьютеров типа PDP-11, но вот цена у них существенно отличалась. Если миникомпьютер дал возможность иметь собственную вычислительную машину отделу предприятия или университету, то персональный компьютер сделал это возможным для отдельного человека. Компьютеры стали широко использоваться неспециалистами, что потребовало разработки "дружественного" программного обеспечения, это положило конец кастовости программистов. На рынке операционных систем доминировали две системы: MS-DOS и UNIX. Однопрограммная однопользовательская ОС MS-DOS широко использовалась для компьютеров, построенных на базе микропроцессоров Intel 8088, а затем 80286, 80386 и 80486. Мультипрограммная многопользовательская ОС UNIX доминировала в среде "неинтеловских" компьютеров, особенно построенных на базе высокопроизводительных RISC-процессоров. В середине 80-х стали бурно развиваться сети персональных компьютеров, работающие под управлением сетевых или распределенных ОС. В сетевых ОС пользователи должны быть осведомлены о наличии других компьютеров и должны делать логический вход в другой компьютер, чтобы воспользоваться его ресурсами, преимущественно файлами. Каждая машина в сети выполняет свою собственную локальную операционную систему, отличающуюся от ОС автономного компьютера наличием дополнительных средств, позволяющих компьютеру работать в сети. Сетевая ОС не имеет фундаментальных отличий от ОС однопроцессорного компьютера. Она обязательно содержит программную поддержку для сетевых интерфейсных устройств (драйвер сетевого адаптера), а также средства для удаленного входа в другие компьютеры сети и средства доступа к удаленным файлам, однако эти дополнения существенно не меняют структуру самой операционной системы. ©2007 Google - Google Home - We're Hiring - Terms of Service - Privacy Policy - Discussion Group 4. Функциональные компоненты ОС Функциональные компоненты ОС автономного характера делятся на две группы: -управление ресурсами (процессы, память, ввод/вывод, файловая система); -общесистемные функции подсистемы пользовательского интерфейса; защита данных ОС выполняет процедуры логического входа, защиты от несанкционированного доступа; функции аудита (фиксируются все события, влияющие на безопасность); отказоустойчивость (за счёт резервирования). Q5 Требования, предъявляемые к современным ОС. Существует ряд требований, который сложился на протяжении эволюции компьютерных и операционных систем, а именно: высокое быстродействие гарантированная надёжность минимальный программный код прозрачность (в работе служебных программ) использование стандартных средств для связи с прикладными программами С течение времени, особенно в современном мире, к операционным системам требоавния возросли, стали жёстче и добавились новые: переносимость расширяемость совместимость 1)Переносимость: Необходимость возможности работы ОС на разных компьютерах. Большая часть кода должен быть написана на стандартизированном языке (к примеру, С). Для разрешения задачи о переносимости системы должно быть реализована независимость от платформы. Для изоляции процессора применяют аппаратно зависимые части кода должны быть локальны, минимальны и заменяемы. Для изоляции самой платформы – введение программного уровня изолирующих аппаратур. 2)Расширяемость: Система должна быть дополняемой и по необходимости обновляемой и расширяющейся. Для этого применятся модульно построение ОС, между модулями – жёсткий и известный интерфейс. Применяется также структурирование по принципу «Клиент-сервер», или микроядерной архитектуры. Использование средств вызова удалённых процедур и загружаемых драйверов устройств и объектов предоставления системных ресурсов. 3)Совместимость: Различают двоичную совместимость на уровне исходных кодов. Для решения задачи совместимости применяют: создание библиотек системных вызовов – множественные прикладные программные среды Эмуляцию 6.Классическая архитектура ОС. Любая сложная система должна иметь понятную и рациональную структуру, или делиться на модули, имеющие законченное функциональное назначение с четко оговоренными правилами взаимодействия. Ясное понимание каждого модуля существенно упрощает его понимание и развитие. Широкая функциональность ОС неизбежно приводит к сложности ее архитектуры, под которой понимают структурную организацию ОС на основе различных модулей. Обычно в состав ОС входят исполняемые модули и объектные модули стандартных для данной ОС форматов, библиотеки разных типов, программные модули специальных формата (например, загрузчик и драйверы), конфигурационные файлы, документация и т.д. Большинство современных ОС представляют собой хорошо структурированные модульные системы, способные к развитию, расширению и переносу на другие платформы. Какой либо единой архитектуры ОС не существует, но есть универсальные подходы к структурированию ОС. Ядро и вспомогательные модули В состав ядра входят функции решающие внутрисистемные задачи организации вычислительного процесса, такие как переключение контекстов, загрузка станиц, обработка прерываний. Эти функции недоступны для приложений. Другой задачей ядра является поддержка приложений, использую так называемую прикладную программную среду. Приложения могут обращаться к ядру с запросами - системными вызовами - для выполнения тех или иных действий. Функции ядра которые могут быть вызваны приложениями образуют интерфейс прикладного программирования -API. Функции которые выполняет ядро наиболее часто востребованы, поэтому скорость их выполнения определяет производительность системы в целом. Для обеспечения высокой скорости работы ОС все модули ядра или большая их часть находятся постоянно в памяти, то есть являются резидентными. Обычно ядро оформляется в виде программного модуля некоторого специального формата, отличающегося от формата пользовательских приложений. Остальные модули ОС выполняют полезные, но менее обязательные функции. Решение о принадлежности программы к ОС принимает производитель. Вспомогательные модули ОС обычно подразделяют на следующие группы: Утилиты - программы, решающие задачи управления и сопровождения компьютерной системы. Системные обрабатывающие программы -текстовые и графические редакторы, компиляторы и т.д. Программы предоставления пользователю дополнительных услуг- специальный вариант пользовательского интерфейса или игры. Библиотеки процедур различного назначения, упрощающие разработку приложений. Разделение ОС на ядро и модули обеспечивает легкую расширяемость. Дополнительные модули ОС обычно загружаются в оперативную память только на время выполнения, т.е. являются транзитивными. Важным свойством ОС основанной на ядре, является возможность защиты кодов и данных ОС за счет выполнения функций ядра в привилегированном режиме. Ядро Работает в привилегированном режиме, защищено от приложений пользователя Распределяет основные ресурсы системы Выполняет роль арбитра в споре приложений за ресурсы Аппаратура компьютера должна поддерживать как минимум два режима работы: Режим пользователя Режим супервизора ОС должна работать с исключительными полномочиями, для того чтобы играть роль арбитра в споре приложений за ресурсы компьютера в мультипрограммном режиме. Для обеспечения уровней привилегий, без поддержки аппаратуры - не обойтись. Аппаратура должна поддерживать как минимум для режима - пользовательский и привилегированный режим. 7.Микроядерная архитектура ОС Микроядерная архитектура является альтернативой классическому способу построения ОС. Под классической архитектурой понимается рассмотренная выше структурная организация ОС, в соответствии с которой все основные функции ОС, составляющие многослойное ядро, выполняются в привилегированном режиме. При этом некоторые вспомогательные функции ОС оформляются в виде приложений, выполняющихся в пользовательском режиме. Каждое приложение пользовательского режима работает в собственном адресном пространстве и защищено от вмешательства. Код ядра имеет доступ ко всей памяти, но сам полностью защищен. Приложения обращаются к ядру с запросами на выполнение системных функций. Суть микроядерной архитектуры - в привилегированном режиме остается работать только очень небольшая часть ОС, называемая микроядром. Микроядро защищено от остальных частей ОС и приложений. В состав микроядра обычно входят машинно-зависимые модули, в также модули, выполняющие базовые функции ядра по управлению процессами, обработке прерываний, управлению виртуальной памятью, пересылке сообщений и управлению устройствами в/в. Данные функции очень трудно выполнить в пользовательском пространстве. Все остальные функции ядра оформляются в виде приложений, работающих в пользовательском режиме. Работающие в пользовательском режиме менеджеры имеют принципиальные отличия от традиционных утилит. Утилиты вызываются в основном пользователями, а для микроядерной архитектуры менеджеры вытесненные в пользовательский режим нужны часто для работы других приложений, поэтому они называются серверами ОС. Для микроядерной архитектуры необходимо наличие в ОС удобного эффективного способа вызова процедур одного процесса из другого. Поддержка такого механизма и является одной из главных задач миктоядра. Преимущества и недостатки микроядерной архитектуры Достоинства: Переносимость Расширяемость Надежность Поддержка распределенности Недостатки: Снижение производительности ОС, основанные на концепции микроядра, в высокой степени удовлетворяют большинству требований, предъявляемых к современным ОС, обладая переносимостью, расширяемостью, надежностью и создавая хорошие предпосылки для поддержки распределенных приложений. За данные достоинства приходится платить снижением производительности, и это основной недостаток. Высокая степень переносимости обусловлена тем, что весь машинно-зависимый код изолирован в микроядре. Расширяемость присуща микроядерной ОС в очень высокой степени. В традиционных системах сложно удалить один слой и поменять его на другой по причине множественности и размытости интерфейсов между слоями. Обычно традиционные ОС позволяют динамически добавлять в ядро или удалять только драйвера устройств. При микроядерном подходе конфигурировать ОС не вызывает никаких проблем и не требует особых мер - достаточно изменить файл с начальной конфигурации системы или остановить ненужные серверы. Использование микроядра повышает надежность ОС. Каждый сервер выполняется в виде отдельного процесса в своей собственной области памяти и таким образом защищен от других серверов. Если отдельный сервер терпит крах, то он может быть просто перезапущен. И кроме того небольшой размер ядра позволяет снизить вероятность возникновения ошибок. Модель с микроядром хорошо подходит для реализации распределенных вычислений, так как использует механизмы, аналогичные сетевым: взаимодействие клиентов и серверов путем обмена сообщениями. Серверы микроядерной архитектуры могут работать как на одном так и на разных системах. Производительность. При классической организации ОС выполнение системного вызова сопровождается двумя переключениями режимов, а при микроядерной - четыре. При прочих равных условиях классическая модель будет всегда быстрее чем микроядерная. 8.Многослойная модель ядра. Средства аппаратной поддержки ОС непосредственно участвуют в организации вычислительной системы (поддержка системы прерываний и т.п.) машинно-зависимые модули – программные модули, в которых отражается специфика аппаратной платформы и особенности работы с ней. В идеале, этот слой должен полностью экранировать вышестоящие слои от особенностей машинной (аппаратурной) реализации системы. Базовые механизмы ядра – наиболее примитивные и основные операции ядра – уровень диспетчеризации. Менеджеры ресурсов – состоят из мощных функций, реализующих стратегические задачи по управлению ресурсами. Интерфейсы программных вызовов – взаимодействие с приложениями и утилитами представляет собой набор API-функций. Характеристики многослойного подхода: Универсальность Каждый слой обслуживает вышележащий Достоинства: Упрощается разработка Наращиваемость Вычислительную систему, работающую под управлением ОС на основе ядра, можно рассматривать как систему, из трех иерархически расположенных слоев: нижний слой образует аппаратура, промежуточный - ядро, а утилиты составляют верхний слой. При такой организации приложения не могут напрямую взаимодействовать с аппаратурой, а только через слой ядра. Хотя такой структурный подход на практике обычно работал неплохо, сегодня он все больше воспринимается монолитным. В системах, имеющих многоуровневую структуру было нелегко удалить один слой и заменить его другим в силу множественности и размытости интерфейсов между слоями. Добавление новых функций и изменение существующих требовало хорошего знания операционной системы и массы времени. Когда стало ясно, что операционные системы живут долго и должны иметь возможности развития и расширения, монолитный подход стал давать трещину, и на смену ему пришла модель клиент-сервер и тесно связанная с ней концепция микроядра. 9.ОС пакетной обработки информации. Системы пакетной обработки предназначались в основном для решения задач вычислительного характера, не требующих быстрого получения результатов. Главным критерием эффективности систем пакетной обработки является максимальная пропускная способность, то есть решение максимального числа задач в единицу времени. Для достижения этой цели используется следующая схема: сначала формируется пакет заданий, каждое задание содержит требования к системным ресурсам; из этого пакета формируется мультипрограммная смесь. Для одновременного выполнения выбираются задачи, предъявляющие разные требования к ресурсам, так чтобы обеспечить сбалансированную загрузку всех устройств вычислительной машины. Таким образом, выбор нового задания осуществляется на основании текущего состояния системы, то есть выбирается выгодное задание. Следовательно, в вычислительных системах, работающих под управлением пакетных ОС, невозможно гарантировать выполнение того или иного задания в течение определенного времени. Если посмотреть на совмещение во времени операций в/в и вычислений, то можно представить себе несколько различных способов. Один их них характерен для систем с выделенным процессором в/в. В мэйнфреймах процессоры ввода-вывода называются каналами. Обычно канал имеет систему команд, отличающуюся от системы команд центрального процессора. Эти команды специально предназначены для управления внешними устройствами. Канальные программы могут храниться в той же оперативной памяти, что и программы центрального процессора. В системе команд центрального процессора предусмотрена специальная инструкция, с помощью которой каналу передаются параметры и указания на то, какую программу ввода-вывода он должен выполнить. Начиная с этого момента центральный процессор и канал могут работать параллельно. Другой способ совмещения вычислений с операциями в/в реализуется в компьютерах, в которых внешние управляются контроллерами. Каждое внешнее устройство имеет свой контроллер, который автономно отрабатывает команды, поступающие от центрального процессора. При этом контроллер и процессор работают асинхронно. Контроллеры выполняют свои команды медленнее чем процессор -свои. Это обстоятельство используется для реализации параллельного вычисления и операций в/в: в промежутке между передачей команд контроллеру центральный процессор может выполнять вычисления. (более короткий вариант) Системы пакетной обработки предназначались для решения задач в основном вычислительного характера, не требующих быстрого получения результатов. Главной целью и критерием эффективности систем пакетной обработки является максимальная пропускная способность, то есть решение максимального числа задач в единицу времени. в начале работы формируется пакет заданий, каждое задание содержит требование к системным ресурсам; из этого пакета заданий формируется множество одновременно выполняемых задач. Для одновременного выполнения выбираются задачи, предъявляющие отличающиеся требования к ресурсам, так, чтобы обеспечивалась сбалансированная загрузка всех устройств вычислительной машины, то есть выбирается "выгодное" для ОС задание. В таких ОС невозможно гарантировать выполнение того или иного задания в течение определенного периода времени. В системах пакетной обработки переключение процессора одной задачи на другую происходит только в случае, если активная задача сама отказывается от процессора по каким-либо причинамю Потому одна задача может надолго занять процессор, что делает невозможным выполнение интерактивных задач. Взаимодействие пользователя с вычислительной машиной: пользователь приносит задание, отдает его диспетчеру-оператору, а в конце дня после выполнения всего пакета заданий получает результат. Очевидно, что такой порядок снижает эффективность работы пользователя. 10.ОС разделения времени. Пользователь интерактивно работает сразу с несколькими приложениями Принудительная приостановка приложений, и выделение кванта времени другому приложению Пропускная способность меньше, чем у систем пакетной обработки Дополнительные накладные расходы на переключение контекстов Более эффективное использование ресурсов системы Повышение удобства и эффективности работы пользователя является целью другого способа мультипрограммирования - разделения времени. В данном случае каждое приложение должно регулярно получать возможность общения с пользователем. ОС принудительно периодически приостанавливает выполнение одного приложения и выполняет другое. Системы разделения времени призваны исправить основной недостаток систем пакетной обработки - изолированность пользователя от процесса выполнения его задач. Так как в системах разделения времени каждому приложению выделяется только квант процессорного времени, ни одно приложение не использует процессор надолго и время ответа оказывается приемлемым. Если выбран квант времени очень небольшим, то у всех пользователей складывается впечатление, что каждый их них единолично использует систему. Ясно что пропускная способность ниже, чем у систем пакетной обработки, так как на выполнение принимается каждая запущенная пользователем задача, а не та которая выгодна системе. Кроме того производительность системы снижается из-за дополнительных накладных расходов связанных с переключением контекста. 11.ОС реального времени. Фиксированный набор заранее разработанных программ Переключение между задачами основано на расписании плановых работ Пропускная способность не главное Основной критерий реактивность или время реакции системы Проектируется с учетом запаса Еще одна разновидность мультипрограммирования используется в системах реального времени, предназначенных для управления от компьютера различными техническими объектами или технологическими процессами. В обоих случаях существует предельно допустимое время в течении которого должна быть выполнена та или иная управляющая объектом программа. Иначе произойдет авария. Таким образом, критерием эффективности здесь является способность получения результата в заданные интервалы времени. Интервал времени между запуском программы и получением результата называется временем реакции системы, а соответствующее свойство реактивностью. В системах реального времени мультипрограммная смесь представляет собой фиксированный набор заранее заданных программ, а выбор на выполнение осуществляется по прерываниям или в соответствии с расписанием плановых работ. Способность аппаратуры компьютера и ОС к быстрому ответу зависит в основном от скорости переключения между задачами. Если при возникновения прерывания процессор должен опросить сотни потенциальных источников, то реакция системы будет слишком медленной. В системах реального времени не стремятся максимально загружать все устройства, наоборот, при проектировании программного управляющего комплекса обычно закладывается некоторый запас вычислительной мощности на случай пиковой нагрузки. 12.Процессы и потоки, планирование и диспетчеризация, состояния потока. Процесс (или по-другому, задача) - абстракция, описывающая выполняющуюся программу. Планирование процессов и потоков Подсистема управления процессами и потоками в ОС ответственна за обеспечение процессов необходимыми ресурсами ОС использует специальные информационные структуры, для хранения информации о том какие ресурсы выделены каждому процессу Понятие процесс (задача) и поток (нить) Понятие синхронизации потоков Управление процессами Важнейшей частью операционной системы, непосредственно влияющей на функционирование вычислительной машины, является подсистема управления процессами. Процесс (или по-другому, задача) -абстракция, описывающая выполняющуюся программу. Для операционной системы процесс представляет собой единицу работы, заявку на потребление системных ресурсов. Подсистема управления процессами планирует выполнение процессов, то есть распределяет процессорное время между несколькими одновременно существующими в системе процессами, а также занимается созданием и уничтожением процессов, обеспечивает процессы необходимыми системными ресурсами, поддерживает взаимодействие между процессами. Создание процессов и потоков Создать процесс - это прежде всего создать описатель процесса, который необходим ОС для управления им (например: идентификатор процесса, степень привилегированности) Примеры описателей процесса: Блок управления задачей (ТСВ) в OS/360 Управляющий блок процесса (РСВ) в OS/2 Дескриптор процесса в UNIX Объект-процесс в Windows Создание процесса включает загрузку кодов и данных в оперативную память В многопоточной системе при создании процесса ОС создает поток Поток-потомок Планирование и диспетчеризация потоков Планирование - это работа по определению того, в какой момент прервать выполнение одного потока и какому потоку предоставить возможность выполняться Задачи планирования: Определение момента времени для смены текущего активного потока Выбор для выполнения потока из очереди готовых потоков Диспетчеризация - это реализация решения, найденного в результате планирования Задачи диспетчеризации: Сохранение контекста текущего потока Загрузка контекста нового потока Запуск нового потока на выполнение Контекст потока можно разделить на общую часть для всех потоков данного процесса и часть, относящуюся только к данному потоку Иерархия контекстов ускоряет переключение потоков Управление процессами Важнейшей частью операционной системы, непосредственно влияющей на функционирование вычислительной машины, является подсистема управления процессами. Состояние потоков ВЫПОЛНЕНИЕ - активное состояние потоков, во время которого поток обладает всеми необходимыми ресурсами и непосредственно выполняется процессором; ОЖИДАНИЕ - пассивное состояние потока, процесс заблокирован, он не может выполняться по своим внутренним причинам, он ждет осуществления некоторого события, например, завершения операции ввода-вывода, получения сообщения от другого потока, освобождения какого-либо необходимого ему ресурса; ГОТОВНОСТЬ - также пассивное состояние потока, но в этом случае процесс заблокирован в связи с внешними по отношению к нему обстоятельствами: поток имеет все требуемые для него ресурсы, он готов выполняться, однако процессор занят выполнением другого потока. В ходе жизненного цикла каждый процесс переходит из одного состояния в другое в соответствии с алгоритмом планирования процессов, реализуемым в данной операционной системе. В состоянии ВЫПОЛНЕНИЕ в однопроцессорной системе может находиться только один процесс, а в каждом из состояний ОЖИДАНИЕ и ГОТОВНОСТЬ - несколько процессов, эти процессы образуют очереди соответственно ожидающих и готовых процессов. Жизненный цикл процесса начинается с состояния ГОТОВНОСТЬ, когда процесс готов к выполнению и ждет своей очереди. При активизации процесс переходит в состояние ВЫПОЛНЕНИЕ и находится в нем до тех пор, пока либо он сам освободит процессор, перейдя в состояние ОЖИДАНИЯ какого-нибудь события, либо будет насильно "вытеснен" из процессора, например, вследствие исчерпания отведенного данному процессу кванта процессорного времени. В последнем случае процесс возвращается в состояние ГОТОВНОСТЬ. В это же состояние процесс переходит из состояния ОЖИДАНИЕ, после того, как ожидаемое событие произойдет. 13.Алгоритм планирования, основанный на квантовании. В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если: роцесс завершился и покинул систему, роизошла ошибка, процесс перешел в состояние ОЖИДАНИЕ, исчерпан квант процессорного времени, отведенный данному процессу. Поток, который исчерпал свой квант, переводится в состояние готовности и ожидает, когда ему будет предоставлен новый квант процессорного времени, а на выполнение в соответствии с определенным правилом выбирается новый поток из очереди готовых. Кванты, выделяемые потокам, могут быть одинаковыми для всех потоков или различными. Q14 Приоритетное планирование Два основных способа планирования - планирование, основанное на квантовании и приоритетное планирование. Приоритетное планированеи использует приоритет процесса - число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени: чем выше приоритет, тем выше привилегии. Существует две разновидности приоритетных алгоритмов: алгоритмы, использующие относительные приоритеты, и алгоритмы, использующие абсолютные приоритеты. В обоих случаях выбор процесса на выполнение из очереди готовых осуществляется одинаково: выбирается процесс, имеющий наивысший приоритет. По разному решается проблема определения момента смены активного процесса. В системах с относительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор, перейдя в состояние ОЖИДАНИЕ (или же произойдет ошибка, или процесс завершится). В системах с абсолютными приоритетами выполнение активного процесса прерывается еще при одном условии: если в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный процесс переходит в состояние готовности. Q15 Алгоритмы планирования ОС пакетной обработки Первым пришел - первым обслужен Алгоритм без переключений "первым пришел - первым обслужен" является самым простым из алгоритмов планирования. Процессам предоставляется доступ к процессору в том порядке, в котором они его запрашивают. Чаще всего формируется единая очередь ждущих процессов. Как только появляется первая задача, она немедленно запускается и работает столько, сколько необходимо. Остальные задачи ставятся в конец очереди. Когда текущий процесс блокируется, запускается следующий в очереди, а когда блокировка снимается, процесс попадает в конец очереди. Основное преимущество алгоритма - легкость понимания и программирования. В этом алгоритме все процессы в состоянии готовности контролируются одним связным списком. Чтобы выбрать процесс для запуска, нужно всего лишь взять первый элемент списка и удалить его. Появление нового процесса приводит к помещению его в конец списка. Кратчайшая задача - первая Если в очереди есть несколько одинаково важных задач, планировщик выбирает первой самую короткую задачу. Пусть у нас есть четыре задачи: A, B, C и D, со временем выполнения 8, 4, 4 и 4 мин соответственно. Если мы запустим их в данном порядке, оборотное время задачи А будет 8 мин, В - 12 мин, С - 16 мин, D - 20 мин, и среднее время будет равно 14 мин. Запустим задачи в другом порядке : B, C, D, A, со временем выполнения 4, 4, 4 и 8 мин соответственно. Теперь значения оборотного времени составляют 4, 8, 12 и 20 соответственно, а среднее время равно 11 мин. Алгоритм оптимизирует задачу. Рассмотрим четыре процесса со временем выполнения a, b, c и d. Первая задача выполняется за время а, вторая - за время a+b и т.д. Среднее оборотное время будет равно (4a+3b+2c+d)/4. Очевидно, что вклад времени а в среднее больше, чем всех остальных интервалов времени, поэтому первой должна выполняться самая короткая задача, а последней - самая длинная, вносящая вклад, равный собственному оборотному времени. Следует отметить, что эта схема работает лишь в случае одновременного наличия задач. В качестве контрпримера можно рассмотреть 5 задач, A, B, C, D и E, причем первые две доступны сразу же, а три оставшиеся - еще через 3 минуты. Время выполнения этих задач составляет 2, 4, 1, 1 и 1 мин соответственно. Вначале можно выбрать только А и В, поскольку остальные недоступны. Если руководствоваться алгоритмом "Кратчайшая задача - первая", задачи будут запущены в следующем порядке: A, B, C, D, E, и среднее оборотное время составит 4,6 мин. Если же запустить их в порядке B, C, D, E, A, то среднее оборотное время составит 4,4 мин. Наименьшее оставшееся время выполнения Версией предыдущего алгоритма с переключениями является алгоритм наименьшего оставшегося времени выполнения. В соответствии с этим алгоритмом планировщик каждый раз выбирает процесс с наименьшим оставшимся временем выполнения. В этом случае также необходимо заранее знать время выполнения задач. Когда поступает новая задача, ее полное время выполнения сравнивается с оставшимся временем выполнения текущей задачи. Если время выполнения новой задачи меньше, текущий процесс приостанавливается и управление передается новой задаче. Эта схема позволяет быстро обслуживать короткие запросы. 16. Алгоритмы планирования в интерактивных ОС интерактивные системы ориентированы на максимальное удобство пользователя. В этих системах невозможно трёхуровневое планирование, однако двухуровневое широкок используется. Циклическое планирование наиболее старый, простой и справедливый алгоритм. каждому процессу (предполагается, что процессы равнозначны) предоставляется промежуток времени работы процессора квант времени. если к концу кванта процесс всё ещё работает, то этот процесс прерывается и процессор обрабатывает уже другой, следующий процесс. Если процесс прекращает работу раньше срока истечения кванат, то происходит перход управления в этот момент. Планировщик только поддерживает список процессов. Исчерпавшие лимит, обработанные процессы помещаются в коенц списка процессов. Вадный вопрос - длина кванат - при малой длине кваната высоки потери на переключение, при большой заторможенность реакции на быстрые запросы. 20-50 мс- оптимальное значение кванта. Приоритетное планирование В основе - неравнозначность процессов. Каждому процессуприсваивается приоритет, передача управления - процессу с наивысшим приоритетом. Для предотвращения зацикливания и постоянной обрабокт процессов планировщик может уменьшать приоритеты процессов во время выполенния. Также имеется выделение квантов времени определённых временныъх интервалов, по окончаниикоторого точно проихойдёт передача управления. система может динамически задавать приоритеты для достижения своих целей (поддрежка аппатарной части, требующих мгновенно квант процессорного времени и т.п.) Возможноа группировка процессов по приоритетам. Гарантированное планирование Если в системе одновременно работаю k пользователей, то одному будет предоставлено (1/k) процессорного времени, а в системе с одним пользователем запущено n процессов, то каждому процессу достнется (1/n) процессорного времени. система самас ледит за количестволм процессов и отследивает промежутки процессорного времени, выделяфемого каждому из процессов (или пользователей) Лотерейное планирование Достойная идея, но труднореализуемая. Система распределяет "лотерейные билеты" между процессами, и "выигрывший" процесс получает 20 мс процессорного времни. В этом принципе возможна приоритетность - раздача нескольких билетов "выжным" процессам. Притом каждый процессс получает ресурсов примерно равные проценту имеющихся у него лотерейных билетов. Процесссы могут передавать сови лотерейные билеты (клиент-сервер - клиент прервался, жёдт сервера, клиент отдаёт свои билеты серверному процессу). Данное планировае удобно при меняющихся неравнозначных по заруженности процессах. (Видеосервер с несколькими потоками разного битрейта, особенно переменного) Справедливое планирование Во внимание берётся тот, кто запускает процесс. Если один пользователь создал 9 процессов, а параллельный ему второй - 1, то при таком планировании система распределит время процессора между пользователями попаам, в то время как другие виды планирования отали большинство процессорного времние первому пользователю. Данное планирование отведёт ровно 50% процессорного времени одному из дву пользоватлей, независимо от того, как он будет использовать эти 50%. Q17 Планирование в ОС реального времени В системах реального времени существенную роль играет время. Чаще всего одно или несколько внешних физических устройств генерируют входные сигналы, и компьютер должен адекватно на них реагировать в течение заданного промежутка времени. Системы реального времени делятся на жесткие системы реального времени, что означает наличие жестких сроков для каждой задачи ( в них надо укладываться), и гибкие системы реального времени, в которых нарушения временного графика нежелательны, но допустимы. В обоих случаях реализуется разделение программы на несколько процессов, каждый из которых предсказуем. Эти процессы чаще всего бывают короткими и завершают свою работу в течение секунды. Когда появляется внешний сигнал, именно планировщик должен обеспечить соблюдение графика. Внешние события, на которые система должна реагировать, можно разделить на периодические ( возникающие через регулярные интервалы времени) и непериодические ( возникающие непредсказуемо). Возможно наличие нескольких периодических потоков событий, которые система должна обрабатывать. В зависимости от времени, затраченного на обработку каждого из событий, может оказаться, что система не в состоянии своевременно обработать все события. Если в систему поступает m периодических событий, событие с номером i поступает с периодом Pi, и на его обработку уходит Ci секунд работы процессора, все потоки могут быть своевременно обработаны только при выполнении условия ((сумма Сi)/(сумма Pi) меньше или равно 1). Системы реального времени, удовлетворяющие этому условию, называются поддающимися планированию или планируемыми. В качестве примера рассмотрим гибкую систему реального времени с тремя периодическими сигналами с периодами в 100, 200 и 500 мс соответственно. Если на обработку этих сигналов уходит 50, 30 и 100 мс соответственно, система является поддающейся планированию, поскольку 0,5+0,15+0,2<1. Даже при добавлении четвертого сигнала с периодом в 1 с системой все равно можно будет управлять при помощи планирования, пока время обработки сигнала не будет превышать 150 мс. В этих расчетах существенным является предположение, что время переключения между процессами пренебрежимо мало. Алгоритмы планирования для систем реального времени могут быть как статическими, так и динамическими. В первом случае все решения планирования принимаются заранее, еще до запуска системы. Во втором случае решения планирования принимаются по ходу дела. Статическое планирование применимо только при наличии достоверной информации о работе, которую необходимо выполнить, и о временном графике, которого нужно придерживаться. Динамическое планирование не нуждается в подобных ограничениях. 18. Синхронизация процессов и потоков: цели и средства синхронизации. Процессам часто нужно взаимодействовать друг с другом, например, один процесс может передавать данные другому процессу, или несколько процессов могут обрабатывать данные из общего файла. Во всех этих случаях возникает проблема синхронизации процессов, которая может решаться приостановкой и активизацией процессов, организацией очередей, блокированием и освобождением ресурсов. Задача межпроцессного взаимодействия: Передача инфы между процессам Контроль над деятельностью процессов Согласование действий процессов Пренебрежение вопросами синхронизации процессов, выполняющихся в режиме мультипрограммирования, может привести к их неправильной работе или даже к краху системы. Синхронизация нужна для того, чтобы избежать: Гонок (или взаимных состязаний) - возникают когда 2 или более процессов обрабатывают разделяемые данные и конечный результат зависит от соотношения скоростей потоков. Тупиков (взаимных блокировок, клинчей) - возникает когда два взаимосвязанных процесса блокируют друг друга при обращении к критической области. Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением. Способы обеспечивания взаимного исключения: Позволить процессу, находящемуся в критической секции, запрещать все прерывания. Однако этот способ непригоден, так как опасно доверять управление системой пользовательскому процессу; он может надолго занять процессор, а при крахе процесса в критической области крах потерпит вся система, потому что прерывания никогда не будут разрешены. Блокирующие переменные. С каждым разделяемым ресурсом связывается двоичная переменная, которая принимает значение 1, если ресурс свободен (то есть ни один процесс не находится в данный момент в критической секции, связанной с данным процессом), и значение 0, если ресурс занят. Операция проверки и установки блокирующей переменной должна быть неделимой, для этого используются команды "проверка-установка" типа BTC, BTR и тп, или их програмные аналоги. Аппарат событий. С помощью этого средства могут решаться не только проблемы взаимного исключения, но и более общие задачи синхронизации процессов. В разных операционных системах аппарат событий реализуется по своему, но в любом случае используются системные функции аналогичного назначения, которые условно назовем WAIT(x) и POST(x), где x - идентификатор некоторого события. Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(D), здесь D обозначает событие, заключающееся в освобождении ресурса D. Функция WAIT(D) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события D. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет системную функцию POST(D), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события D, в состояние ГОТОВНОСТЬ. Семафоры. Считающим семафором называют целочисленную переменную, выполняющую те же функции, что и блокирующая переменная. Однако в отличие от последнего она может принимать кроме "0" и "1" и другие целые положительные значения. (Более подробно в вопросе про семафоры) Мониторы ? 19. Ситуация состязаний (гонки). Способы предотвращения. Ситуации, когда два или более процессов обрабатывают разделяемые данные, и конечный результат зависит от соотношения скоростей процессов, называются гонками. Рис. 2.3. Рассмотрим, например (рисунок 2.3), программу печати файлов (принт-сервер). Эта программа печатает по очереди все файлы, имена которых последовательно в порядке поступления записывают в специальный общедоступный файл "заказов" другие программы. Особая переменная NEXT, также доступная всем процессам-клиентам, содержит номер первой свободной для записи имени файла позиции файла "заказов". Процессы-клиенты читают эту переменную, записывают в соответствующую позицию файла "заказов" имя своего файла и наращивают значение NEXT на единицу. Предположим, что в некоторый момент процесс R решил распечатать свой файл, для этого он прочитал значение переменной NEXT, значение которой для определенности предположим равным 4. Процесс запомнил это значение, но поместить имя файла не успел, так как его выполнение было прервано (например, в следствие исчерпания кванта). Очередной процесс S, желающий распечатать файл, прочитал то же самое значение переменной NEXT, поместил в четвертую позицию имя своего файла и нарастил значение переменной на единицу. Когда в очередной раз управление будет передано процессу R, то он, продолжая свое выполнение, в полном соответствии со значением текущей свободной позиции, полученным во время предыдущей итерации, запишет имя файла также в позицию 4, поверх имени файла процесса S. Таким образом, процесс S никогда не увидит свой файл распечатанным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением. Способы опеспечения взаимного исключения: Позволить процессу, находящемуся в критической секции, запрещать все прерывания. Блокирующие переменные. Аппарат событий. Семафоры. (способы расписаны в 18-м вопросе, про синхронизацию) 20. Семафоры Дийкстры. В 1968 г. Э. Дейкстра предложил удобную форму механизма захвата/освобождения ресурсов, которую он назвал операциями P и V над считающими семафорами. Считающим семафором называют целочисленную переменную, выполняющую те же функции, что и байт блокировки. Однако в отличие от последнего она может принимать кроме "0" и "1" и другие целые положительные значения. Семафоры – это часть абстракции, поддерживающая очередь постоянно ожидающих процессов. Операции P и V над семафором S могут быть определены следующим образом. P(S): 1. Уменьшить значение S на 1, т. е. S : = S – 1. 2. Если S < 0, выполнить ОЖИДАНИЕ (S). V(S): 1. Увеличить значение S на 1, т. е. S : = S + 1. 2. Если S ³ 0, выполнить ОПОВЕЩЕНИЕ (S). Операция ОЖИДАНИЕ (S) (WAIT) блокирует обслуживание процесса, делает соответствующую отметку об этом и связывает процесс со значением переменной S. Операция ОПОВЕЩЕНИЕ (S) (SIGNAL) просматривает связанный с переменной S список блокированных процессов. Если в списке есть процессы, ожидающие освобождения некоторого ресурса, управляемого (сигнализируемого) S, один из них переводится в состояние готовности, а в соответствующей ему записи делается отметка. С этого момента процесс становится опять доступным планировщику. По определению, ожидание, связанное с операцией P(S), не является ожиданием "зависания", так как ожидающие процессы не используют центральный процессор. Так как несколько процессов могут ожидать операцию P(S) над отдельным семафором, во время приращения должен быть осуществлен выбор, какую контрольную точку процесса сделать доступной. Алгоритм выбора не определен, за исключением требования равнодоступности процессов, т. е. никакой процесс не может быть "забыт". Типичным примером использования алгоритма семафоров является задача производитель/потребитель. Задается максимальная емкость хранилища. Производитель не должен переполнять его, а потребитель не должен пытаться брать продукцию из пустого хранилища. Наиболее употребительные операции над семафорами: · создать семафор; · запросить состояние семафора; · изменить состояние семафора; · уничтожить семафор. Операции над семафорами в силу своей неделимости позволяют блокировать или активизировать процессы при освобождении или запросах ресурсов любого типа (памяти, процессоров, устройств ввода-вывода и т. п.). 21. Взаимные блокировки. Условия, необходимые для возникновения тупика. Наряду с проблемой рационального распределения ресурсов между процессами существует также проблема синхронизации протекания параллельных процессов и исключение возникновения тупиков в вычислительной системе. Процесс в мультипрограммной системе находится в состоянии тупика (дедлока, клинча), если он ожидает некоторого события, которое никогда не произойдет. Системная тупиковая ситуация, или ситуация “зависания” системы - это ситуация, когда один или более процессов оказываются в состоянии тупика. В операционных системах тупики возникают в большинстве случаев как результат конкуренции процессов за обладание монопольно используемыми ресурсами. В проблеме тупиков выделяют следующие четыре основных направления: предотвращение тупиков; обход тупиков; обнаружение тупиков; восстановление после тупиков. Cформулированы следующие четыре необходимых условия наличия тупика: процессы требуют предоставления им монопольного права управления ресурсами, которые им выделяются (условие взаимоисключения); процессы удерживают за собой ресурсы, уже выделенные им, ожидая в то же время выделения дополнительных ресурсов (условие ожидания ресурсов); ресурсы нельзя отобрать у процессов, удерживающих их, эти ресурсы не будут использованы для завершения работы (условие неперераспределяемости); существует кольцевая связь процессов, в которой каждый процесс удерживает за собой один или более ресурсов, требующихся следующему процессу цепи (условие кругового ожидания). При предотвращении тупиков целью является обеспечение условий, исключающих возможность возникновения тупиковых ситуаций. Такой подход является вполне корректным решением о том, что касается самого тупика, однако он часто приводит к нерациональному использованию ресурсов. Обход тупиков заключается в том, чтобы можно было предусматривать менее жесткие ограничения, чем в случае предотвращения тупиков, и тем самым обеспечить лучшее использование ресурсов. При наличии средств обхода тупиков не требуется такой реализации системы, при которой опасность тупиковых ситуаций даже не возникает. Методы обхода учитывают подобную возможность, однако в случае увеличения вероятности возникновения тупиковой ситуации здесь принимаются меры по аккуратному обходу тупика. Методы обнаружения тупиков применяются в системах, которые допускают возможность возникновения тупиковой ситуации как следствие умышленных или неумышленных действий программистов. Целью средств обнаружения тупиков является установить сам факт возникновения тупиковой ситуации и точно определить те процессы и ресурсы, которые оказались вовлеченными в эту тупиковую ситуацию. Методы восстановления после тупиков применяются для устранения тупиковых ситуаций с тем, чтобы система могла продолжать работать, а процессы, попавшие в тупиковую ситуацию, могли завершиться с освобождением занимаемых ими ресурсов. 22. Обнаружение взаимоблокировки при наличии одного ресурса каждого типа. Под одним ресурсом каждого типа, подразумевается один принтер, один сканер и один плоттер и т.д. Рассмотрим систему из 7-ми процессов и 6-ти ресурсов. Визуально хорошо видна взаимоблокировка, но нам нужно чтобы ОС сама определяла взаимоблокировку. Для этого нужен алгоритм. Рассмотрим один из алгоритмов. Для каждого узла N в графе выполняется пять шагов. 1Задаются начальные условия: L-пустой список, все ребра не маркированы. 2Текущий узел добавляем вконец списка L и проверяем количество появления узла в списке. Если он встречается два раза, значит цикл и взаимоблокировка. 3Для заданного узла смотрим, выходит ли из него хотя бы одно немаркированное ребро. Если да, то переходим к шагу 4, если нет, то переходим к шагу 5. 4Выбираем новое немаркированное исходящее ребро и маркируем его. И переходим по нему к новому узлу и возвращаемся к шагу 3. 5Зашли в тупик. Удаляем последний узел из списка и возвращаемся к предыдущему узлу. Возвращаемся к шагу 3. Если это первоначальный узел, значит, циклов нет, и алгоритм завершается. Для нашего случая тупик обнаруживается в списке L=[B,T,E,V,G,U,D,T] 23. Обнаружение взаимоблокировок при наличии нескольких ресурсов каждого типа. Рассмотрим систему. m - число классов ресурсов (например: принтеры это один класс) n - количество процессов P(n) - процессы E - вектор существующих ресурсов E(i) - количество ресурсов класса i A - вектор доступных (свободных) ресурсов A(i) - количество доступных ресурсов класса i С - матрица текущего распределения (какому процессу, какие ресурсы принадлежат) R - матрица запросов (какой процесс, какой ресурс запросил) C(ij) - количество экземпляров ресурса j, которое занимает процесс P(i). R(ij) - количество экземпляров ресурса j, которое хочет получить процесс P(i). Общее количество ресурсов равно сумме занятых и свободных ресурсов Рассмотрим алгоритм поиска тупиков. Если остаются не маркированные процессы, значит, есть тупик. Рассмотрим работу алгоритма на реальном примере. Если остаются не маркированные процессы, значит, есть тупик. Рассмотрим работу алгоритма на реальном примере. Используем алгоритм: 1Третий процесс может получить желаемые ресурсы, т.к. R (2 1 0 0) = A (2 1 0 0) 2Третий процесс освобождает ресурсы. Прибавляем их к A. А = (2 1 0 0) + (0 1 2 0) =(2 2 2 0). Маркируем процесс. 3Может выполняться процесс 2. По окончании А=(4 2 2 1). 4Теперь может работать первый процесс. Тупиков не обнаружено. Если рассмотреть пример, когда второму процессу требуются ресурсы (1 0 3 0), то два процесса окажутся в тупике. Когда можно искать тупики: Когда запрашивается очередной ресурс (очень загружает систему) Через какой то промежуток времени (в интерактивных системах пользователь это ощутит) Когда загрузка процессора слишком велика 24. Предотвращение взаимоблокировок. Алгоритм банкира для одного вида ресурсов. "Банкира", потому что аналогия такая, клиенты-процессы, кредиты-ресурсы. Рассмотрим систему: банкир может дать 10 кредитов (ресурсы), к нему попеременно обращаются четыре клиента. Алгоритм банкира: Банкиру поступает запрос от клиента на получение кредита Банкир проверяет, приводит ли этот запрос к небезопасному состоянию. Банкир в зависимости от этого дает или отказывает в кредите. 25. Предотвращение взаимоблокировок. Алгоритм банкира для нескольких видов ресурсов. Рассмотрим систему: Вектора: E=(6342) - существующие ресурсы P=(5322) - занятые ресурсы A=(1020) - доступные ресурсы Алгоритм поиска безопасного или небезопасного состояния: Если состояние безопасное то ресурс дать можно, если нет то нельзя. 26. Синхронизирующие объекты ОС: системные семафоры, мьютексы, события, сигналы. В случае синхронизации потоков разных процессов операционная система должна предоставлять потокам системные объекты синхронизации, которые были бы видны для всех потоков, даже если они принадлежат разным процессам и работают в разных адресных пространствах. Примерами таких синхронизирующих объектов ОС являются: системные семафоры мьютексы события таймеры и другие. Чтобы процессы могли разделять синхронизирующие объекты, в разных ОС используются разные методы возврат указателя на объект, доступного всем родственным процессам, наследующим характеристики общего родительского процесса. Указание в запросах на создание объектов синхронизации имен, которые должны быть им присвоены. Далее эти имена используются разными процессами для манипуляций объектами синхронизации. В таком, случае работа с синхронизирующими объектами подобна работе с файлами (создавать, открывать, закрывать, уничтожать). Все синхронизирующие объекты могут находиться в двух состояниях: сигнальном несигнальном (свободном). Для каждого объекта смысл, вкладываемый в понятие «сигнальное состояние», зависит от типа объекта. Так, например, поток переходит в сигнальное состояние тогда, когда он завершается. Процесс переходит в сигнальное состояние тогда, когда завершаются все его потоки. Файл переходит в сигнальное состояние в том случае, когда завершается операция ввода-вывода для этого файла. Для остальных объектов сигнальное состояние устанавливается в результате выполнения специальных системных вызовов. Приостановка и активизация потоков осуществляются в зависимости от состояния синхронизирующих объектов ОС. Потоки с помощью специального системного вызова сообщают операционной системе о том, что они хотят синхронизировать свое выполнение с состоянием некоторого объекта. Поток может ожидать установки сигнального состояния не одного объекта, а нескольких. При этом поток может попросить ОС активизировать его при установке либо одного из указанных объектов, либо всех объектов. Поток может в качестве аргумента системного вызова Wait() указать также максимальное время, которое он будет ожидать перехода объекта в сигнальное состояние, после чего ОС должна его активизировать в любом случае. Может случиться, что установки некоторого объекта в сигнальное состояние ожидают сразу несколько потоков. В зависимости от объекта синхронизации в состояние готовности могут переводиться либо все ожидающие это событие потоки, либо один из них. Синхронизация тесно связана с планированием потоков: любое обращение потока с системным вызовом Wait(X) влечет за собой действия в подсистеме планирования поток снимается с выполнения и помещается в очередь ожидающих потоков из очереди готовых потоков выбирается и активизируется новый поток. при переходе объекта в сигнальное состояние (в результате выполнения некоторого потока — либо системного, либо прикладного) ожидающий этот объект поток (или потоки) переводится в очередь готовых к выполнению потоков. В обоих случаях осуществляется перепланирование потоков, при этом если в ОС предусмотрены изменяемые приоритеты и/или кванты времени, то они пересчитываются по правилам, принятым в этой операционной системе. Мьютекс, как и семафор, обычно используется для управления доступом к данным. В отличие от объектов-потоков, объектов-процессов и объектов-файлов, которые при переходе в сигнальное состояние переводят в состояние готовности все потоки, ожидающие этого события, объект - мьютекс «освобождает» из очереди ожидающих только один поток. Работа мьютекса хорошо поясняется в терминах «владения». Пусть поток, который, пытаясь получить доступ к критическим данным, выполнил системный вызов Wait(X), где X — указатель на мьютекс. Предположим, что мьютекс находится в сигнальном состоянии, в этом случае поток тут же становится его владельцем, устанавливая его в несигнальное состояние, и входит в критическую секцию. После того как поток выполнил работу с критическими данными, он «отдает» мьютекс, устанавливая его в сигнальное состояние. В этот момент мьютекс свободен и не принадлежит ни одному потоку. Если какой-либо поток ожидает его освобождения, то он становится следующим владельцем этого мьютекса, одновременно мьютекс переходит в несигнальное состояние. Объект-событие (в данном случае слово «событие» используется в узком смысле, как обозначение конкретного вида объектов синхронизации) обычно используется не для доступа к данным, а для того, чтобы оповестить другие потоки о том, что некоторые действия завершены. Пусть, например, в некотором приложении работа организована таким образом, что один поток читает данные из файла в буфер памяти, а другие потоки обрабатывают эти данные, затем первый поток считывает новую порцию данных, а другие потоки снова ее обрабатывают и так далее. В начале работы первый поток устанавливает объект-событие в несигнальное состояние. Все остальные потоки выполнили вызов Wait(X), где X — указатель события, и находятся в приостановленном состоянии, ожидая наступления этого события. Как только буфер заполняется, первый поток сообщает об этом операционной системе, выполняя вызов Set(X). Операционная система просматривает очередь ожидающих потоков и активизирует все потоки, которые ждут этого события. 27. Мониторы Хоара Монитор – это набор процедур и информационных структур, которыми процессы пользуются в режиме разделения, причем в фиксированный момент времени им может пользоваться только один процесс. Отличительная особенность монитора в том, что в его распоряжении находится некоторая специальная информация, предназначенная для общего пользования, но доступ к ней можно получить только при обращении к этому монитору. Монитор не является процессом, это пассивный объект, который приходит в активное состояние только тогда, когда какой-то объект обращается к нему за услугами. Часто монитор сравнивают с запертой комнатой, от которой имеется только один ключ. Услугами этой комнаты может воспользоваться только тот, у кого есть ключ. При этом процессу запрещается оставаться там сколь угодно долго. Другой процесс должен ждать до тех пор, пока первый не выйдет из нее и передаст ключ. В качестве примера программы-монитора может выступать планировщик ресурсов. Действительно, каждому процессу когда-нибудь понадобятся ресурсы и он будет обращаться к планировщику. Но планировщик одновременно может обслуживать только один ресурс. Иногда монитор задерживает обратившийся к нему процесс. Это происходит, например, в случае обращения за занятым ресурсом. Монитор блокирует процесс с помощью команды "ЖДАТЬ", а в случае освобождения ресурса выдает команду "СИГНАЛ". При этом освободившийся ресурс предоставляется одному из ожидавших его процессов вместе с разрешением на продолжение работы. Управление передается команде монитора, непосредственно следующей за операцией "ЖДАТЬ". Мониторы более гибки, чем семафоры. В форме мониторов сравнительно легко можно реализовать различные синхронизирующие примитивы, в частности семафоры и почтовые ящики. Кроме того, мониторы позволяют нескольким процессам совместно использовать программу, представляющую собой критический участок. 28. Алгоритмы распределения памяти без использования внешних носителей (фиксированные, динамические, перемещаемые разделы). Все методы управления памятью могут быть разделены на два класса: методы, которые используют перемещение процессов между оперативной памятью и диском, и методы, которые не делают этого (рисунок 2.8). Начнем с последнего, более простого класса методов. Рис. 2.8. Классификация методов распределения памяти Распределение памяти фиксированными разделами Самым простым способом управления оперативной памятью является разделение ее на несколько разделов фиксированной величины. Это может быть выполнено вручную оператором во время старта системы или во время ее генерации. Очередная задача, поступившая на выполнение, помещается либо в общую очередь (рисунок 2.9,а), либо в очередь к некоторому разделу (рисунок 2.9,б). Рис. 2.9. Распределение памяти фиксированными разделами: а - с общей очередью; б - с отдельными очередями Подсистема управления памятью в этом случае выполняет следующие задачи: сравнивая размер программы, поступившей на выполнение, и свободных разделов, выбирает подходящий раздел, осуществляет загрузку программы и настройку адресов. При очевидном преимуществе - простоте реализации - данный метод имеет существенный недостаток - жесткость. Так как в каждом разделе может выполняться только одна программа, то уровень мультипрограммирования заранее ограничен числом разделов не зависимо от того, какой размер имеют программы. Даже если программа имеет небольшой объем, она будет занимать весь раздел, что приводит к неэффективному использованию памяти. С другой стороны, даже если объем оперативной памяти машины позволяет выполнить некоторую программу, разбиение памяти на разделы не позволяет сделать этого. Распределение памяти разделами переменной величины В этом случае память машины не делится заранее на разделы. Сначала вся память свободна. Каждой вновь поступающей задаче выделяется необходимая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи память освобождается, и на это место может быть загружена другая задача. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера. На рисунке 2.10 показано состояние памяти в различные моменты времени при использовании динамического распределения. Так в момент t0 в памяти находится только ОС, а к моменту t1 память разделена между 5 задачами, причем задача П4, завершаясь, покидает память. На освободившееся после задачи П4 место загружается задача П6, поступившая в момент t3. Рис. 2.10. Распределение памяти динамическими разделами Задачами операционной системы при реализации данного метода управления памятью является: ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти, при поступлении новой задачи - анализ запроса, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения поступившей задачи, загрузка задачи в выделенный ей раздел и корректировка таблиц свободных и занятых областей, после завершения задачи корректировка таблиц свободных и занятых областей. Программный код не перемещается во время выполнения, то есть может быть проведена единовременная настройка адресов посредством использования перемещающего загрузчика. Выбор раздела для вновь поступившей задачи может осуществляться по разным правилам, таким, например, как "первый попавшийся раздел достаточного размера", или "раздел, имеющий наименьший достаточный размер", или "раздел, имеющий наибольший достаточный размер". Все эти правила имеют свои преимущества и недостатки. По сравнению с методом распределения памяти фиксированными разделами данный метод обладает гораздо большей гибкостью, но ему присущ очень серьезный недостаток фрагментация памяти. Фрагментация - это наличие большого числа несмежных участков свободной памяти очень маленького размера (фрагментов). Настолько маленького, что ни одна из вновь поступающих программ не может поместиться ни в одном из участков, хотя суммарный объем фрагментов может составить значительную величину, намного превышающую требуемый объем памяти. Перемещаемые разделы Одним из методов борьбы с фрагментацией является перемещение всех занятых участков в сторону старших либо в сторону младших адресов, так, чтобы вся свободная память образовывала единую свободную область (рисунок 2.11). В дополнение к функциям, которые выполняет ОС при распределении памяти переменными разделами, в данном случае она должна еще время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных и занятых областей. Эта процедура называется "сжатием". Сжатие может выполняться либо при каждом завершении задачи, либо только тогда, когда для вновь поступившей задачи нет свободного раздела достаточного размера. В первом случае требуется меньше вычислительной работы при корректировке таблиц, а во втором - реже выполняется процедура сжатия. Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то преобразование адресов из виртуальной формы в физическую должно выполняться динамическим способом. Рис. 2.11. Распределение памяти перемещаемыми разделами Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может потребовать значительного времени, что часто перевешивает преимущества данного метода. 29.Страничное распределение памяти. Нах делаю хз и так все знают но все-таки правда рисунок каль :) Виртуальное адресное пространство каждого процесса делится на части одинакового, фиксированного для данной системы размера, называемые виртуальными страницами. В общем случае размер виртуального адресного пространства не является кратным размеру страницы, поэтому последняя страница каждого процесса дополняется фиктивной областью. Вся оперативная память машины также делится на части такого же размера, называемые физическими страницами (или блоками). Размер страницы обычно выбирается равным степени двойки: 512, 1024 и т.д., это позволяет упростить механизм преобразования адресов. При загрузке процесса часть его виртуальных страниц помещается в оперативную память, а остальные - на диск. Смежные виртуальные страницы не обязательно располагаются в смежных физических страницах. При загрузке операционная система создает для каждого процесса информационную структуру - таблицу страниц, в которой устанавливается соответствие между номерами виртуальных и физических страниц для страниц, загруженных в оперативную память, или делается отметка о том, что виртуальная страница выгружена на диск. Кроме того, в таблице страниц содержится управляющая информация, такая как признак модификации страницы, признак невыгружаемое™ (выгрузка некоторых страниц может быть запрещена), признак обращения к странице (используется для подсчета числа обращений за определенный период времени) и другие данные, формируемые и используемые механизмом виртуальной памяти. Есть ещё такая штука, инвертированная таблица страниц, это когда не список виртуальных, и соответсвуюих им физических, а наборот, список физических. Таблица получается, понятно, гораздо меньше, но в ней сложнее искать физический адрес по виртуальному. 30.Сегментное распределение памяти. Виртуальное адресное пространство процесса делится на сегменты, размер которых определяется программистом с учетом смыслового значения содержащейся в них информации. Отдельный сегмент может представлять собой подпрограмму, массив данных и т.п. Иногда сегментация программы выполняется по умолчанию компилятором. При загрузке процесса часть сегментов помещается в оперативную память (при этом для каждого из этих сегментов операционная система подыскивает подходящий участок свободной памяти), а часть сегментов размещается в дисковой памяти. Сегменты одной программы могут занимать в оперативной памяти несмежные участки. Во время загрузки система создает таблицу сегментов процесса (аналогичную таблице страниц), в которой для каждого сегмента указывается начальный физический адрес сегмента в оперативной памяти, размер сегмента, правила доступа, признак модификации, признак обращения к данному сегменту за последний интервал времени и некоторая другая информация. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре. Система с сегментной организацией функционирует аналогично системе со страничной организацией: время от времени происходят прерывания, связанные с отсутствием нужных сегментов в памяти, при необходимости освобождения памяти некоторые сегменты выгружаются, при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический. Кроме того, при обращении к памяти проверяется, разрешен ли доступ требуемого типа к данному сегменту. Недостатком данного метода распределения памяти является фрагментация на уровне сегментов и более медленное по сравнению со страничной организацией преобразование адреса. 31.Сегментно-страничное распределение памяти. Виртуальное пространство процесса делится на сегменты, а каждый сегмент в свою очередь делится на виртуальные страницы, которые нумеруются в пределах сегмента. Оперативная память делится на физические страницы. Загрузка процесса выполняется операционной системой постранично, при этом часть страниц размещается в оперативной памяти, а часть на диске. Для каждого сегмента создается своя таблица страниц, структура которой полностью совпадает со структурой таблицы страниц, используемой при страничном распределении. Для каждого процесса создается таблица сегментов, в которой указываются адреса таблиц страниц для всех сегментов данного процесса. Адрес таблицы сегментов загружается в специальный регистр процессора, когда активизируется соответствующий процесс. 32. Задачи ОС по управлению файлами и устройствами Подсистема ввода-вывода (Input-Output Subsystem) мультипрограммной ОС при обмене данными с внешними устройствами компьютера должна решать ряд общих задач, из которых наиболее важными являются следующие: организация параллельной работы устройств ввода-вывода и процессора; согласование скоростей обмена и кэширование данных; разделение устройств и данных между процессами; обеспечение удобного логического интерфейса между устройствами и остальной частью системы; поддержка широкого спектра драйверов с возможностью простого включения в систему нового драйвера; динамическая загрузка и выгрузка драйверов; поддержка нескольких файловых систем; поддержка синхронных и асинхронных операций ввода-вывода. 33. Физическая организация файловой системы Жесткий диск состоит из одной или нескольких стеклянных или металлических пластин, каждая из которых покрыта с одной или двух сторон магнитным материалом. На каждой стороне каждой пластины размечены тонкие концентрические кольца — дорожки (traks), на которых хранятся данные. Количество дорожек зависит от типа диска. Нумерация дорожек начинается с 0 от внешнего края к центру диска. Когда диск вращается, элемент, называемый головкой, считывает двоичные данные с магнитной дорожки или записывает их на магнитную дорожку. Головка может позиционироваться над заданной дорожкой. Головки перемещаются над поверхностью диска дискретными шагами, каждый шаг соответствует сдвигу на одну дорожку. Запись на диск осуществляется благодаря способности головки изменять магнитные свойства дорожки. Цилиндр - совокупность дорожек одного радиуса на всех поверхностях всех пластин пакета. Сектор – фрагменты, на которые разбивается каждая дорожка. Все дорожки имеют равное число секторов, в которые можно максимально записать одно и то же число байт. Сектор имеет фиксированный для конкретной системы размер, выражающийся степенью двойки (чаще - 512 байт). Плотность записи тем выше, чем ближе дорожка к центру. Сектор — наименьшая адресуемая единица обмена данными дискового устройства с оперативной памятью. Для того чтобы контроллер мог найти на диске нужный сектор, необходимо задать ему все составляющие адреса сектора: номер цилиндра, номер поверхности и номер сектора. Так как прикладной программе в общем случае нужен не сектор, а некоторое количество байт, не обязательно кратное размеру сектора, то типичный запрос включает чтение нескольких секторов, содержащих требуемую информацию, и одного или двух секторов, содержащих наряду с требуемыми избыточные данные. Кластер – собственная единица дискового пространства операционной системы. При создании файла место на диске ему выделяется кластерами. Дорожки и секторы создаются в результате выполнения процедуры физического, или низкоуровневого, форматирования диска, предшествующей использованию диска. Для определения границ блоков на диск записывается идентификационная информация. Низкоуровневый формат диска не зависит от типа операционной системы, которая этот диск будет использовать. Разметку диска под конкретный тип файловой системы выполняют процедуры высокоуровневого, или логического, форматирования. При высокоуровневом форматировании определяется размер кластера и на диск записывается информация, необходимая для работы файловой системы (информация о доступном и неиспользуемом пространстве, границах отведенных под файлы и каталоги областей, о поврежденных областях). Кроме того, на диск записывается загрузчик операционной системы — небольшая программа, которая начинает процесс инициализации операционной системы после включения питания или рестарта компьютера. Прежде чем форматировать диск под определенную файловую систему, он может быть разбит на разделы. Раздел — непрерывная часть физического диска, которую операционная система представляет пользователю как логическое устройство (используются также названия логический диск и логический раздел). Логическое устройство функционирует так, как если бы это был отдельный физический диск. Логические устройства не могут быть использованы операционными системами разного типа. Все разделы одного диска имеют одинаковый размер блока, определенный для данного диска в результате низкоуровневого форматирования. Однако в результате высокоуровневого форматирования в разных разделах одного и того же диска, представленных разными логическими устройствами, могут быть установлены файловые системы, в которых определены кластеры отличающихся размеров. Операционная система может поддерживать разные статусы разделов, особым образом отмечая разделы, которые могут быть использованы для загрузки модулей операционной системы, и разделы, в которых можно устанавливать только приложения и хранить файлы данных. Один из разделов диска помечается как загружаемый (или активный). Именно из этого раздела считывается загрузчик операционной системы. 34. 4 способа размещения файлов. Непрерывные файлы Простейшей схемой выделения файлам определенных блоков на диске является система, в которой файлы представляют собой непрерывные наборы соседних блоков диска. Тогда на диске, состоящем из блоков по 1 Кбайт, файл размером в 50 Кбайт будет занимать 50 последовательных блоков. При 2-килобайтных блоках такой файл займет 25 соседних блоков. У непрерывных файлов есть два существенных преимущества. Во-первых, такую систему легко реализовать, так как системе, чтобы определить, какие блоки принадлежат тому или иному файлу, нужно следить всего лишь за двумя числами: номером первого блока файла и числом блоков в файле. Зная первый блок файла, любой другой его блок легко получить при помощи простой операции сложения. Во-вторых, при работе с непрерывными файлами производительность просто превосходна, так как весь файл может быть прочитан с диска за одну операцию. Требуется только одна операция поиска (для первого блока). После этого более не нужно искать цилиндры и тратить время на ожидания вращения диска, поэтому данные могут считываться с максимальной скоростью, на которую способен диск. Недостатки: со временем диск становится фрагментированным, нужно заранее знать размер файла. И все-таки есть ситуации, в которых непрерывные файлы могут применяться и в самом деле широко используются: на компакт-дисках. Здесь все размеры файлов известны заранее и не могут меняться при последующем использовании файловой системы CDROM. Связные списки Второй метод размещения файлов состоит в представлении каждого файла в виде связного списка из блоков диска, как показано на рис. 6.10. Первое слово каждого блока используется как указатель на следующий блок. В остальной части блока хранятся данные. Рис. 6.10. Размещение файла в виде связного списка блоков диска В отличие от систем с непрерывными файлами, такой метод позволяет использовать каждый блок диска. Нет потерь дискового пространства на фрагментацию (кроме потерь в последних блоках файла). Кроме того, в каталоге нужно хранить только адрес первого блока файла. Всю остальную информацию можно найти там. С другой стороны, хотя последовательный доступ к такому файлу несложен, произвольный доступ будет очень медленным. Чтобы получить доступ к блоку п, операционная система должна сначала прочитать первые п - 1 блоков по очереди. Очевидно, такая схема оказывается очень медленной. Связный список при помощи таблицы в памяти Оба недостатка предыдущей схемы организации файлов в виде связных списков могут быть устранены, если указатели на следующие блоки хранить не прямо в блоках, а в отдельной таблице, загружаемой в память. На рис. 6.11 показан внешний вид такой таблицы для файлов с рис. 6.10. На обоих рисунках показаны два файла. Файл А использует блоки диска 4, 7,2,10 и 12, а файл В использует блоки диска 6, 3,11 и 14. С помощью таблицы, показанной на рис. 6.11, мы можем начать с блока 4 и следовать по цепочке до конца файла. То же может быть сделано для второго файла, если начать с блока 6. Обе цепочки завершаются специальным маркером (например -1), не являющимся допустимым номером блока. Такая таблица, загружаемая в оперативную память, называется FAT-таблицей (File Allocation Table — таблица размещения файлов). Рис. 6.11. Таблица размещения файлов Эта схема позволяет использовать для данных весь блок. Кроме того, случайный доступ при этом становится намного проще. Хотя для получения доступа к какому-либо блоку файла все равно понадобится проследовать по цепочке по всем ссылкам вплоть до ссылки на требуемый блок, однако в данном случае вся цепочка ссылок уже хранится в памяти, поэтому для следования по пей не требуются дополнительные дисковые операции. Как и в предыдущем случае, в каталоге достаточно хранить одно целое число (номер начального блока файла) для обеспечения доступа ко всему файлу. Основной недостаток этого метода состоит в том, что вся таблица должна постоянно находиться в памяти. Для 20-гигабайтного диска с блоками размером 1 Кбайт потребовалась бы таблица из 20 млн записей, по одной для каждого из 20 млн блоков диска. Каждая запись должна состоять как минимум из трех байтов. Для ускорения поиска размер записей должен быть увеличен до 4 байт. Таким образом, таблица будет постоянно занимать 60 или 80 Мбайт оперативной памяти. Таблица, конечно, может быть размещена в виртуальной памяти, но и в этом случае ее размер оказывается чрезмерно большим, к тому же постоянная выгрузка таблицы на диск и загрузка с диска существенно снизит производительность файловых операций. I-узлы Последний метод отслеживания принадлежности блоков диска файлам состоит в связывании с каждым файлом структуры данных, называемой i-узлом (index node — индекс-узел), содержащей атрибуты файла и адреса блоков файла. Простой пример i-узла показан на рис. 6.12. При наличии i-узла можно найти все блоки файла. Большое преимущество такой схемы перед хранящейся в памяти таблицей из связных списков заключается в том, что каждый конкретный i-узел должен находиться в памяти только тогда, когда соответствующий ему файл открыт. Если каждый i-узел занимает n байт, а одновременно открыто может быть k файлов, то для массива i-узлов потребуется в памяти всего kn байтов. Рис. 6.12. Пример i-узла Обычно этот размер значительно меньше, чем FAT-таблица, описанная в предыдущем разделе. Это легко объясняется. Размер таблицы, хранящей связный список всех блоков диска, пропорционален размеру самого диска. Для диска из n блоков потребуется n записей в таблице. Таким образом, размер таблицы линейно растет с ростом размера диска. Для схемы i-узлов, напротив, требуется массив в памяти с размером, пропорциональным максимальному количеству файлов, которые могут быть открыты одновременно. При этом не важно, будет ли размер диска 1 Гбайт, 10 Гбайт или 100 Гбайт. С такой схемой связана проблема, заключающаяся в том, что при выделении каждому файлу фиксированного количества дисковых адресов этого количества может не хватить. Одно из решений заключается в резервировании последнего дискового адреса не для блока данных, а для следующего адресного блока, как показано на рис. 6.12. Более того, можно создавать целые цепочки и даже деревья адресных блоков. 35. Файловые операции Файловая система ОС должна предоставлять пользователям набор операций работы с файлами, оформленный в виде системных вызовов. Этот набор обычно состоит из таких системных вызовов, как create (создать файл), read (читать из файла), write (записать в файл) и некоторых других. Чаще всего с одним и тем же файлом пользователь выполняет не одну операцию, а последовательность операций. Например, при работе текстового редактора с файлом, в котором содержится некоторый документ, пользователь обычно считывает несколько страниц текста, редактирует эти данные и записывает их на место считанных, а затем считывает страницы из другой области файла, и т. п. После большого количества операций чтения и записи пользователь завершает работу с данным файлом и переходит к другому. Какие бы операции не выполнялись над файлом, ОС необходимо выполнить ряд универсальных для всех операций действий: По символьному имени файла найти его характеристики, которые хранятся в файловой системе на диске. Скопировать характеристики файла в оперативную память, так как только таким образом программный код может их использовать. На основании характеристик файла проверить права пользователя на выполнение запрошенной операции (чтение, запись, удаление, просмотр атрибутов файла). Очистить область памяти, отведенную под временное хранение характеристик файла. Кроме того, каждая операция включает ряд уникальных для нее действий, например чтение определенного набора кластеров диска, удаление файла и т. п. Операционная система может выполнять последовательность действий над файлом двумя способами: Для каждой операции выполняются как универсальные, так и уникальные действия. Такая схема иногда называется схемой без запоминания состояния операций (stateless). Все универсальные действия выполняются в начале и конце последовательности операций, а для каждой промежуточной операции выполняются только уникальные действия. Подавляющее большинство файловых систем поддерживает второй способ организации файловых операций как более экономичный и быстрый. Первый способ обладает одним преимуществом — он более устойчив к сбоям в работе системы, так как каждая операция является самодостаточной и не зависит от результата предыдущей. Поэтому первый способ иногда применяется в распределенных сетевых файловых системах (например, в Network File System, NFS компании Sun), когда сбои из-за потерь пакетов или отказов одного из сетевых узлов более вероятны, чем при локальном доступе к файлам. При втором способе в файловой системе вводятся два специальных системных вызова: open — открытие файла, и close — закрытие файла. Системный вызов открытия файла open выполняется перед началом любой последовательности операций с файлом, а вызов закрытия файла close — после окончания работы с файлом. Основной задачей вызова open является преобразование символьного имени файла в его уникальное числовое имя, копирование характеристик файла из дисковой области в буфер оперативной памяти и проверка прав пользователя на выполнение запрошенной операции. Вызов close освобождает буфер с характеристиками файла и делает невозможным продолжение операций с файлом без его повторного открытия. 36. Контроль доступа к файлам. Определить права доступа к файлу - значит определить для каждого пользователя набор операций, которые он может применить к данному файлу. В разных файловых системах может быть определен свой список дифференцируемых операций доступа. Этот список может включать следующие операции: создание файла, уничтожение файла, открытие файла, закрытие файла, чтение файла, запись в файл, дополнение файла, поиск в файле, получение атрибутов файла, установление новых значений атрибутов, переименование, выполнение файла, чтение каталога, и другие операции с файлами и каталогами. В самом общем случае права доступа могут быть описаны матрицей прав доступа, в которой столбцы соответствуют всем файлам системы, строки - всем пользователям, а на пересечении строк и столбцов указываются разрешенные операции (рисунок 2.35). В некоторых системах пользователи могут быть разделены на отдельные категории. Для всех пользователей одной категории определяются единые права доступа. Например, в системе UNIX все пользователи подразделяются на три категории: владельца файла, членов его группы и всех остальных. Различают два основных подхода к определению прав доступа: избирательный доступ, когда для каждого файла и каждого пользователя сам владелец может определить допустимые операции; мандатный подход, когда система наделяет пользователя определенными правами по отношению к каждому разделяемому ресурсу (в данном случае файлу) в зависимости от того, к какой группе пользователь отнесен. 37. FAT. Файловая система FAT (File Allocation Table) представляет собой простую файловую систему, разработанную для небольших дисков и простых структур каталогов. Название этой файловой системы происходит от метода, применяемого для организации файлов, таблица размещения файлов (File Allocation Table, FAT), которая размещается в начале тома. В целях защиты тома на нем хранятся две копии FAT, на тот случай, если одна из них окажется поврежденной. Кроме того, таблица размещения файлов и корневой каталог должны размещаться по строго фиксированным адресам, чтобы файлы, необходимые для запуска системы, были размещены корректно. Том, отформатированный для использования файловой системы FAT, размечается по кластерам. Размер кластера по умолчанию определяется размером тома. При использовании файловой системы FAT номер кластера должен иметь длину не более 16 бит и представлять собой одну из степеней 2. Размеры кластеров по умолчанию в зависимости от размера тома приведены в таблице. При форматировании тома FAT с помощью программы Format из командной строки пользователь имеет возможность указать другой размер кластера, отличный от значения, устанавливаемого по умолчанию. Однако устанавливаемый размер не может быть меньше размера по умолчанию, указанного в таблице для соответствующего размера тома. Размер раздела Размер кластера < 16 Мб 4 Кб 16 Мб – 127 Мб 2 Кб 128 Мб – 255 Мб 4 Кб 256 Мб – 511 Мб 8 Кб 512 Мб – 1023 Мб 16 Кб 1 Гб – 2 Гб 32 Кб 2 Гб – 4 Гб 64 Кб Загрузочный сектор, Блок параметров BIOS (BPB) каталог Область файлов FAT1 FAT2 (копия) Корневой Структура тома FAT Таблицы расположения файлов (области FAT1 и FAT2) содержат следующую информацию о каждом кластере тома: Unused (кластер не используется) Cluster in use by a file (кластер используется файлом) Bad cluster (плохой кластер) Last cluster in a file (последний кластер файла) Корневой каталог содержит записи для каждого файла и каждого каталога, расположенных в корневом каталоге. Единственным различием между корневым каталогом и всеми остальными каталогами является то, что корневой каталог занимает четко определенное место на диске и имеет фиксированный размер (512 записей для жесткого диска; для дискет этот размер определяется объемом дискеты). Каталоги содержат 32-байтные записи для каждого содержащегося в них файла и каждого вложенного каталога. Эти записи содержат следующую информацию: имя (в формате "8+3"), байт атрибутов (8 бит), время создания (24 бит), дата создания (16 бит), дата последнего доступа (16 бит), время последней модификации (16 бит), дата последней модификации (16 бит), номер начального кластера файла в таблице расположения файлов (16 бит), размер файла (32 бит). Структура каталога FAT не имеет четкой организации, и файлам присваиваются первые доступные адреса кластеров на томе. Номер начального кластера файла представляет собой адрес первого кластера, занятого файлом, в таблице расположения файлов. Каждый кластер содержит указатель на следующий кластер, использованный файлом, или индикатор (OxFFFF), указывающий на то, что данный кластер является последним кластером файла. Поскольку все записи каталога имеют одинаковый размер, байт атрибутов для каждой записи описывает тип этой записи. Один бит указывает, что запись является, например, подкаталогом, в то время, как другой бит помечает запись как метку тома. Как правило, настройкой этих атрибутов управляет только операционная система. Файл FAT имеет 4 атрибута, которые могут сбрасываться и устанавливаться пользователем: - archive file (архивный файл), - system file (системный файл), - hidden file (скрытый файл), - read-only file (файл только для чтения). Ограничение системы FAT на размер логического диска составляет 2 Gb. При этом каждая запись FAT (на разделах объемом более 16 Mb) является 2-байтовым числом, следовательно, на логическом разделе может быть не более 65536 кластеров. Поэтому на дисках объемом более 1 Gb размер кластера в системе FAT составляет 32 K, т.е. "хвост" (slack) каждого файла занимает от 0 до 32 К, из чего следует, что каждая тысяча файлов поглощает в среднем 16 Mb дискового пространства. Файловую систему FAT, вследствие больших накладных расходов памяти, не рекомендуется использовать для томов, размер которых превышает 511 Mb. 38. HPFS. HPFS - сокращенное название высокопроизводительной файловой системы (high performance file system), совместно разработанной в 1989 году корпорациями IBM и Microsoft. Эта система была разработана, чтобы преодолеть некоторые недостатки FAT, к числу которых относятся: ограничения, налагаемые на размер файлов и дискового пространства; ограничение длины имени файла; фрагментация файлов, приводящая к снижению быстродействия системы и износу оборудования; непроизводительные затраты памяти, вызванные большими размерами кластеров; подверженность потерям данных. Переход на HPFS позволит сэкономить дисковое пространство. HPFS распределяет пространство, основываясь на физических 512-байтовых секторах, а не на кластерах, независимо от размера раздела. Первые 16 секторов раздела HPFS составляют загрузочный блок. Эта область содержит метку диска и код начальной загрузки системы. Сектор 16, известный под названием суперблок, содержит много общей информации о файловой системе в целом: размер раздела, указатель на корневой каталог, счетчик элементов каталогов, номер версии HPFS, дату последней проверки и исправления раздела при помощи команды CHKDSK, а также дату последнего выполнения процедуры дефрагментации раздела. Он также содержит указатели на список испорченных блоков на диске, таблицу дефектных секторов и список доступных секторов. Сектор 17 носит название SpareBlock? (запасной блок). Он содержит указатель на список секторов, которые можно использовать для "горячего" исправления ошибок, счетчик доступных секторов для "горячего" исправления ошибок, указатель на резерв свободных блоков, применяемых для управления деревьями каталогов, и информацию о языковых наборах символов. SpareBlock? также содержит так называемый "грязный" флаг. Этот новый флаг сообщает операционной системе о том, было ли завершение предыдущего сеанса работы нормальным, либо произошло в результате сбоя электропитания, либо файлы не были закрыты должным образом по какой-то другой причине. Во время форматирования раздела HPFS делит его на полосы по 8 Мбайт каждая. Каждая полоса - ее можно представить себе как виртуальный "мини-диск" - имеет отдельную таблицу объемом 2 Кбайт, в которой указывается , какие секторы полосы доступны, а какие заняты. Чтобы максимально увеличить протяженность непрерывного пространства для размещения файлов, таблицы попеременно располагаются в начале и в конце полос (рисунок 9.3). Этот метод позволяет файлам размером до 16 Мбайт (минус 4 Кбайта, отводимые для размещения таблицы) храниться в одной непрерывной области. При форматировании диска в середине диска резервируется место для того, чтобы физические головки, считывающие данные, никогда не проходили более половины ширины диска. Тот факт, что все пространство заранее распределено, также позволяет HPFS использовать специально оптимизированное программное обеспечение для более быстрой и эффективной работы с каталогами. Скорость работы увеличивается также благодаря способу хранения элементов каталогов, используется не простой список, а В-дерево. Операции записи в кэш осуществляются особым образом, который называется "ленивой" записью. Когда программа посылает команду записи, HPFS помещает данные в кэш и немедленно сообщает программе, что операция выполнена, и только потом в фоновом режиме данные перемещаются из оперативной памяти на устройство. Это исключает длительную задержку, сопровождающую действительную операцию записи данных на устройство ввода-вывода. Однако при этом существует риск нарушения целостности данных. Например, уже после того, как программа получила от ОС сообщение об успешном завершении операции ввода-вывода, при попытке записать данные из кэша на диск драйвер этого устройства может сообщить об ошибке обращения к диску. В таком случае весьма полезным является список блоков "горячего" исправления. HPFS обладает повышенной отказоустойчивостью по сравнению с FAT. Если на диске с FAT оказалась стертой таблица распределения файлов, то скорее всего окажутся потерянными все данные, которые находятся вне корневого каталога. В системе HPFS вместо таблицы размещения файлов применяется битовый массив, который содержит флаг, помечающий используемые секторы. Если область битового массива будет разрушена, пользователь этого не заметит, даже если это случится во время работы системы. 39.труктура тома UFS. (сюда ещё надо, про какую-то двойную или тройную косвенную адресацию и что файлы более самомостоятельные, чем в нтфс, что-то такое..) Раздел диска, где размещается файловая система, делится на четыре области: загрузочный блок; суперблок (superblock) содержит самую общую информацию о файловой системе: размер файловой системы, размер области индексных дескрипторов, число индексных дескрипторов, список свободных блоков и список свободных индексных дескрипторов, а также другую административную информацию; область индексных дескрипторов (inode list), порядок расположения индексных дескрипторов в которой соответствует их номерам; область данных, в которой расположены как обычные файлы, так и файлы-каталоги, в том числе и корневой каталог; специальные файлы представлены в файловой системе только записями в соответствующих каталогах и индексными дескрипторами специального формата, но места в области данных не занимают. Физическая организация файловой системы ufs Суперблок является резервной копией основной первой копии суперблока. При повреждении основной копии суперблока может быть использована резервная копия суперблока. Области же блока группы цилиндров и индексных дескрипторов содержат индивидуальные для каждой последовательности значения. Блок группы цилиндров описывает количество индексных дескрипторов и блоков данных, расположенных на данной группе цилиндров диска. Такая группировка делается для ускорения доступа, чтобы просмотр индексных дескрипторов и данных файлов, описываемых этими дескрипторами, не приводил к слишком большим перемещениям головок диска. В ufs имена файлов могут иметь длину до 255 символов (кодировка ASCII, по одному байту на символ). 40.NTFS: структура тома, типы файлов, каталоги. NTFS представляет собой либо файл, либо часть файла. Основой структуры тома NTFS является главная таблица файлов (Master File Table, MFT), которая содержит по крайней мере одну запись для каждого файла тома, включая одну запись для самой себя. Каждая запись MFT имеет фиксированную длину, зависящую от объема диска, — 1, 2 или 4 Кбайт. Для большинства дисков, используемых сегодня, размер записи MFT равен 2 Кбайт, который мы далее будет считать размером записи по умолчанию. Структура тома NTFS показана на рис. 7.19. Загрузочный блок тома NTFS располагается в начале тома, а его копия — в середине тома. Загрузочный блок содержит стандартный блок параметров BIOS, количество блоков в томе, а также начальный логический номер кластера основной копии MFT и зеркальную копию MFT. Далее располагается первый отрезок MFT, содержащий 16 стандартных, создаваемых при форматировании записей о системных файлах NTFS. Назначение этих файлов описано в показанной ниже таблице MFT. Номер записи Системный файл Имя файла Назначение файла 0 Главная таблица файлбв $Mft Содержит полный список файлов тома NTFS 1 Копия главной таблицы файлов $MftMirr? Зеркальная копия первых трех записей MFT 2 Файл журнала $LogFile? Список транзакций, который используется для восстановления файловой системы после сбоев 3 Том $Volume Имя тома, версия NTFS и другая информация о томе 4 Таблица определения атрибутов $AttrDef? Таблица имен, номеров и описаний атрибутов 5 Индекс корневого каталога $. Корневой каталог 6 Битовая карта кластеров $Bitmap Разметка использованных кластеров тома 7 Загрузочный сектор раздела $Boot Адрес загрузочного сектора раздела 8 Файл плохих кластеров $BadClus? Файл, содержащий список всех обнаруженных на томе плохих кластеров 9 Таблица квот $QuotaКвоты используемого пространства на диске для каждого пользователя 10 Таблица преобразования регистра символов $Upcase Используется для преобразования регистра символов для кодировки Unicode 11-15 Зарезервированы для будущего использования Каждый атрибут файла NTFS состоит из полей: тип атрибута, длина атрибута, значение атрибута и, возможно, имя атрибута. Тип атрибута, длина и имя образуют заголовок атрибута. Имеется системный набор атрибутов, определяемых структурой тома NTFS. Системные атрибуты имеют фиксированные имена и коды их типа, а также определенный формат. Могут применяться также атрибуты, определяемые пользователями. Их имена, типы и форматы задаются исключительно пользователем. Атрибуты файлов упорядочены по убыванию кода атрибута, причем атрибут одного и того же типа может повторяться несколько раз. Существуют два способа хранения атрибутов файла - резидентное хранение в записях таблицы MFT и нерезидентное хранение вне ее, во внешних отрезках. Таким образом, резидентная часть файла состоит из резидентных атрибутов, а нерезидентная — из нерезидентных атрибутов. Сортировка может осуществляться только по резидентным атрибутам. Системный набор включает следующие атрибуты: Attribute List (список атрибутов) — список атрибутов, из которых состоит файл; содержит ссылки на номер записи MFT, где расположен каждый атрибут; этот редко используемый атрибут нужен только в том случае, если атрибуты файла не умещаются в основной записи и занимают дополнительные записи MFT; File Name (имя файла) — этот атрибут содержит длинное имя файла в формате Unicode, а также номер входа в таблице MFT для родительского каталога; если этот файл содержится в нескольких каталогах, то у него будет несколько атрибутов типа File Name; этот атрибут всегда должен быть резидентным; MS-DOS Name (имя MS-DOS) — этот атрибут содержит имя файла в формате 8.3; Version (версия) — атрибут содержит номер последней версии файла; Security Descriptor (дескриптор безопасности) — этот атрибут содержит информацию о защите файла: список прав доступа ACL (права доступа к файлу рассматриваются ниже в разделе «Контроль доступа к файлам») и поле аудита, которое определяет, какого рода операции над этим файлом нужно регистрировать; Volume Version (версия тома) — версия тома, используется только в системных файлах тома; Volume Name (имя тома) — имя тома; Data (данные) — содержит обычные данные файла; MFT bitmap (битовая карта MFT) — этот атрибут содержит карту использования блоков на томе; Index Root (корень индекса) — корень В-дерева, используемого для поиска файлов в каталоге; Index Allocation (размещение индекса) — нерезидентные части индексного списка Вдерева; Standard Information (стандартная информация) — этот атрибут хранит всю остальную стандартную информацию о файле, которую трудно связать с каким-либо из других атрибутов файла, например, время создания файла, время обновления и другие. Типы файлов Файлы NTFS в зависимости от способа размещения делятся на небольшие, большие, очень большие и сверхбольшие. Небольшие файлы (small). Если файл имеет небольшой размер, то он может целиком располагаться внутри одной записи MFT, имеющей, например, размер 2 Кбайт. Небольшие файлы NTFS состоят по крайней мере из следующих атрибутов (рис. 7.20): стандартная информация (SI — standard information); имя файла (FN — file name); данные (Data); дескриптор безопасности (SD — security descriptor). Из-за того что файл может иметь переменное количество атрибутов, а также из-за переменного размера атрибутов нельзя наверняка утверждать, что файл уместится внутри записи. Однако обычно файлы размером менее 1500 байт помещаются внутри записи MFT (размером 2 Кбайт). Рис. 7.20. Небольшой файл NTFS Большие файлы (large). Если данные файла не помещаются в одну запись MFT, то этот факт отражается в заголовке атрибута Data, который содержит признак того, что этот атрибут является нерезидентным, то есть находится в отрезках вне таблицы MFT. В этом случае атрибут Data содержит адресную информацию (LCN, VCN, k) каждого отрезка данных (рис. 7.21). Рис. 7.21. Большой файл Очень большие файлы (huge). Если файл настолько велик, что его атрибут данных, хранящий адреса нерезидентных отрезков данных, не помещается в одной записи, то этот атрибут помещается в другую запись MFT, а ссылка на такой атрибут помещается в основную запись файла (рис. 7.22). Эта ссылка содержится в атрибуте Attribute List. Сам атрибут данных по-прежнему содержит адреса нерезидентных отрезков данных. Рис. 7.22. Очень большой файл Сверхбольшие файлы (extremely huge). Для сверхбольших файлов атрибуте Attribute List можно указать несколько атрибутов, расположенных в дополнительных записях MFT (рис. 7.23). Кроме того, можно использовать двойную косвенную адресацию, когда нерезидентный атрибут будет ссылаться на другие нерезидентные атрибуты, поэтому в NTFS не может быть атрибутов слишком большой для системы длины. Рис. 7.23. Сверхбольшой файл 41.типа тож, самое что и 36 42. Отказоустойчивость файловых систем Восстанавливаемость файловой системы — свойство, которое гарантирует, что в случае отказа питания или краха системы, когда все данные в оперативной памяти теряются, все начатые файловые операции будут либо успешно завершены, либо отменены безо всяких отрицательных последствий для работоспособности файловой системы. Некорректность файловой системы может возникать не только в результате насильственного прерывания операций ввода-вывода, выполняемых непосредственно с диском, но и в результате нарушения работы дискового кэша. Кэширование данных с диска предполагает, что в течение некоторого времени результаты операций ввода-вывода никак не сказываются на содержимом диска — все изменения происходят с копиями блоков диска, временно хранящихся в буферах оперативной памяти. В этих буферах оседают данные из пользовательских файлов и служебная информация файловой системы, такая как каталоги, индексные дескрипторы, списки свободных, занятых и поврежденных блоков и т. п. Для согласования содержимого кэша и диска время от времени выполняется запись всех модифицированных блоков, находящихся в кэше, на диск. Выталкивание блоков на диск может выполняться либо по инициативе менеджера дискового кэша, либо по инициативе приложения. Менеджер дискового кэша вытесняет блоки из кэша в следующих случаях: если необходимо освободить место в кэше для новых данных; если к менеджеру поступил запрос от какого-либо приложения или модуля ОС на запись указанных в запросе блоков на диск; при выполнении регулярного, периодического сброса всех модифицированных блоков кэша на диск. В распоряжение приложений обычно предоставляются средства, с помощью которых они могут запросить у подсистемы ввода-вывода операцию сквозной записи - данные немедленно и практически одновременно записываются и на диск, и в кэш. Протоколирование транзакций Транзакции — неделимые работы, определённые в системе, которые не могут быть выполнены частично. Они либо выполняются полностью, либо вообще не выполняются. В файловых системах такими транзакциями являются операции ввода-вывода, изменяющие содержимое файлов, каталогов или других системных структур файловой системы. Операции, которые не изменяют состояния файловой системы, нет необходимости рассматривать как транзакции (чтение файла, поиск файла на диске, просмотр атрибутов файла). Для восстановления файловой системы используется упреждающее протоколирование транзакций. 1Перед изменением какого-либо блока данных на диске или в дисковом кэше производится запись в журнал транзакций (log file), где отмечается: какая транзакция делает изменения какой файл и блок изменяются каковы старое и новое значения изменяемого блока. 2После успешной регистрации всех подопераций в журнале делаются изменения в исходных блоках. 3Если транзакция прерывается, то информация журнала регистрации используется для отката. 4Если транзакция фиксируется, то: делается запись в журнал регистрации новые значения измененных данных сохраняются в журнале еще некоторое время, чтобы сделать возможным повторение транзакции, если это потребуется. 43. Процедура самовосстановления NTFS. NTFS - отказоустойчивая система, которая вполне может привести себя в корректное состояние при практически любых реальных сбоях. Любая современная файловая система основана на таком понятии, как транзакция - действие, совершаемое целиком и корректно или не совершаемое вообще. У NTFS просто не бывает промежуточных (ошибочных или некорректных) состояний - квант изменения данных не может быть поделен на до и после сбоя, принося разрушения и путаницу - он либо совершен, либо отменен. Транзакция Откат и повторение Три прохода: Проход анализа Проход повторения Проход отмены Контрольные точки Каждая операция ввода-вывода, которая изменяет файл на томе NTFS, рассматривается файловой системой как транзакция и может выполняться как неделимый блок. При модификации файла пользователем сервис файла регистрации фиксирует информацию по повторению транзакции (которая сообщает о путях повторения транзакции) или откату транзакции (которая сообщает об отмене транзакции, которая не была завершена или имела ошибку). При сбое системы NTFS выполняет три прохода: проход анализа, повторный проход и проход отмены. Во время повторного прохода выполняются все этапы транзакции от последней контрольной точки. Проход отмены осуществляет возврат любых незавершенных транзакций. Ленивая передача подобна ленивой (обратной) записи. Вместо того, чтобы отметить транзакцию как успешно завершившуюся, информация заносится в кэш и записывается в файл регистрации как фоновый процесс. Если происходит сбой до того, как информация о транзакции была зарегистрирована, NTFS произведет повторную проверку транзакции для определения успешности. Пример 1: осуществляется запись данных на диск. Вдруг выясняется, что в то место, куда мы только что решили записать очередную порцию данных, писать не удалось физическое повреждение поверхности. Поведение NTFS в этом случае довольно логично: транзакция записи откатывается целиком - система осознает, что запись не произведена. Место помечается как сбойное, а данные записываются в другое место - начинается новая транзакция. Пример 2: более сложный случай - идет запись данных на диск. Вдруг, бах - отключается питание и система перезагружается. На какой фазе остановилась запись, где есть данные, а где чушь? На помощь приходит другой механизм системы - журнал транзакций. Дело в том, что система, осознав свое желание писать на диск, пометила в метафайле $LogFile? это свое состояние. При перезагрузке это файл изучается на предмет наличия незавершенных транзакций, которые были прерваны аварией и результат которых непредсказуем - все эти транзакции отменяются: место, в которое осуществлялась запись, помечается снова как свободное, индексы и элементы MFT приводятся в с состояние, в котором они были до сбоя, и система в целом остается стабильна. Ну а если ошибка произошла при записи в журнал? Тоже ничего страшного: транзакция либо еще и не начиналась (идет только попытка записать намерения её произвести), либо уже закончилась - то есть идет попытка записать, что транзакция на самом деле уже выполнена. В последнем случае при следующей загрузке система сама вполне разберется, что на самом деле всё и так записано корректно, и не обратит внимания на "незаконченную" транзакцию. 44. Избыточные дисковые подсистемы RAID. RAID - дисковый массив независимых дисков. Служат для повышения надёжности хранения данных и/или для повышения скорости чтения/записи информации (RAID 0). Беркли представил следующие уровни RAID, которые были приняты как стандарт дефакто: RAID 0 представлен как неотказоустойчивый дисковый массив. RAID 1 определён как зеркальный дисковый массив. RAID 2 зарезервирован для массивов, которые применяют код Хемминга. RAID 3, 4, 5 используют чётность для защиты данных от одиночных неисправностей. RAID 6 используют чётность для защиты данных от двойных неисправностей Уровни RAID RAID 0 («Striping») — дисковый массив из двух или более HDD с отсутствием избыточности. Информация разбивается на блоки данных и записывается на оба/несколько диска поочередно. За счёт этого существенно повышается производительность (в зависимости от количества дисков зависит кратность увеличения производительности), но страдает надёжность всего массива. RAID 0 может быть реализован как программно так и аппаратно. RAID 1 (Mirroring — «зеркало»). Он имеет защиту от выхода из строя одного из двух жёстких дисков, обеспечивает приемлемую скорость записи и выигрыш по скорости чтения за счёт распараллеливания запросов. Недостаток заключается в том, что приходится выплачивать стоимость двух жёстких дисков, получая полезный объем одного жёсткого диска. RAID 5 Cамый популярный из уровней, в первую очередь благодаря своей экономичности. Жертвуя ради избыточности ёмкостью всего одного диска из массива, мы получаем защиту от выхода из строя любого из винчестеров тома. На запись информации на том RAID 5 тратятся дополнительные ресурсы, так как требуются дополнительные вычисления, зато при чтении (по сравнению с отдельным винчестером) имеется выигрыш, потому что потоки данных с нескольких накопителей массива распараллеливаются. Недостатки RAID 5 проявляются при выходе из строя одного из дисков — весь том переходит в критический режим, все операции записи и чтения сопровождаются дополнительными манипуляциями, резко падает производительность, диски начинают греться. Если срочно не принять меры — можно потерять весь том. Если во время восстановления массива, вызванного выходом из строя одного диска, выйдет из строя второй диск - данные в массиве разрушаются. Комбинированные уровни Помимо базовых уровней RAID 0 — RAID 5, описанных в стандарте, существуют комбинированные уровни RAID 1+0, RAID 3+0, RAID 5+0, RAID 1+5, которые различные производители интерпретируют каждый по-своему. Суть таких комбинаций вкратце заключается в следующем. RAID 1+0 — это сочетание единички и нолика (см. выше). RAID 5+0 — это объединение по «0» томов 5-го уровня. RAID 1+5 — «зеркало» «пятерок». И так далее. Таким образом, комбинированные уровни наследуют преимущества (и недостатки) своих «родителей». Так, появление «нолика» в уровне RAID 5+0 нисколько не добавляет ему надёжности, но зато положительно отражается на производительности. Уровень RAID 1+5, наверное, очень надёжный, но не самый быстрый и, к тому же, крайне неэкономичный (полезная ёмкость тома равна 40% суммы емкостей дисков).. RAID 6 Похож на RAID 5 но имеет более высокую степень надежности — под контрольные суммы выделяется емкость 2-х дисков, рассчитываются 2 суммы по разным алгоритмам. Требует более серьезный процессор контроллера — сложная математика. Обеспечивает работоспособность после «смерти» 2-х дисков. 45.Прерывания (понятие, классификация, обработка прерываний) Прерывания - преднамеренное завершение текущей задачи и переход к следующей. Выполнение текущей программы прерывается и управление передаётся обработчику прерываний. (по лекциям) По отношенияю к корпусу МП прерывания подразделяются на: внешние аппаратные (маскируемые) - поступают через контролер прерываний немаскируемые поступают на вход NMI. У МП 2 входа для получения сигналов внутренние программные - программа сама вызывает обработчик прерываний - вызов в коде исключения (исключительные ситуации процессора) - в реальном режиме 2 исключения: деление на ноль и пошаговый (?) режим (флаг трассировки и выполнение прерываени после команды) Организация прерываний: векторный способ, опрашиваемый способ. Схема аппаратных прерываний Номер прерывания в реальном режиме - номер ячейки в таблице прерываний. Сам вектор - адрес точки входа в обработчик прерываний. В реальном ержиме таблица прерываний - в младших адресах ОП, представляет собой последовательность адресов в виде сегментсмещение, 4 байта на каждый вектор, 256 прерываний, с 0-ого по 255-ое. Зная номер вектора прерывания, можно в различных режимах вычислить смещение в IDTR. Чем меньше номер линнии запроса прерывания, тем выше приоритет. В регистре флагов можно разрешить или запретить аппаратные прерывания (флаг IF) Внутренняя структура контролера прерываний INTA - выход МП INTR - вход МП 1) - поступившие запросы зарегистрированы. 2) - в регистре 0 - пропускает, 1- запрещает проход сигнала 3) - МП в состоянииобрботки 4) - МП смотрит на IF (запрещены или нет аппаратные прерывания), сбрасывает бит в регистре обслуживания, обработка, все остальные аппаратные прерывания запрещены. Защищённый режим: 1) - обыченые прерывания 2) - исключения: отказы - обращение по несуществующему адресу и т.п. (выполняются до выполния инструкции) ловушки - при переполнении, ошибках и т.п. (выполняются после выполнения интсрукций) аварийное завершение - происходят, когда невозможно определить программу, вызвавшую ошибку. В IDTR - три типа дескрипторов - прерывания, ловушки, задачи. Программные прерывания можно вызвать любой обработчичк прерываний - команда int. при системном вызове: 1) переход в привелегированный режим 2) - нужна высокая скорость обработки 3) стандарный интерфейс вызова процедур 4) - расширить номенклатуру системных вызовов 5) - обеспечение контроля ОС за выполнением прерывания В большинстве ОС обработка прерываний происходит централизовано. При любом системном вызове вызывается единственный обработчик - int 2eh (для Intel) int 2eh вызывает диспетчер устройств, который определяет, что делать дальше. Q48. Система обработки прерываний от клавиатуры (по лекциям) На клавиатуре нажимается какая-то клавиша сигнал поступает в контролер клавиатуры. Тот распознаёт. что за клавиша нажата на клавиатуре - сопоставляет нажатой клавише определённый скэн-код, после чего выдаёт подтверждение 60h PICу, который выдаёт сигнал МП, который оповещается, что на клавиатуре нажата некая клавиша. После МП выдаётся сигнал OSL, который забирает скэн-код нажатой клавиши и помещает его в кольцевой буфер клавиатуры, где сопоставляется скэн-код с кодом аскии. Притом указатель на "голову" буфера указывает на самый старый введённый пользоватлем символ, который будет читаться при обращении к кольцевому буферу клавиатуры. "Хвост" указывает на первую свободную ячейку, в которую будет произвиодиться запись следующего введённого символа. 50. Реестр Windows 2000 Системный реестр Windows представляет собой централизованную базу данных параметров настройки системы и работающих в ней приложений. Реестр пришел на смену всевозможным INI-файлам – файлам конфигурации Windows, для снятия неудобств и ограничений, связанных с их использованием. Практически любой процесс, работающий в ОС Windows, использует системный реестр в своих целях. Реестр можно представить как банк данных, в котором хранится всевозможная информация, необходимая для программ, служб, драйверов. Высокоуровневые службы, обеспечивающие работоспособность ОС, используют реестр с самого начала загрузки Windows и до завершения работы. Системный реестр также используется и драйверами устройств для загрузки и инициализации. Реестр становится необходимым уже на самых ранних этапах загрузки ОС. Основу реестра Windows составляют корневые разделы. Каждый корневой раздел содержит вложенные подразделы и параметры – элементы данных реестра. Все имена корневых разделов начинаются со строки HKEY, что указывает разработчикам ПО на то, что это – дескриптор, который можно использоваться программой. Дескриптор – это значение, используемое для уникального описания ресурса, к которому программа может получить доступ. Данные реестра, как уже было сказано, хранятся в виде параметров, расположенных в соответствующих разделах реестра. Каждый параметр характеризуется: именем, типом данных и значением. Различают следующие основные типы данных в реестре Windows 2000: Тип данных Описание REG_BINARY Необработанные двоичные данные. Большинство сведений об аппаратных компонентах хранится в виде двоичных данных и выводится в редакторе реестра в шестнадцатеричном формате. REG_DWORD Данные представлены в виде значения, длина которого составляет 4 байта (32-разрядное целое). Этот тип данных используется для хранения параметров драйверов устройств и служб. Значение отображается в окне редактора реестра в двоичном, шестнадцатеричном или десятичном формате. REG_EXPAND_SZ Строка данных переменной длины. Этот тип данных включает переменные, обрабатываемые при использовании данных программой или службой. REG_MULTI_SZ Многострочный текст. Этот тип, как правило, имеют списки и другие записи в формате, удобном для чтения. Записи разделяются пробелами, запятыми или другими символами. REG_SZ Текстовая строка фиксированной длины. Поддеревья реестра Реестр Windows содержит два поддерева: HKEY_LOCAL_MACHINE (хранящее параметры настройки компьютера и общие параметры настройки ПО и ОС) и HKEY_CURRENT_USER (хранящее параметры настройки ПО и ОС текущего пользователя). Однако, чтобы облегчить поиск сведений в реестре, программы редактирования реестра выводят пять поддеревьев, которые перечислены ниже. Поддерево реестра Описание HKEY_LOCAL_MACHINE Содержит информацию о конфигурации оборудования компьютера, ОС и ПО. Параметры конфигурации ПО являются общими для всех пользователей компьютера HKEY_CLASSES_ROOT Содержит информацию о конфигурации COM-компонентов и OLE-объектов. Является ссылкой на разделы HKEY_LOCAL_MACHINE\SOFTWARE\Classes и HKEY_CURRENT_USER\SOFTWARE\Classes . Если какое-либо значение существует в обоих разделах, то значение из поддерева HKEY_CURRENT_USER перекрывает значение из поддерева HKEY_LOCAL_MACHINE HKEY_CURRENT_USER Содержит информацию о конфигурации ОС и ПО для пользователя, работающего в системе в данный момент. Является ссылкой на раздел HKEY_USERS\ идентификаторбезопасностипользователя HKEY_USERS Содержит информацию о конфигурации ОС и ПО для пользователей, работающих в системе в данный момент, а также информацию о конфигурации для профиля пользователя по умолчанию HKEY_CURRENT_CONFIG Содержит информацию о текущей аппаратной конфигурации компьютера. Является ссылкой на раздел HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current Кусты и файлы реестра Системный реестр Windows подразделяется на составные части, которые называются кустами или ульями (hives). Куст представляет собой файл, который содержит корневой раздел, его подразделы и параметры. В Windows 2000 файлы всех кустов реестра, кроме HKEY_CURRENT_USER, находятся в папке Systemroot\System32\Config. Вспомогательные файлы куста HKEY_CURRENT_USER хранятся в папке Systemroot\Profiles\Username. Расширения имен этих файлов (или их отсутствие) указывают на тип содержащихся в них данных. Каждый куст реестра Windows 2000 ассоциирован с соответствующим файлом. Кусту могут соответствовать и дополнительные файлы. В следующей таблице перечислены стандартные кусты реестра Windows 2000 и поддерживающие их файлы. Ветвь реестра Имена файлов HKEY_LOCAL_MACHINE\SAM Sam, Sam.log, Sam.sav HKEY_LOCAL_MACHINE\Security Security, Security.log, Security.sav HKEY_LOCAL_MACHINE\Software Software, Software.log, Software.sav HKEY_LOCAL_MACHINE\System System, System.alt, System.log, System.sav HKEY_CURRENT_CONFIG System, System.alt, System.log, System.sav HKEY_USERS\.Default Default Default.log Default.sav Файлы, не ассоциированные с разделами Userdiff, Userdiff.log HKEY_CURRENT_USER Ntuser.dat, Ntuser.dat.log В файле Ntuser.dat хранятся пользовательские профили. Файл Ntuser.dat.log отслеживает изменения, которые вносились в файл Ntuser.dat. Файлы Ntuser и Userdiff были впервые введены в Windows NT 4.0 и выполняют следующие функции: Ntuser.dat – в файле хранится профиль пользователя; файлы Userdiff служат для обновления существующих профилей пользователя, использовавшихся в более ранних версиях Windows NT, таким образом, чтобы эти профили могли применяться в Windows NT 4.0 и последующих версиях Windows. С кустами ассоциируются файлы четырех типов. Тип файла Описание Без расширения Содержит копию куста Alt Содержит копию жизненно важного куста HKEY_LOCAL_MACHINE\System. Только раздел Systemимеет соответствующий файл с расширением alt Log Содержит журнал транзакций, в котором регистрируются все изменения, внесенные в разделы и значимые элементы куста. Sav Содержит копии файлов куста в том виде, который они имели на момент завершения текстовой фазы процесса установки. 51. Структура Windows 2000. Упрощенная версия архитектуры Windows Server 2003. Существуют четыре типа пользовательских процессов: 1Фиксированные процессы поддержки системы - например процесс обработки входа в систему и диспетчер сеансов 2Процессы сервисов - носители Windows-сервисов, например, Task Scheduler 3Пользовательские приложения - бывают шести типов: 64-разрядные, 32-разрадные, 16разрядные для Win 3.1, 16-разрядные для DOS, 32-разрядные для POSIX и 32-разрядные для OS/2 4Подсистемы Окружения - реализованы как часть поддержки среды ОС, предоставляемой пользователям и программистам. В Windows пользовательские приложения не могут вызывать родные сервисы ОС напрямую, вместо этого они работают с одной или несколькими DLL подсистемами. Назначение DLL -трансляция. Компоненты ядра Исполнительная система Windows - содержит базовые сервисы ОС, обеспечивающие управление памятью, процессами и потоками, защиту, ввод/вывод и взаимодействие между процессами. Ядро - содержит низкоуровневые функции ОС (планирование потоков, диспетчеризацию прерываний и исключений, а также синхронизацию процессов. Драйверы устройств - драйверы аппаратных устройств, транслирующих пользовательские вызовы функций в/в в запросы, специфичные для конкретного устройства, сетевые драйверы и драйверы файловых систем. Уровень абстрагирования от оборудования (HAL) - изолирует ядро, драйверы и исполнительную систему от специфики конкретного оборудования. Подсистема поддержки окон и графики - реализует функции GUI. 52. Уровень аппаратных абстракций HAL. Одной из важнейших особенностей архитектуры Windows является переносимость между различными аппаратными платформами. Ключевой компонент, обеспечивающий такую переносимость, — уровень абстрагирования от оборудования (hardware abstraction layer, HAL). HAL — это загружаемый модуль режима ядра (Hal.dll), предоставляющий низкоуровневый интерфейс с аппаратной платформой, на которой выполняется Windows. Он скрывает от операционной системы специфику конкретной аппаратной платформы, в том числе ее интерфейсов ввода-вывода, контроллеров прерываний и механизмов взаимодействия между процессорами, т. е. все функции, зависимые от архитектуры и от конкретной машины. Когда внутренним компонентам Windows и драйверам устройств нужна платформеннозависимая информация, они обращаются не к самому оборудованию, а к подпрограммам HAL, что и обеспечивает переносимость этой операционной системы. 53.Ядро Windows 2000 Ядро состоит из набора функций в Ntoskrnl.exe, предоставляющих фундаментальные механизмы (в том числе планирования потоков и синхронизации), которые используются компонентами исполнительной системы и низкоуровневыми аппаратно-зависимыми средствами поддержки (диспетчеризации прерываний и исключений), различными в каждой процессорной архитектуре. Код ядра написан в основном на С, а ассемблер использовали лишь для решения специфических задач, трудно реализуемых на С. Объекты ядра Ядро состоит из низкоуровневых, четко определенных и хорошо предсказуемых примитивов и механизмов операционной системы, позволяющих компонентам исполнительной системы более высокого уровня выполнять свои функции. Ядро отделено от остальной части исполнительной системы; оно реализует системные механизмы и не участвует в принятии решений, связанных с системной политикой. Практически все такие решения, кроме планирования и диспетчеризации потоков, принимаются исполнительной системой. Одна из групп объектов ядра, называемых управляющими (control objects), определяет семантику управления различными функциями операционной системы. В эту группу входят объекты АРС, DPC (deferred procedure call) и несколько объектов, используемых диспетчером ввода-вывода (например, объект прерывания). Объекты позволяют ядру контролировать обработку данных процессором и поддерживают объекты исполнительной системы. Большинство объектов уровня исполнительной системы инкапсулирует один или более объектов ядра, включая в себя их атрибуты, определенные ядром. Другая группа объектов под названием объекты диспетчера (dispatcher objects) реализует средства синхронизации, позволяющие изменять планирование потоков. В группу таких объектов входят поток ядра (kernel thread), мьютекс (mutex), событие (event), семафор (semaphore), таймер (timer), ожидаемый таймер (waitable timer) и некоторые другие. С помощью функций ядра исполнительная система создает объекты ядра, манипулирует ими и конструирует более сложные объекты, предоставляемые в пользовательском. 54. Исполняющая система Windows 2000. В состав исполнительной системы входят следующие элементы: Справочный монитор защиты (Security Reference Monitor, SRM). Гарантирует выполнение политики защиты на локальном компьютере. Оберегает ресурсы ОС, обеспечивая защиту объектов и аудит доступа к ним. Диспетчер процессов (Process Manager). Создает и завершает процессы и потоки. Кроме того, приостанавливает и возобновляет исполнение потоков, хранит и выдает информацию о процессах и потоках NT. Диспетчер межпроцессного взаимодействия (Interprocess Communication Manager, IPC Manager). Обеспечивает взаимодействие между подсистемами режима пользователя и исполнительной подсистемы. Диспетчер виртуальной памяти (Virtual memory manager, VMM). Реализует виртуальную память - схему управления памятью, которая предоставляет каждому процессу большое собственное адресное пространство и защищает это пространство от других процессов. Ядро (Kernel). Реагирует на прерывания и исключения, выполняет межпроцессорную синхронизацию и предоставляет набор элементарных объектов и интерфейсов, используемый остальными частями исполнительной системы для реализации объектов более высокого уровня. Подсистема ввода/вывода (I/O Subsystem). Состоит из группы компонентов, отвечающих за выполнение ввода/вывода на разнообразные устройства. Диспетчер объектов (Object manager). Создает, поддерживает и уничтожает объекты исполнительной системы Windows - абстрактные типы данных, представляющие системные ресурсы. Диспетчер электропитания (Advanced Configuration and Power Interface Manager, ACPImanager). Управляет электропитанием устройств, координирует запросы устройств, связанные с изменением режима электропитания. Диспетчер Plug and Play (PnP-manager). Обеспечивает распознавание PnP-устройств после процесса загрузки ОС, управляет их драйверами, предоставляет интерфейс средствам пользовательского режима для поиска устройств, их установки и удаления, а также остановки и возобновления их работы. Диспетчер окон и интерфейс графических устройств (Graphic Device Interface, GDI). Управляет отображением окон, обеспечивает прием ввода от клавиатуры и мыши, распределяя информацию приложениям. Компоненты исполнительной системы реализованы как независимые от аппаратной платформы модули. Это обеспечивается наличием уровня абстрагирования от оборудования и делает ОС максимально переносимой. 55.Процессы и потоки Windows 2000. МЕГА ЖЕСТЬ(много) :Е Хотя на первый взгляд кажется, что программа и процесс — понятия практически одинаковые, они фундаментально отличаются друг от друга. Программа представляет собой статический набор команд, а процесс — это контейнер для набора ресурсов, используемых при выполнении экземпляра программы. На самом высоком уровне абстракции процесс в Windows включает следующее: закрытое виртуальное адресное пространство — диапазон адресов виртуальной памяти, которым может пользоваться процесс; исполняемую программу — начальный код и данные, проецируемые на виртуальное адресное пространство процесса; список открытых описателей (handles) различных системных ресурсов — семафоров, коммуникационных портов, файлов и других объектов, доступных всем потокам в данном процессе; контекст защиты (security context), называемый маркером доступа (access token) и идентифицирующий пользователя, группы безопасности и привилегии, сопоставленные с процессом; уникальный идентификатор процесса (во внутрисистемной терминологии называемый идентификатором клиента); •минимум один поток. Поток (thread) — некая сущность внутри процесса, получающая процессорное время для выполнения. Без потока программа процесса не может выполняться. Поток включает следующие наиболее важные элементы: содержимое набора регистров процессора, отражающих состояние процессора; два стека, один из которых используется потоком при выполнении в режиме ядра, а другой — в пользовательском режиме; закрытую область памяти, называемую локальной памятью потока (thread-local storage, TLS) и используемую подсистемами, библиотеками исполняющих систем (run-time libraries) и DLL; уникальный идентификатор потока (во внутрисистемной терминологии также называемый идентификатором клиента: идентификаторы процессов и потоков генерируются из одного пространства имен и никогда не перекрываются); иногда потоки обладают своим контекстом защиты, который обычно используется многопоточными серверными приложениями, подменяющими контекст защиты обслуживаемых клиентов. Переменные регистры, стеки и локальные области памяти называются контекстом потока. Хотя у потоков свой контекст выполнения, каждый поток внутри одного процесса делит его виртуальное адресное пространство (а также остальные ресурсы, принадлежащие процессу). Это означает, что все потоки в процессе могут записывать и считывать содержимое памяти любого из потоков данного процесса. Однако потоки не могут случайно сослаться на адресное пространство другого процесса. Исключение возможно в ситуации, когда тот предоставляет часть своего адресного пространства как раздел общей памяти (shared memory section), в Windows API называемый объектом «проекция файла» (file mapping object). Процесс и его ресурсы Кроме закрытого адресного пространства и одного или нескольких потоков у каждого процесса имеются идентификация защиты и список открытых описателей таких объектов, как файлы и разделы общей памяти, или синхронизирующих объектов вроде мьютексов, событий и семафоров. Каждый процесс обладает контекстом защиты, который хранится в объекте — маркере доступа. Маркер доступа содержит идентификацию защиты и определяет полномочия данного процесса. Дескрипторы виртуальных адресов (virtual address descriptors, VAD) — это структуры данных, используемые диспетчером памяти для учета виртуальных адресов, задействованных процессом. Процессы потоки задания Каждый процесс в Windows представлен блоком процесса, создаваемым исполнительной системой (EPROCESS). Планирование потоков Вытесняющее планирование на основе уровней приоритета Выбор потока может быть ограничен привязкой к процессору Выбранный поток работает в течении кванта времени. Квант зависит от: Конфигурационных параметров Статуса процесса Использования объекта задание Код отвечающий за планирование рассредоточен по ядру Совокупность процедур, выполняющих эти обязанности называется диспетчером ядра Код Windows, отвечающий за планирование, реализован в ядре. Поскольку этот код рассредоточен по ядру, единого модуля или процедуры с названием «планировщик» нет. Совокупность процедур, выполняющих эти обязанности, называется диспетчерам ядра (kernel's dispatcher). Диспетчеризация потоков может быть вызвана любым из следующих событий: Поток готов к выполнению — например, он только что создан или вышел из состояния ожидания. Поток выходит из состояния Running (выполняется), так как его квант истек или поток завершается либо переходит в состояние ожидания. Приоритет потока изменяется в результате вызова системного сервиса или самой Windows. Изменяется привязка к процессорам, из-за чего поток больше не может работать на процессоре, на котором он выполнялся. Планирование в Windows осуществляется на уровне потоков. Поскольку решения, принимаемые в ходе планирования, касаются исключительно потоков, система не обращает внимания на то, какому процессу принадлежит тот или иной поток. Так, если у процесса А есть 10, у процесса В — 2 готовых к выполнению потока, и все 12 имеют одинаковый приоритет, каждый из потоков теоретически получит 1/12 процессорного времени, потому что Windows не станет поровну делить процессорное время между двумя процессами. Уровни приоритета Чтобы понять алгоритмы планирования потоков, необходимо сначала разобраться в уровнях приоритета, используемых Windows. Уровни приоритета назначаются с учетом двух разных точек зрения - Windows API и ядра Windows. Windows API сначала упорядочивает процессы по классам приоритета, назначенным при их создании [Real-time (реального времени), High (высокий), Above Normal (выше обычного), Normal (обычный), Below Normal (ниже обычного) и Idle (простаивающий)], а затем — по относительному приоритету индивидуальных потоков в рамках этих процессов [Time-critical (критичный по времени), Highest (наивысший), Above-normal (выше обычного), Normal (обычный), Below-normal (ниже обычного), Lowest (наименьший) и Idle (простаивающий)]. Базовый приоритет каждого потока в Windows API устанавливается, исходя из класса приоритета его процесса и относительного приоритета самого потока. Если у процесса только одно значение приоритета (базовое), то у каждого потока их два: текущее и базовое. Решения, связанные с планированием, принимаются на основе текущего приоритета. В определенных обстоятельствах система может на короткое время повышать приоритеты потоков в динамическом диапазоне (1-15). Windows никогда не изменяет приоритеты потоков в диапазоне реального времени (16-31), поэтому у таких потоков базовый приоритет идентичен текущему. Обычно базовый приоритет процесса (а значит, и базовый приоритет первичного потока) по умолчанию равен значению из середины диапазонов приоритетов процессов (24, 13, 10, 8, 6 или 4). Однако базовый приоритет некоторых системных процессов (например, диспетчера сеансов, контроллера сервисов и сервера локальной аутентификации) несколько превышает значение по умолчанию для класса Normal (8). Более высокий базовый приоритет по умолчанию обеспечивает запуск потоков этих процессов с приоритетом выше 8. Приоритеты реального времени Можно повысить или понизить приоритет потока любого приложения в динамическом диапазоне; однако, чтобы задать значение из диапазона реального времени, должна быть привилегия Increase Scheduling Priority. Многие важные системные потоки режима ядра выполняются в диапазоне приоритетов реального времени. Поэтому, если потоки слишком долго выполняются с приоритетом этого диапазона, они могут блокировать критичные системные функции (например в диспетчере памяти, диспетчере кэша или драйверах устройств). Состояния потоков Прежде чем перейти к алгоритмам планирования потоков, надо разобраться, в каких состояниях могут находиться потоки в процессе выполнения в Windows 2000 и Windows XP: Ready (готов) Поток в состоянии готовности ожидает выполнения. Выбирая следующий поток для выполнения, диспетчер принимает во внимание только пул потоков, готовых к выполнению. Standby (простаивает) Поток в этом состоянии уже выбран следующим для выполнения на конкретном процессоре. В подходящий момент диспетчер переключает контекст на этот поток. В состоянии Standby может находиться только один поток для каждого процессора в системе. Поток может быть вытеснен даже в этом состоянии (если, например, до начала выполнения потока, который пока находится в состоянии Standby, к выполнению будет готов поток с более высоким приоритетом). Running (выполняется) Поток переходит в это состояние и начинает выполняться сразу после того, как диспетчер переключает на него контекст. Выполнение потока прекращается, как только он завершается, вытесняется потоком с более высоким приоритетом, переключает контекст на другой поток, самостоятельно переходит в состояние ожидания или истекает выделенный ему квант процессорного времени (и другой поток с тем же приоритетом готов к выполнению). Waiting (ожидает) Поток входит в состояние Waiting несколькими способами. Он может самостоятельно начать ожидание на синхронизирующем объекте или его вынуждает к этому подсистема окружения. По окончании ожидания поток — в зависимости от приоритета — либо немедленно начинает выполняться, либо переходит в состояние Ready. Transition (переходное состояние) Поток переходит в это состояние, если он готов к выполнению, но его стек ядра выгружен из памяти. Как только этот стек загружается в память, поток переходит в состояние Ready. Terminated (завершен) Заканчивая выполнение, поток переходит в состояние Terminated. После этого блок потока исполнительной системы (структура данных в пуле неподкачиваемой памяти, описывающая данный поток) может быть удален, а может быть и не удален — это уже определяется диспетчером объектов. Initialized (инициализирован) В это состояние поток входит в процессе своего создания. 59. Обработка прерываний в Windows 2000. Драйверам устройств необходим способ сообщения NT, что они хотят, чтобы исполнялась определенная функция, когда процессор получает прерывание, относящееся к их устройствам. Для этого драйверы устройств с помощью Диспетчера ввода/ вывода регистрируют функцию обработки прерывания (Interrupt Service Routine, ISR) посредством вызова функции loConnectlnterrupt. Параметры, передаваемые в loConnectlnterrupt описывают все свойства ISR драйвера, включая ее адрес, прерывание, к которому подключена ISR и то, могут ли другие устройства совместно использовать это же прерывание. Функция loConnectlnterrupt инициализирует объект-прерывание (Interrupt Object), для того чтобы хранить информацию о прерывании и подключенной ISR. loConnectlnterrupt программирует также аппаратуру прерываний для того, чтобы указывать код, который loConnectlnterrupt поместила в объект-прерывание. Таким образом, когда CPU получит прерывание, управление немедленно перейдет к коду в объекте-прерывание. Этот код вызовет вспомогательную функцию обслуживания прерывания, KilnterruptDispatch, которая повысит уровень IRQL процессора, вызовет соответствующую ISR, и понизит IRQL до предыдущего значения. KilnterruptDispatch также получает спин-блокировку, индивидуальную для прерывания, и удерживает ее, пока выполняется ISR (см. раздел «Механизмы синхронизации»). Спин-блокировка гарантирует, что ISR не будет одновременно исполняться более чем на одном процессоре, а это может привести к печальным последствиям. В NT, ISR обычно не делает ничего, кроме чтения минимального количества информации из прерывающего устройства и подтверждения устройству того факта, что драйвер «увидел» прерывание. В других операционных системах ISR часто выполняют дополнительные обязанности, такие, как полная обработка прерывания путем чтения больших буферов данных, или записи больших буферов данных в устройство. Однако, одна из задач NT - минимизировать время, проводимое на повышенных уровнях IRQL, поэтому NT откладывает большую часть обслуживания прерывания до момента уменьшения уровня IRQL. Процедуры ISR запрашивают отложенный вызов процедур (Deferred Procedure Call, DPC) для информирования Диспетчера ВВОДА/ВЫВОДА о том, что у них имеется работа для исполнения на нижнем уровне IRQL. DPC - еще одна функция в драйвере, которую вызовет Диспетчер ввода/вывода после завершения ISR; DPC осуществляет почти все взаимодействие с устройством. Рис. 14 описывает типичный ход обслуживания прерывания NT. Контроллер устройства генерирует сигнал прерывания на шине процессора, который обрабатывает контроллер прерываний процессора. Этот сигнал служит причиной для CPU для выполнения кода в объекте-прерывании, зарегистрированном для прерывания. Этот код, в свою очередь, вызывает вспомогательную функцию Kilnterrupt Dispatch. KilnterruptDispatch вызывает ISR драйвера, которая запрашивает DPC. NT также имеет механизм обработки прерываний, не зарегистрированных драйверами устройств. В процессе инициализации системы NT программирует контроллер прерываний так, чтобы указывать на функции ISR по умолчанию. Функции ISR по умолчанию осуществляют специальную обработку, когда система генерирует ожидаемые прерывания. Например, ISR ошибки отсутствия страницы должна выполнить обработку в ситуации, при которой программа ссылается на виртуальную память, которая не имеет выделенного пространства в физической памяти компьютера. Такая ситуация может возникнуть когда программы взаимодействуют с файловой системой для получения данных из файла подкачки или исполняемого файла, или когда программы ссылаются на недействительный адрес. NT программирует незарегистрированные прерывания так, чтобы они указывали на обработчики ISR, которые распознают, что система сгенерировала неразрешенное прерывание. Почти все эти ISR высвечивают синий экран смерти (BSOD - blue screen of death) для уведомления системного администратора о том, что произошло неразрешенное прерывание. Объекты Windows 2000 Информация про nt 4.0, но думаю, разницы нету большой Диспетчер Объектов (object manager), который является вероятно наименее известной из подсистем Исполнительной Системы NT, является также одним из наиболее важных. Главная роль операционной системы - это управление физическими и логическими ресурсами компьютера. Другие подсистемы Исполнительной Системы используют Диспетчер Объектов, чтобы определять и управлять объектами, которые представляют ресурсы. Диспетчером объектов нельзя манипулировать из пользовательского режима напрямую, а его пространство имен является невидимым. Диспетчер Объектов исполняет обязанности: Поддержание единого пространства имен для всех именованных объектов системы. Отвечает за создание, удаление и управление именованными и неименованными объектами ОС, представляющими системные ресурсы. Обязанности по управлению объектами включают в себя идентификацию и подсчет ссылок. Когда прикладная программа открывает ресурс, Диспетчер Объектов или определяет местонахождение связанного с ресурсом объекта, или создает новый объект. Вместо возвращения прикладной программе, которая открыла ресурс, указателя на объект, Диспетчер Объектов возвращает непрозрачный (не имеющий смысла) идентификатор, называемый дескриптором. Значение дескриптора уникально в рамках прикладной программы, которая открыла ресурс, но не уникально между различными прикладными программами. Таблица 2. Типы объектов и подсистемы исполнительной системы, которые ими управляют Тип Объекта Какой ресурс представляет Подсистема Тип Объекта (Object type) Объект типа объекта Диспетчер объектов Директория (Directory) Пространство имен объектов Диспетчер объектов Символическая Связь (SymbolicLink?) Пространство имен объектов Диспетчер объектов Событие (Event) Примитив синхронизации Исполнительный модуль Пара Событий (Event-Pair) Примитив синхронизации Исполнительный модуль Мутант (Mutant) Примитив синхронизации Исполнительный модуль Таймер (Timer) Таймерное предупреждение Исполнительный модуль Семафор (Semaphore) Примитив синхронизации Исполнительный модуль Станция Windows (Windows Station) Интерактивный вход в систему Поддержка среды Win32 Рабочий Стол (Desktop) Рабочий Стол Windows Поддержка среды Win32 Файл (File) Отслеживание открытых файлов Диспетчер ввода/вывода Завершение ввода/вывода (I/O Completion) Отслеживание завершения ввода/вывода Диспетчер ввода/вывода Адаптер (Adapter) Ресурс прямого Доступа к Памяти (DMA) Диспетчер ввода/вывода Контроллер (Controller) Контроллер DMA Диспетчер ввода/вывода Устройство (Device) Логическое или физическое устройство Диспетчер ввода/вывода Драйвер (Driver) Драйвер устройства Диспетчер ввода/вывода Ключ (Key) Вход в реестре Диспетчер конфигурации Порт (Port) Канал связи Средство LPC Секция (Section) Отображение в памяти Диспетчер памяти Процесс (Process) Активный процесс Диспетчер процессов Поток (Thread) Активный поток Диспетчер процессов Маркер (Token) Профиль безопасности про- цесса Диспетчер процессов Профиль (Profile) Измерение производительности Ядро Прикладная программа использует дескриптор, чтобы идентифицировать ресурс в последующих операциях. Когда прикладная программа закончила работу с объектом, она закрывает дескриптор. Диспетчер Объектов использует подсчет ссылок, чтобы проследить сколько элементов системы, включая прикладные программы и подсистемы Исполнительной Системы, обращаются к объекту, который представляет ресурс. Когда счетчик ссылок обнуляется, объект больше не используется как представление ресурса, и Диспетчер Объектов удаляет объект (но не обязательно ресурс). Для обеспечения идентификации объектов, Диспетчер Объектов реализует пространство имен NT. Все разделяемые ресурсы в NT имеют имена, располагающиеся в этом пространстве имен. Например, когда программа открывает файл, Диспетчер Объектов анализирует имя файла для выявления драйвера файловой системы (FSD) для диска, который содержит файл. Точно так же, когда прикладная программа открывает ключ Реестра, Диспетчер Объектов по имени ключа Реестра определяет, что должен быть вызван Диспетчер Конфигурации. Рассмотрим следующий пример: Прикладная программа вызывает функцию Win32 CreateFile() с именем файла «c:\mydir\file.txt». При этом происходят следующие действия: 1 Вызов системного сервиса NtCreateFile(). В качестве имени ему будет передано «\??\c:\mydir\file.txt». Такой формат имени является «родным» для NT, точнее - это формат имени в пространстве имен Диспетчера Объектов. 2 Диспетчер Объектов начнет последовательно разбирать переданное имя. Первым будет разобран элемент «\??». Корень пространства имен содержит объект с таким именем. Тип объекта - «Directory». В этой директории будет произведен поиск объекта с именем «с:». Это - «SymbolicLink» - ссылка на имя «\Device\Harddisk0\ Partition 1». Дальнейшему разбору будет подвергнуто имя «\Device\Harddisk0\Partitionl\ mydir\file.txt». Разбор будет закончен при достижении объекта, не являющегося директорией или символической связью. Таким объектом будет «Partition 1», имеющий тип «Device». Этому объекту для дальнейшей обработки будет передано имя «\mydir\file.txt».