L_SPPO

advertisement
Программное обеспечение вычислительной системы
Программное и аппаратное обеспечение в компьютере работают в
неразрывной связи и в непрерывном взаимодействии. Между программами, как и
между физическими узлами и блоками существует взаимосвязь – многие
программы работают, опираясь на другие программы более низкого уровня.
Уровни программного обеспечения (ПО) представляют собой пирамидальную
конструкцию. Каждый следующий уровень опирается на программное
обеспечение предшествующих уровней (рис.1).
Прикладное ПО
Служебное ПО
Системное ПО
Базовое ПО
Рис.1. Уровни программного обеспечения вычислительной системы
Базовый уровень
Самый низкий уровень ПО. Оно отвечает за взаимодействие с базовыми
аппаратными средствами и, как правило, входит в состав базового оборудования и
хранится в микросхемах, называемых постоянными запоминающими
устройствами: ПЗУ – ROM (Read Only Memory). В тех случаях, когда изменение
базовых программных средств во время эксплуатации является технически
целесообразным, вместо микросхем ПЗУ применяют перепрограммируемые ПЗУ:
ППЗУ – ERROM. Изменение содержания ПЗУ можно выполнять либо
непосредственно в составе вычислительной системы (флэш-технология), либо
вне ее, с помощью программаторов.
Системный уровень
Является переходным уровнем. Программы, работающие здесь,
обеспечивают взаимодействие прочих программ вычислительной системы с
программами базового уровня и непосредственно с аппаратным обеспечением.
Конкретные программы, отвечающие за взаимодействие с конкретными
устройствами, называются драйверами устройств – входят состав ПО этого
уровня. Другой класс программ системного уровня отвечает за взаимодействие с
пользователем. Такие программы называют средствами обеспечения
1
пользовательского интерфейса. От них зависит удобство работы с компьютером
и производительность труда. Совокупность ПО системного уровня образует ядро
операционной системы (ОС).
Служебный уровень
Программы этого уровня взаимодействуют как с ПО базового уровня, так и с
ПО системного уровня. Их называют утилиты. Основное назначение утилит
состоит в автоматизации работ по проверке, наладке и настройке компьютерной
системы. Некоторые утилиты входят в состав ОС, но большинство их них
являются для ОС внешними и служат для расширения ее функций.
Прикладной уровень
ПО прикладного уровня – это комплекс прикладных программ, с помощью
которых на данном рабочем месте выполняются конкретные задания. Спектр этих
заданий необычайно широк: от производственных до творческих и
развлекательно-обучающих.
Можно назвать следующие виды прикладного ПО:
1. Текстовые редакторы – ввод и редактирование текстовых данных.
2. Текстовые процессоры – позволяют форматировать (оформлять) текст.
3. Графические редакторы – создание и обработка графических
изображений. Бывают растровые, векторные и 3D-редакторы.
4. Системы управления базами данных – создание, заполнение, доступ к
данным, а также поиск и фильтрация данных.
5. Электронные таблицы – для хранения и обработки числовых данных.
6. Системы автоматизированного проектирования – для автоматизации
проектно-конструкторских работ.
7. Настольные издательские системы – для автоматизации процесса верстки
полиграфических изданий.
8. Экспертные системы – для анализа данных, содержащихся в базах знаний,
и выдачи рекомендаций по запросу пользователя.
9. Web-редакторы – для создания и редактирования Web-страниц Интернета.
10.Браузеры – для просмотра Web-документов.
11.Интегрированные системы делопроизводства – для автоматизации
рабочего места руководителя.
12. Финансовые аналитические системы – используются в банковских и
биржевых структурах.
13.Геоинформационные системы – для автоматизации картографических и
геодезических работ.
14. и.т.д.
Системное программное обеспечение
Системное программное обеспечение (System Software) – программы и
комплексы программ, являющиеся общими для всех, кто совместно использует
технические средства компьютера, и применяемые как для автоматизации
2
создания новых программ, так и для организации выполнения программ
существующих. С этих позиций системное ПО может быть разделено на
следующие пять групп:
1. Операционные системы.
2. Системы управления файлами.
3. Интерфейсные оболочки для взаимодействия пользователя с ОС и
программные среды..
4. Системы программирования.
5. Утилиты.
Под операционной системой обычно понимают комплекс управляющих и
обрабатывающих программ, который, с одной стороны, выступает как интерфейс
между аппаратурой компьютера и пользователем с его задачами, а с другой –
предназначен
для
наиболее
эффективного
использования
ресурсов
вычислительной системы и организации надежных вычислений. Любой из
компонентов прикладного ПО обязательно работает под управлением ОС.
Основными функциями, которые выполняет ОС являются следующие:
 прием от пользователя заданий или команд;
 прием и исполнение программных запросов на запуск, приостановку,
остановку других программ;
 загрузка в оперативную память подлежащих исполнению программ;
 инициация программы (передача ей управления для исполнения
процессором этой программы);
 идентификация всех программ и данных;
 обеспечение работы систем управлений файлами;
 обеспечение режима мультипрограммирования (выполнение двух или более
программ на одном процессоре);
 обеспечение функций по организации и управлению
операциями
ввода/вывода;
 удовлетворение жестким ограничениям на время ответа в режиме реального
времени;
 распределение реальной памяти и организация виртуальной памяти;
 планирование и диспетчеризация задач, в соответствии с заданными
стратегиями и дисциплинами обслуживания;
 организация механизмов обмена сообщениями и данными между
выполняющимися программами;
 предоставление услуг на случай частичного сбоя системы;
 обеспечение работы систем программирования.
Назначение системы управления файлами – организация более удобного
доступа к данным, организованным как файлы. Как правило, все современные ОС
имеют в своем составе эту систему. Выделение ее в отдельную категорию
обусловлено тем, что ряд ОС могут работать с несколькими файловыми
3
системами. В этом случае говорят о монтируемых файловых системах, в этом
смысле они самостоятельны.
Для удобства взаимодействия с ОС могут использоваться дополнительные
интерфейсные оболочки. Их основное назначение – либо расширить возможности
по управлению ОС, либо изменить встроенные в систему возможности. Ряд ОС
могут организовать выполнение программ, созданных для других ОС. К этому же
классу системного ПО можно отнести и эмуляторы, позволяющие смоделировать
в одной ОС какую-либо другую машину или ОС. Известна система эмуляции
VMWARE, которая позволяет запустить в среде Linux любую другую ОС,
например Windows.
Система программирования предназначена для автоматизации создания
новых программ. Она содержит транслятор с соответствующего языка,
библиотеки подпрограмм, редакторы, компоновщики и отладчики. Любая система
программирования может только работать в соответствующей ОС, под которую
она и создана, однако при этом она может позволять разрабатывать программное
обеспечение и под другие ОС.
Под утилитами понимают специальные системные программы, с помощью
которых можно как обслуживать саму ОС, так и подготавливать для работы
носители данных, выполнять перекодирование данных, осуществлять
оптимизацию размещения данных на носителе и производить некоторые другие
работы, связанные обслуживанием вычислительной системы.
Основные понятия теории операционных систем
Операционная система:
 выполняет функции управления вычислительными процессами в
вычислительной системе;
 распределяет ресурсы вычислительной системы между различными
вычислительными процессами;
 образует программную (операционную) среду, в которой выполняются
прикладные программы пользователей.
Параллельное существование терминов «операционная система» и
«операционная среда» вызвано тем, что ОС может в общем случае поддерживать
несколько операционных сред. Можно сказать , что операционная среда – это то
системное программное окружение, котором могут выполняться программы,
созданные по правилам работы этой среды.
Понятие вычислительный процесс или просто процесс является одним из
основных при рассмотрении ОС. Последовательный процесс может включать в
себя несколько задач. Задачей называют единицу работы, для выполнения
которой предоставляется центральный процессор.
Примеры процессов:
4
 выполнение прикладных программ пользователей;
 редактирование текста;
 трансляция исходной программы;
 компоновка объектного модуля;
 исполнение загрузочного модуля;
 и.т.д.
Определение концепции процесса необходимо для выработки механизмов
распределения и управления ресурсами. Понятие ресурса – это также основное
понятие ОС. Ресурсом называется всякий объект, который может распределяться
внутри системы.
Ресурсы бывают:
1. Делимые:
a) используемые одновременно;
b) используемые параллельно.
2. Неделимые.
При разработке первых ОС ресурсами считались:
 процессорное время;
 память;
Системные ресурсы
 каналы ввода/вывода;
 периферийные устройства.
Например, внешняя память может разделяться одновременно, а доступ к ней
– попеременно. Внешние устройства прямого доступа могут использоваться
параллельно, а последовательного доступа, например принтер, не может
считаться разделяемым ресурсом.
В настоящее время понятие ресурса превратилось в абстрактную структуру с
целым рядом атрибутов, характеризующих способы доступа к этой структуре и ее
физическое представление в системе. Кроме системных ресурсов, как ресурс
стали толковать и такие объекты, как сообщения и синхросигналы, которыми
обмениваются задачи.
Введение в состав вычислительной машины специальных контроллеров
позволило совместить во времени (распараллелить) операции вывода данных и
последующие вычисления на центральном процессоре. Но все равно процессор
продолжал часто и долго простаивать, дожидаясь завершения очередной
операции ввода/вывода. Поэтому был организован мультипрограммный
(многозадачный) режим работы вычислительной системы. Суть его состоит в том,
что пока один процесс (задача) ожидает завершения очередной операции
ввода/вывода, другая задача может быть поставлена на решение.
Ресурс может быть выделен задаче, обратившейся к супервизору ОС, если:
 он свободен и в системе нет запросов от задач более высокого приоритета к
этому же ресурсу;
5
 текущий запрос и ранее выданные запросы допускают совместное
использование ресурсов;
 ресурс используется задачей низшего приоритета и может быть временно
отобран.
В обычных ОС процесс появляется при запуске какой-нибудь программы. Он
всегда находится в активном состоянии. В ОС реального времени многие
процессы могут находиться в состоянии бездействия, т.е. находятся в пассивном
состоянии.
Активный процесс, в свою очередь, может быть в одном из следующих
состояний:
 выполнения (running) – все затребованные процессом ресурсы выделены. В
таком состоянии в однопроцессорной вычислительной системе находиться только
один процесс;
 готовности к выполнению (ready) – ресурсы могут быть предоставлены,
тогда процесс перейдет в состояние выполнения;
 ожидания (блокирования – blocked) – затребованные ресурсы не могут быть
предоставлены, или не завершена операция ввода/вывода.
За время своего существования процесс может неоднократно совершать
переходы из одного состояние в другое. Возможные переходы процесса
изображены в виде графа состояний на рис. 2.
Выполнение
(running)
ОСРВ
Бездействие
(пассивное
состояние)
ОС
Готовность к
выполнению
(ready)
Ожидание
(blocked)
Рис. 2. Граф состояний процесса
Процесс из состояния бездействия может перейти в состояние готовности в
следующих случаях:
 по команде пользователя;
6
 при выборе из очереди планировщиком;
 по вызову из другой задачи;
 по прерыванию от внешнего устройства, запускающего задачу;
 при наступлении запланированного времени запуска программы.
Процессу, находящемуся в состоянии готовности, выделены все
необходимые ресурсы, кроме центрального процессора. При выделении
процессора он перейдет в состояние выполнения.
Из состояния выполнения процесс может выйти по одной из следующих
причин:
 процесс сообщает супервизору ОС о своем завершении. Супервизор либо
переводит его в список бездействующих процессов, либо уничтожает;
 процесс переводится супервизором ОС в состояние готовности в связи с
появлением более приоритетной задачи или в связи с окончанием выделенного
ему кванта времени;
 процесс блокируется либо вследствие запроса операции ввода/вывода, либо
в силу невозможности предоставить запрошенный ресурс.
При наступлении соответствующего события (завершилась операция
ввода/вывода, освободился затребованный ресурс, в оперативную память
загружена необходимая страница виртуальной памяти) процесс деблокируется и
переводится в состояние готовности.
Таким образом, движущей силой, меняющей состояние процессов, являются
события. Один из основных видов событий – это прерывания.
Понятие
процесса
было
введено
для
реализации
идей
мультипрограммирования, а для реализации мультизадачности в ее исходном
толковании ввели так называемые «легковесные» процессы – потоки или треды
(tread – поток, нить). Когда говорят о процессах, тем самым отмечают их
обособленность: у каждого процесса имеется свое виртуальное адресное
пространство, каждому процессу назначаются свои ресурсы. В процессах же
может быть внутренний параллелизм. Если процесс разбить на подпроцессы
(потоки), то у пользователя появляется возможность параллельно выполнять
несколько операций в рамках одного процесса. Потоки не имеют собственных
ресурсов, они развиваются в том же адресном пространстве, что и данный
процесс. Единственно, что им нужно иметь, – это процессорный ресурс.
Итак, сущность «поток» была введена для того, чтобы именно с помощью
этих единиц распределять процессорное время между возможными работами.
7
Прерывания
Прерывания – это механизм, позволяющий координировать параллельное
функционирование отдельных устройств вычислительной системы и реагировать
на особые состояния, возникающие при работе процессора. Прерывание
обеспечивает принудительную передачу управления от выполняемой программы
к соответствующей программе обработки прерывания (ISR – Interrupt Service
Routine) при возникновении определенного события. Основная цель введения
прерываний – реализация асинхронного режима работы и распараллеливания
работы отдельных устройств вычислительной системы.
Механизм прерываний реализуется аппаратно-программными средствами и
включает следующие элементы:
1. Прием сигнала на прерывание и его идентификация.
2. Запоминание состояния прерванного процесса.
3. Управление аппаратно передается подпрограмме обработки прерывания.
4. Обработка прерывания с помощью ISR.
5. Восстановление информации, относящейся к прерванному процессу.
6. Возврат в прерванную программу.
Рис.3. иллюстрирует, что происходит при возникновении запроса на прерывание.
Прерывание
Исполняемая
программа
Отключение прерываний,
сохранение контекста
прерванной программы,
установка режима работы
системы прерываний
Собственно тело ISR
Восстановление контекста
прерванной ранее
программы, установка
прежнего режима работы
системы прерываний
Программа обработки прерывания
Рис.3. Обработка прерывания
Прерывания, возникающие при работе вычислительной системы, можно
разделить на два основных класса: внешние и внутренние.
8
Внешние прерывания вызываются асинхронными событиями, которые
происходят вне прерываемого процесса, например:
 прерывания от таймера;
 прерывания по вводу/выводу;
 прерывания по нарушению питания.
Внутренние прерывания вызываются событиями, которые связаны с работой
процессора и являются синхронными с его операциями, например:
 при нарушении адресации;
 при делении на нуль;
 при наличии в поле кода операции незадействованной двоичной
комбинации.
Существуют, наконец, собственно программные прерывания, происходящие
по соответствующей команде прерывания: INT(«номер прерывания»).
Сигналы, вызывающие прерывания, формируются вне процессора или в
самом процессоре; они могут возникать одновременно. Выбор одного из них для
обработки осуществляется на основе приоритетов (рис.4).
Средства контроля процессора
Высокий
приоритет
Внешние устройства
Программные прерывания
Низкий
приоритет
Рис.4. Распределение прерываний по уровням приоритета
Процессор может обладать средствами защиты от прерываний: отключение
системы прерываний, маскирование (запрет) отдельных прерываний.
Программное управление специальными регистрами маски (маскируемые
прерывания) позволяет реализовать различные дисциплины обслуживания.
Для полного понимания принципов создания и механизмов реализации
современных ОС необходимо знать архитектуру 32-разрядных микропроцессоров
i80×86, применяемых в персональных компьютерах.
9
Классификация операционных систем
Для ОС давно сформировалось небольшое количество классификаций:
 по назначению;
 по режиму обработки задач;
 по способу взаимодействия с системой;
 по способам построения.
Различают ОС общего и специального назначения. Последние
подразделяются: для переносных микрокомпьютеров и различных встроенных
систем, организации и веления баз данных, решения задач реального времени.
По режиму обработки задач различают ОС, обеспечивающие
однопрограммный и мультипрограммный режимы (создают видимость
одновременного выполнения нескольких программ).
При организации работы с вычислительной системой в диалоговом режиме
можно
говорить
об
однопользовательских
(однотерминальных)
и
мультитерминальных ОС. Например, мультитерминальной ОС для ПК является
Linux. Очевидно, что для организации мультитерминального доступа необходимо
обеспечить мультипрограммный режим работы. Однопрограммной и
однопользовательской является OS MS-DOS.
Основной особенностью операционных систем реального времени (ОСРВ)
является обеспечение обработки поступающих заданий в течении заданных
интервалов времени, которые нельзя превышать. Одной из наиболее известных
ОСРВ для ПК является OS QNX.
Для организации совместного использования информационного пространства
и общих ресурсов используются сетевые ОС. В качестве примера можно назвать
UNIX, Windows NT.
По основному архитектурному принципу ОС разделяются на микроядерные и
монолитные. Микроядерной является OS QNX, а монолитной – Windows 95/98.
Ядро OS Windows мы не можем изменить, исходные коды нам не доступны и нет
программы для сборки ядра. В OS Linux мы можем сами собрать ядро, включив в
него необходимые нам программные модули и драйверы.
10
Архитектура аппаратных и программных средств
персонального компьютера
В самом общем виде аппаратные средства персонального компьютера можно
представить в виде нескольких блоков (рис.1).
Шина данных
Шина адреса
Шина управления
Процессор
Память
Порты
Рис.1. Аппаратные средства персонального компьютера
Шина данных используется для переноса информации между основными
узлами компьютера. Перенос данных происходит по параллельным линиям, их
количество называют шириной шины.
Шиной адреса управляет микропроцессор.
Память может быть односторонней (чтение) – ПЗУ (ROM) хранит
программы и данные, образующие в совокупности базовую систему ввода/вывода
BIOS и двухсторонней (чтение и запись) – оперативная память (RAM).
Порты – специальные аппаратные регистры, используемые для управления
аппаратными средствами ПК. Каждый порт имеет свой уникальный номер.
На шине управления микропроцессор выставляет команды управления узлами
системы и получает ответные сигналы состояния узлов и подтверждение
выполнения команды.
Ширина шины данных и ширина шины адреса являются важнейшими
характеристиками микропроцессора. Микропроцессоры Intel 8086/88 имеют 20разрядную шину адреса и 16/8-разрядную шину данных. Ширина шины адреса
устанавливает для ПК IBM PS XT, основанного на микропроцессоре i8088,
ограничение на объем адресуемой памяти в 1 Мбайт (220 байт).
11
Микропроцессоры Intel 8086/88 работают в реальном режиме (real mode):
 адрес памяти, формируемый микропроцессором, является физически
адресом;
 все машинные команды системы команд микропроцессора разрешены для
исполнения любой программой;
 объем адресуемой памяти ≤ 1Мбайт.
Регистры микропроцессоров Intel 8086/88
Все регистры условно можно разбить на три группы:
a) регистры общего назначения (РОН) – AX, BX, CX, DX – 16-разрядные;
b) регистры-указатели: DI, SI, BP, SP, IP – 16-разрядные;
c) сегментные регистры: CS, DS, ES, SS – 16- разрядные.
8
15
0
AH
AL
BH
BL
CH
CL
DH
DL
AX
BX
CX
DX
Рис.2. Регистры общего назначения микропроцессора Intel 8086/88
РОН микропроцессора Intel 8088 – 8-разрядные, позволяют обращаться к
целому слову (два байта) в регистре AX, BX, CX, DX или к отдельным байтам
(AH, BH, CH, DH – к старшему байту, AL, BL, CL, DL – к младшему байту). РОН
микропроцессора Intel 8086 – только 16-разрядные (рис.2).
РОН используются для промежуточного хранения операндов.
Регистры-указатели допускают доступ только к целому слову в регистре.
Регистр IP в паре с регистром CS задает физический адрес в памяти
следующей машинной команды: (CS:IP).
Регистр флагов или слово состояния процессора (PSW) содержит 16 бит, из
которых используется только 9 (рис.3).
15
14
13
12
× × × ×
11
OF
DF
10
IF
9
8
TF
7
SF
6
ZF
5
×
4
AF
3
×
2
PF
Рис.3. Регистр флагов микропроцессоров Intel 8086/88
1
×
0
CF
12
Флаги условий устанавливаются аппаратурой арифметико-логического
устройства микропроцессора по результатам выполнения машинной команды:
 CF – флаг переноса;
 PF – флаг паритета;
 AF – флаг дополнительного переноса;
 ZF –флаг нуля;
 SF – флаг знака;
 OF – флаг переполнения;
Флаги управления влияют на функционирование аппаратуры процессора:
 TF – флаг трассировки;
 DF – флаг направления;
 IF – флаг управления маскируемыми прерываниями (1- процессор
реагирует на прерывания, генерируемые внешними устройствами, 0 – не
реагирует).
Формирование физического адреса
Так как внутренние регистры – 16-разрядные (216 = 64 Кбайт), а шина адреса
имеет ширину 20 бит (220 = 1Мбайт), то для формирования 20-разрядного
физического адреса памяти используются: сегмент адреса и смещение адреса.
Физический адрес записывается парой этих значений, разделенных двоеточием, и
образуется следующим образом (рис.4):
 значение сегмента адреса, берущегося из регистра, CS сдвигается на 4
бита влево с заполнением разрядов справа нулями;
 к образовавшемуся 20-битовому значению прибавляется значение
смещения адреса из регистра IP. При возникновении переполнения берется только
пять 16-ричных цифр результата.
Например, адрес 40:1Ch соответствует физическому адресу 0041Ch.
Значение регистра CS
Регистр CS
0
0
15
0
0
0
0
0
0
0
+
Регистр IP
15
=
0
Физический
адрес
19
0
Рис.4. Схема определения физического адреса для микропроцессоров 8086/88
13
Прерывания
Микропроцессоры Intel 8086/88 поддерживают 256 прерываний. Каждое из
них имеет свой номер и ISR. Адрес точки входа в ISR называется вектором
прерываний и хранится в специальной таблице, называемой таблицей векторов
прерывания (ТВП). Код ISR может располагаться в любом месте памяти. Поэтому
вектор прерывания занимает 4 байта:
 2 байта отводится на значение сегмента адреса – значение регистра CS;
 2 байта – на значение смещения, устанавливаемое в регистре IP.
Вся ТВП занимает 256*4 = 1024 байта и хранится в оперативной памяти,
начиная с адреса 0000:0000.
При возникновении прерывания процессор помещает в стек 6 байт:
 текущее значение регистра CS;
 текущее значение регистра IP;
 2 байта флагов процессора;
 в CS и IP устанавливаются значения из ТВП, задающие начальный адрес
ISR.
Прерыванию «0» соответствует вектор прерывания по адресу 0000:0000.
Прерыванию «1» соответствует вектор прерывания по адресу 0000:0004h.
Прерыванию «2» соответствует вектор прерывания по адресу 0000:00008h.
…………………………………………………………………………………..
В процессе функционирования ПК могут встретиться 4 типа прерываний:
1. Аппаратные.
Они возникают как результат внешних событий, и их генерирует специальная
микросхема ПК i8259A – программируемый контроллер прерываний (PIC). Она
рассчитана на 8 входов запросов прерываний (IR – Interrupt Request). Сигналы на
ней возбуждают внешние устройства: таймер, клавиатура, дисководы и т.д. Выход
этой микросхемы подается на специальный вход процессора INTR. Этот вход
является маскируемым: если флаг IF равен 1, то процессор реагирует на
прерывания по этой линии, флаг IF сброшен в 0, то – нет;
2. Немаскируемые прерывания.
Процессор, кроме входа INTR, имеет вход немаскируемых прерываний NMI.
Сигнал по этому входу не может быть блокирован программным образом и
вызывает прерывание с номером «2». Это прерывание имеет более высокий
приоритет, чем по входу INTR и используется для организации реакции процессора
на критические ситуации.
3. Программные прерывания.
Осуществляется по программной инструкции INT(«номер прерывания»).
4. Исключительные ситуации.
Генерация внутренних прерываний процессором при возникновении
необычных условий при выполнении машинных команд, например «деление на
нуль», «пошаговое исполнение»..
14
Особенности архитектуры микропроцессоров i80x86
Под обозначением i80x86 будем понимать любые 32-битовые
микропроцессоры, имеющие такой основной набор команд, как и в первом 32битовом микропроцессоре Intel 80386.
1. Реальный и защищенный режимы работы процессора
Первым микропроцессором, на базе которого была создана IBM PC, был 16ти разрядный микропроцессор Intel 8088. Он отличается от первого 16-битового
микропроцессора Intel 8086 тем, что у него была 8-битовая шина данных, а не 16ти битовая как у 8088. Эти микропроцессоры были предназначены для работы в
однозадачном режиме, специальных аппаратных средств для поддержки
мультипрограммных ОС в них не было. Поэтому для совместимости с первыми
компьютерами (программных продуктов было создано уже много) в
последующих версиях микропроцессоров была реализована возможность
использовать их в двух режимах – реальном (real mode – так назвали режим
работы первых 16-битовых микропроцессоров) и защищенном (protected mode –
означает, что параллельные вычисления могут быть защищены аппаратнопрограммными механизмами)
В 16-ти битовых микропроцессорах i80x86 обращение к памяти в 1 Мбайт
производилось посредством механизма сегментной адресации. Этот механизм
увеличивал количество разрядов, участвующих в указании адреса ячейки памяти,
с 16 до 20 и тем самым увеличивал объем адресуемой памяти от 64 Кбайт (2 16) до
1 Мбайт (220).
В защищенном режиме работы определение физического адреса
осуществляется совершенно иначе. Прежде всего используется сегментный
механизм для организации виртуальной памяти. При этом адреса задаются 32битовыми значениями. Для изучения всего этого рассмотрим новые
архитектурные возможности микропроцессора i80x86.
2. Новые системные регистры микропроцессоров i80х86
a) 32-битовый указатель команды EIP , младшие 16 разрядов есть регистр
IP микропроцессора i8086/88;
b) 32-битовый регистр флагов EFLAGS, младшие 16 разрядов есть регистр
FLAGS микропроцессора i8086/88;
c) 32-битовые регистры общего назначения EAX, EBX, ECX, EDX, а также
ESP, EBP, ESI, EDI, а их младшие 16 разрядов есть регистры микропроцессора
i8086/88: AX, BX, CX, DX, SP, BP, SI, DI;
d) 16-битовые сегментные регистры CS, SS, DS, ES, FS, GS. При каждом из
этих регистров есть недоступные никому, кроме собственно микропроцессора,
64-битовые регистры, в которые загружаются дескрипторы соответствующих
сегментов;
15
e) 16-битовый регистр-указатель на локальную таблицу сегментов
текущей задачи – LDTR. При нем также имеется «теневой» (скрытый от
программиста) 64-битовый регистр, в который микропроцессор заносит
дескриптор, указывающий на таблицу дескрипторов сегментов задачи,
описывающих ее локальное виртуальное адресное пространство;
f) 16-битовый регистр-указатель задачи TR (task register). Указывает на
дескриптор в глобальной таблице дескрипторов, позволяющий получить
доступ к дескриптору задачи TSS – информационной структуре, которая
поддерживает микропроцессор для управления задачами;
g) 48-битовый регистр GDTR глобальной таблицы GDT (global descriptor
table), содержащий как дескрипторы общих сегментов, так и специальные
системные дескрипторы;
h) 48-битовый регистр IDTR таблицы дескрипторов прерываний. Сдержит
информацию, необходимую для доступа к таблице прерываний IDT.
i)32-битовые управляющие регистры CRO, CR1, CR2, CR3. Регистр CR0
содержит флаги, определяющие режим работы микропроцессора. Регистр CR1
предназначен для размещения в нем адреса подпрограммы обработки
страничного исключения. Регистр CR3 содержит номер физической страницы,
в которой располагается таблица каталогов таблиц страниц текущей задачи.
3. Адресация в 32-разрядных микропроцессорах i80х86 при работе в
защищенном режиме
Для организации эффективной и надежной работы ПК в мультипрограммном
режиме необходимо, чтобы:
a) у каждого вычислительного процесса было собственное (локальное)
адресное пространство, которое бы не пересекалось с адресными пространствами
других задач;
b) существовало общее (разделяемое) адресное пространство.
Поэтому в микропроцессорах i80х86 реализован сегментный
способ
организации распределения памяти. Помимо этого, может быть задействована и
страничная трансляция.
Сегментная организация виртуальной памяти состоит в том, что
программа разбивается на логические элементы (например, блоки, процедуры) ─
так называемые сегменты разной длины, которые размещаются в памяти как до
определенной степени самостоятельная единица. Логически обращение к
элементам программы будет представляться как указание имени сегмента и
смещения относительно начала этого сегмента. Физическое имя сегмента (его
порядковый номер) будет соответствовать некоторому адресу, с которого этот
сегмент начинается при его размещении в памяти, и смещение должно
прибавляться к этому базовому адресу. Таким образом, адрес для этого способа
состоит из двух полей: номер сегмента и смещение относительно сегмента.
Каждый сегмент, размещаемый в памяти, имеет соответствующую
информационную структуру, называемую дескриптором сегмента:
16
Старшее двойное слово дескриптора
31
23
База сегмента
(биты 31-24)
G D
19
0
0
Биты
19-16 P
поля Limit
Базовый адрес сегмента (биты 15-0)
31
15
11
DPL
S Type A
7
0
База сегмента
(биты 23-16)
Байт прав доступа
Limit-размер (предел) сегмента (биты 15-0)
15
0
Первое (младшее) двойное слово дескриптора
Рис.1. Дескриптор сегмента
При переключении микропроцессора в защищенный режим он начинает
совершенно другим образом, чем в реальном режиме, вычислять физические
адреса команд и операндов. Прежде всего, содержимое сегментных регистров
интерпретируется иначе: считается, что там содержится не адрес начала сегмента,
а номер соответствующего сегмента. Каждый сегментный регистр (в этом случае
его называют селектор сегмента) разбивается на три поля:
a) поле индекса ─ старшие 13 битов (3-15). Определяют номер сегмента:
b) поле индикатора таблицы сегмента ─ бит с номером 2. Определяет
часть виртуального адресного пространства.
c) поле уровня привилегий ─ биты 0 и 1. Указывает запрашиваемый
уровень привилегий.
Страничная организация виртуальной памяти состоит в том, что все
фрагменты программы, на которые она разбивается произвольным образом,
имеют одинаковую длину. Эти одинаковы части называют страницами и говорят,
что память разбивается на физические страницы, а программа ─ на виртуальные
страницы. Часть виртуальных страниц задачи размещается в оперативной
памяти, а часть ─ во внешней. Величина страницы выбирается кратной степени
двойки. Таким образом, вместо одномерного адресного пространства можно
говорить о двумерном. Первая координата адресного пространства ─ это номер
страницы, а вторая ─ номер ячейки внутри выбранной страницы (его называют
индексом). Таким образом, физический адрес определяется парой (Pp,i), а
виртуальный адрес ─ парой (Pν,i), где Pν ─ номер виртуальной страницы, Pp ─
номер физической страницы, i ─ индекс ячейки внутри страницы. Количество
битов, отводимое под индекс, определяет размер страницы, а количество битов,
отводимое под номер виртуальной страницы ─ объем возможной виртуальной
памяти, которой может воспользоваться программа. При это нет необходимости
ограничивать число виртуальных страниц числом физических, то есть не
поместившиеся страницы можно размещать во внешней памяти, которая в этом
случае служит расширением оперативной. Для отображения виртуального
адресного пространства задачи на физическую память для каждой задачи, как и в
случае сегментного способа, необходимо иметь таблицу страниц для трансляции
адресных пространств. Для описания каждой страницы диспетчер памяти ОС
заводит соответствующий дескриптор.
В микропроцессорах i80х86 размер страницы равен 212=4096=4Кбайт, а поле
номера страницы, имеющей размер 20 битов, разбивается на два поля и
17
осуществляется двухшаговая страничная трансляция. Для описания каждой
страницы создается соответствующий 32-битовый дескриптор. Это дает
возможность адресоваться к любому байту из 232, а шина адреса как раз и
позволяет использовать физическую память с таким объемом. Так что можно
отказаться от сегментного способа адресации. Т.е. можно считать, что задача
состоит из одного сегмента, который разбит на страницы. Такой подход получил
название «плоская память». При использовании плоской памяти упрощается
создание ОС и систем программирования. Поэтому в большинстве 32-разрядных
ОС для микропроцессоров i80х86 используется плоская модель памяти.
4. Система прерываний 32-разрядных микропроцессоров i80х86
В реальном режиме работы система прерываний работает так же, как и для
16-разрядного микропроцессора i8086/8088. Имеется 16 линий запросов на
прерывания (IRQ – Interrupt ReQuest), реализуемых с помощью двух
контроллеров прерываний i8259A, соединенных каскадным образом.
Линии IRQ:
1) 1 – контроллер клавиатуры;
2) 3 – COM2;
3) 4 – COM1;
4) 6 – контроллер FDD;
5) 8 – часы реального времени с автономным питанием;
6) 12 – контроллер мыши типа PS/2;
7) 13 – математический сопроцессор;
8) 14 – контроллер IDE (первый канал);
9) 15 – контроллер IDE (второй канал);
10) 16 – Intel (R) 82801DB/DBM USB Universal Host Controller – 24C2 ;
11) 17 – SoundMax Integrated Digital Audio;
12) 18 – Intel (R) 82801DB/DBM USB Universal Host Controller – 24C7;
13) 19 – Intel (R) 82801DB/DBM USB Universal Host Controller – 24C4;
14) 20 – ASUSTeK/Broadcom 440x10/100 Int…
15) 22 – Microsoft ASPI – Compliant System
16) 23 – Intel PCI to USB enhanced Host Controller
В защищенном режиме система прерываний действует совершенно иначе.
Вместо таблицы векторов используется таблица дескрипторов прерываний IDT.
Здесь хранятся не адреса обработчиков прерываний ISR, а специальные
системные структуры данных, доступ к которым пользовательским программам
запрещен. Каждый элемент в таблице дескрипторов прерываний имеет 8байтовую структуру и может принадлежать к одному из трех типов:
1. Коммутатор прерывания;
2. Коммутатор перехвата;
3. Коммутатор задачи.
18
При обнаружении запроса на прерывание и при условии, что прерывания
сейчас разрешены, процессор действует в зависимости от типа дескриптора,
соответствующего номеру прерывания. Первые два типа дескриптора прерываний
вызывают переход на соответствующие сегменты кода, принадлежащие
виртуальному адресному пространству текущего вычислительного процесса.
Последний тип дескриптора вызывает полное переключение процессора на новую
задачу.
Рассмотрим обработку прерываний в контексте текущей задачи. После
анализа дескриптора процессор выполняет следующие действия:
1. В стек на уровне привилегий текущего сегмента кода помещаются:
a) значения SS и SP, если уровень привилегий в коммутаторе выше
уровня привилегий ранее исполнявшегося кода;
b) регистр флагов EFLAGS;
c) регистры CS и IP.
2. Если тип дескриптора – коммутатор прерывания, то другие прерывания
запрещаются, если – коммутатор перехвата, новые прерывания на период
обработки текущего прерывания не запрещаются;
3. Поле селектора из дескриптора прерываний используется для
индексирования таблицы дескрипторов задачи. Дескриптор сегмента заносится в
теневой регистр, а смещение относительно начала нового сегмента определяется
полем смещения из дескриптора прерывания.
Совершенно иначе обрабатываются прерывания, если дескриптор является
коммутатором задачи. В этом случае происходит полное переключение на новую
задачу, при этом сохраняются все регистры процессора.
В основном обработку прерываний осуществляют в контексте текущей
задачи, так как это повышает быстродействие системы
19
Управление задачами в операционных системах
Время центрального процессора и оперативная память являются основными
ресурсами при реализации мультипрограммных вычислений.
Операционная система выполняет следующие основные функции, связанные
с управлением задачами:
1. Создание и удаление задачи;
2. Планирование процессов и диспетчеризация задач;
3. Синхронизация задач, обеспечение их средствами коммуникации.
Система управления задачами обеспечивает прохождение их через
компьютер. Создание и удаление задач осуществляется по соответствующим
запросам от пользователей или от самих задач. Задача может породить новую
задачу. Основным подходом к организации того или иного метода управления
процессами является организация очередей и ресурсов.
На распределение ресурсов влияют конкретные потребности тех задач,
которые должны выполняться параллельно. Можно столкнуться с ситуациями,
когда невозможно эффективно распределять ресурсы с тем, чтобы они не
простаивали. Например, устройство с последовательным доступом не может
распределяться между параллельно выполняющимися процессами. Если же мы
возьмем набор таких процессов, которые не будут конкурировать между собой за
неразделяемые ресурсы при параллельном выполнении, то процессы смогут
выполниться быстрее. Таким образом, возникает задача подбора такого
множества процессов, что при выполнении они будут как можно реже
конфликтовать из-за имеющихся в системе ресурсов. Такая задача называется
планированием вычислительных процессов.
В настоящее время на первый план вышли задачи динамического
(краткосрочного) планирования, т.е. текущего наиболее эффективного
распределения ресурсов, возникающего практически при каждом событии. Задачи
динамического планирования называют диспетчеризацией.
Долгосрочный планировщик решает, какой из процессов, стоящий во
входной очереди, должен быть переведен в очередь готовых процессов в случае
освобождения ресурсов памяти. Краткосрочный планировщик решает, какая из
задач, находящихся в очереди готовых к выполнению, должна быть предана на
исполнение. В большинстве современных ОС долгосрочный планировщик
отсутствует.
Планирование процессов и диспетчеризация задач
1. Стратегии планирования (диспетчеризации)
Стратегия планирования определяет, какие процессы планируются на
выполнение, чтобы достичь поставленной цели. Существует много стратегий,
можно назвать некоторые из них:
20
a) по возможности заканчивать вычислительные процессы в том же самом
порядке, в котором они были начаты;
b) отдавать предпочтение более коротким процессам;
c) предоставлять всем процессам пользователей одинаковые услуги, в том
числе и одинаковое время ожидания.
Когда говорят о стратегии обслуживания, всегда имеют в виду понятие
процесса, поскольку процесс может состоять из нескольких задач.
2. Дисциплины диспетчеризации
Известно большое количество правил (дисциплин) диспетчеризации, в
соответствии с которыми формируется список (очередь) готовых к выполнению
задач. Различают два больших класса таких дисциплин – бесприоритетные и
приоритетные. При реализации приоритетных дисциплин отдельным задачам
предоставляется преимущественное право попасть в состояние исполнения.
Рассмотрим кратко некоторые наиболее часто используемые дисциплины
диспетчеризации.
Самой простой в реализации является дисциплина FCFS (first come – first
served), согласно которой задачи обслуживаются в порядке очереди, т.е. в порядке
их появления. Те задачи, которые были заблокированы в процессе работы, после
перехода в состояние готовности ставятся в эту очередь перед теми задачами,
которые еще не выполнялись, т.е. образуется две очереди – одна из новых задач, а
вторая очередь – из ранее выполнявшихся, но попавших в состояние ожидания.
Такой подход позволяет реализовать стратегию обслуживания «по возможности
заканчивать вычислительные процессы в порядке их появления».
Выполненные задачи
Процессор
Блокирование
Задачи, вновь готовые к исполнению
Очередь новых задач
Рис.1. Дисциплина FCFS
К достоинствам этой дисциплины можно отнести простоту реализации и
малые расходы системных ресурсов на формирование очереди задач.
21
Но она приводит к тому, что при увеличении загрузки вычислительной
системы растет и среднее время ожидания обслуживания, причем короткие
задания вынуждены ожидать столько же, сколько и трудоемкие задания.
Избежать этого недостатка позволяют дисциплины SJN и SRT.
Дисциплина обслуживания SJN (shortest job next – следующим будет
выполняться кратчайшее задание) требует, чтобы для каждого задания была
известна оценка в потребностях машинного времени. Для этого были разработаны
специальные языковые средства, например, язык JCL (job control language – язык
управления заданиями). Пользователи должны были указывать предполагаемое
время выполнения, а чтобы они не
ловчили, ввели подсчет реальных
потребностей. Если обнаруживался обман, то задание ставилось в конец очереди
или оплата шла по более высоким тарифам.
Дисциплина обслуживания SJN предполагает, что имеется только одна
очередь заданий, готовых к выполнению. И задания, которые в процессе своего
выполнения были временно заблокированы, вновь попадают в конец очереди. Это
приводит к тому, что задания, которым требуется очень немного времени для
завершения, ожидают процессор наравне с длительными работами.
Для устранения этого недостатка была предложена дисциплина SRT (shortest
remaining time) – следующее задание требует меньше всего времени для своего
завершения.
Все эти три дисциплины могут использоваться для пакетных режимов
обработки, когда пользователь сдает свое задание, не ожидает реакции системы, а
ему нужен только результат вычислений. Для интерактивных вычислений
желательно обеспечить приемлемое время реакции системы и равенство в
обслуживании,
если
система
является
мультитерминальной.
Для
однопользовательских систем с возможностью мультипрограммной обработки
желательно, чтобы программы, с которыми работают непосредственно, имели
лучшее время реакции, чем фоновые задания. Для решения подобных проблем
используется дисциплина обслуживания RR (round robin – круговая, карусельная)
и приоритетные методы обслуживания.
Дисциплина RR предполагает, что каждая задача получает процессорное
время порциями (квантами времени q). После окончания кванта времени q задача
снимается с процессора, и он передается следующей задаче. Снятая задача
ставится в конец очереди задач, готовых к исполнению. Для оптимальной работы
системы необходимо правильно выбрать закон, по которому кванты времени
выделяются задачам.
Величина кванта времени q выбирается как компромисс между приемлемым
временем реакции системы на запросы пользователей и накладными расходами на
частую смену контекста задачи (надо запоминать много информации для
прерываний).
Дисциплина RR – это одна из самых распространенных дисциплин
диспетчеризации. В своей простейшей реализации на предполагает, что все
задачи имеют одинаковый приоритет. Для введения приоритетного обслуживания
вводят несколько очередей. Процессорное время будет предоставляться в первую
очередь тем задачам, которые стоят в самой привилегированной очереди. Если
22
она пустая, то диспетчер задач начнет просматривать остальные очереди. По
такому алгоритму действует диспетчер задач в Windows NT.
Выполненные задачи
Процессор
Очередь готовых к исполнению задач
Новые задачи
Рис.2. Дисциплина RR
Диспетчеризация без перераспределения процессорного времени, т.е. не
вытесняющая многозадачность – это такой способ диспетчеризации процессов,
при котором активный процесс выполняется до тех пор, пока он сам не отдаст
управление диспетчеру задач. Дисциплины FCFS, SJN, SRT относятся к не
вытесняющим.
Диспетчеризация с перераспределением процессорного времени между
задачами, т.е. вытесняющая многозадачность – это такой способ, при котором
решение о переключении с одного процесса на другой принимается диспетчером
задач, а не самой активной задачей. Дисциплина RR относится к вытесняющим.
Для сравнения алгоритмов диспетчеризации обычно используют следующие
критерии:
a) использование (загрузка) CPU – центрального процессора;
b) пропускная способность CPU – количество процессов, выполняющихся в
единицу времени;
c) время оборота – интервал от момента появления процесса во входной
очереди до момента его завершения;
d) время ожидания – суммарное время нахождения в очереди готовых
процессов;
e) время отклика – время, прошедшее от момента попадания во входнуюъ
очередь до момента первого обращения к терминалу. Является важным для
интерактивных программ.
Правильное планирование сильно влияет на производительность всей
системы.
23
1. Диспетчеризация задач с использованием динамических приоритетов
Во многих ОС, а в ОС реального времени обязательно, имеются средства для
изменения приоритета программ. Введение механизмов динамического изменения
приоритетов позволяет реализовать более быструю реакцию системы на короткие
запросы пользователей, что очень важно при интерактивной работе, но при этом
гарантировать выполнение любых запросов.
Например, в Windows NT каждый поток (задача) имеет базовый уровень
приоритета, который лежит в диапазоне от двух уровней ниже базового
приоритета процесса, его породившего, до двух уровней выше этого приоритета.
Поток наследует этот базовый приоритет и может изменять его так, чтобы он стал
немного меньше или немного больше. В результате получается приоритет
планирования, с которым поток и начинает исполняться. Например, если поток
обрабатывает пользовательский ввод, то диспетчер задач Windows NT поднимает
его динамический приоритет, если он выполняет вычисления, то диспетчер
постепенно снижает его приоритет до базового. Таким образом производится
управление относительной приоритетностью потоков внутри процесса.
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
Диапазон значений
динамического
приоритета потока
Базовый приоритет
потока
Базовый приоритет
процесса
Рис.3. Схема динамического изменения приоритетов в Windows NT
Для определения порядка выполнения потоков диспетчер использует систему
приоритетов, направляя на выполнение потоки с высоким приоритетом раньше
потоков с низкими приоритетами.
Существует группа очередей – по одной для каждого приоритета. Windows
NT поддерживает 32 уровня приоритетов; потоки делятся на два класса:
реального времени и переменного приоритета. Потоки реального времени,
имеющие приоритеты от 16 до 31, используются программами с критическим
временем выполнения. Большинство потоков в системе относятся к классу
переменного приоритета с уровнями приоритета от 1 до 15. Для собственно
системных модулей, функционирующих в статусе задач, зарезервирован
приоритет с номером 0.
24
Управление памятью в операционных системах
1. Память и отображение, виртуальное адресное пространство
В настоящее время программист обращается к памяти с помощью некоторого
набора логических имен, для которых отсутствует отношение порядка (в общем
случае множество переменных неупорядочено). Имена переменных и входных
точек программных модулей составляют пространство имен. С другой стороны,
существует понятие физической памяти, с которой работает процессор, извлекая
из нее команды и помещая в нее результаты вычислений. Физическая память –
это упорядоченное множество пронумерованных ячеек. К каждой из них можно
обратиться, указав ее номер (адрес). Количество ячеек физической памяти
ограниченно и фиксировано.
Системное программное обеспечение должно связать каждое указанное
пользователем имя с физической ячейкой памяти, т.е. осуществить отображение
пространства имен на физическую память компьютера.
Логическое (символьное) имя
Виртуальное адресное
пространство
Пространство имен программы
Система программирования
Виртуальный адрес
Операционная система
Ячейка физической
памяти (физ. адрес)
Рис. 1. Память и отображение
В общем случае это делается в два этапа (см. рис.1): сначала системой
программирования, а затем операционной системой. Между этими этапами
25
обращения к памяти имеют форму виртуального или логического адреса.
Множество всех допустимых значений виртуального адреса для некоторой
программы определяет ее виртуальное адресное пространство или виртуальную
память.
Система программирования осуществляет трансляцию и компоновку
программы и производит привязку основной части виртуальных адресов
программы к физическим ячейкам (первое отображение), а окончательная
привязка делается операционной системой на этапе загрузки программы в память
для ее исполнения (второе отображение).
Возможны частные случаи отображения пространства имен на физическую
память:
a) тождественность виртуального адресного пространства физической
памяти. Здесь нет необходимости осуществлять второе отображение. Система
программирования генерирует абсолютно двоичную программу (адреса
физические);
b) тождественность виртуального адресного пространства исходному
пространству имен. Здесь отображение осуществляется самой операционной
системой, путем использования таблицы символьных имен.
В настоящее время даже на ПК объем виртуальной памяти больше объема
физической памяти. Имеется несколько методов распределения памяти для этой
ситуации.
2. Простое непрерывное распределение и распределение с перекрытием
Простое непрерывное распределение – это самое простая схема, при которой
вся память условно разделена на три части:
 область, занимаемая операционной системой:
 область, в которой размещается исполняемая задача;
 свободная область памяти.
Эта схема предполагает, что ОС не поддерживает мультипрограммирование.
Область памяти, отводимая под задачу, является непрерывной, что облегчает
работу системе программирования.
Чтобы для задач отвести как можно больший объем памяти, ОС строится
таким образом, что постоянно в оперативной памяти располагается самая нужная
ее часть (ядро). Остальные модули ОС могут быть диск-резидентными, т.е.
загружаются в память по необходимости, а после своего выполнения вновь
освобождают память.
Такая схема распределения несет два вида потерь вычислительных ресурсов
– потеря процессорного времени (процессор простаивает, ожидая завершения
операций ввода-вывода) и потеря самой оперативной памяти, т.к. не каждая
программа использует всю память, а режим работы в этом случае
однопрограммный.
Если есть необходимость создать программу, логическое адресное
пространство которой должно быть больше, чем свободная область памяти, то
26
используется распределение с перекрытием (оверлейные структуры). При этом
программа разбивается на сегменты. Каждая оверлейная программа имеет одну
главную часть (main) и несколько сегментов (segment), причем в памяти
одновременно могут находиться только ее главная часть и один или несколько не
перекрывающих сегментов. Пока в оперативной памяти располагаются
выполняющиеся сегменты, остальные находятся во внешней памяти.
Первоначально программисты сами должны были включать в тексты своих
программ обращения к ОС для вызова сегментов и тщательно планировать, какие
сегменты одновременно могут находиться в оперативной памяти. Сейчас,
например, в Turbo Pascal достаточно указать, что данный модуль оверлейный и
все обращения к ОС для загрузки оверлеев генерируются самой системой
программирования.
3. Распределение статическими и динамическими разделами
Для организации мультипрограммного режима необходимо обеспечить
одновременное расположение в оперативной памяти нескольких задач. Самая
простая схема распределения памяти предполагает, что память, незанятая ядром
ОС, сожжет быть разбита на несколько непрерывных разделов. Разделы
характеризуются именем, типом, границами (начало, конец и длина). Разбиение
на несколько непрерывных разделов может быть фиксированным (статическим),
либо динамическим (выделение нового раздела происходит при появлении новой
задачи).
Ядро операционной системы
Раздел № 0
Транзитная область ОС
Задача А
Раздел №
Неиспользуемая область
Задача В
Раздел № 2
Неиспользуемая область
Задача С
Неиспользуемая область
Раздел № 3
Рис.2. Распределение памяти разделами с фиксированными границами
В каждом разделе в каждый момент времени может располагаться по одной
программе. При небольшом объеме памяти увеличение количества параллельно
выполняемых приложений можно за счет свопинга (swapping). При свопинге
27
задача целиком перемещается во внешнюю память, а на ее место загружается
другая задача, находившаяся на диске в приостановленном состоянии. Серьезная
проблема, которая возникает при организации мультипрограммного режима, это защита самой ОС, так и других задач друг от друга.
Основным недостатком такого способа распределения памяти является
наличие достаточно большого объема неиспользуемой памяти ( рис. 2). Такие
потери называют фрагментацией памяти. Избежать этого можно двумя
способами:
 выделять раздел ровно такого объема, который нужен под текущую
задачу – разделы с подвижными границами. Диспетчер памяти ведет список
адресов свободной памяти и выделяет под задачу раздел, равный или чуть больше
объема задачи. При освобождении раздела диспетчер пытается объединить этот
раздел со смежным свободным участком, если таковой имеется;
 размещать задачу не в одной непрерывной области памяти, а в нескольких
областях.
4. Разрывные методы распределения памяти
При этом способе задаче память задаче выделяется не сплошной областью, а
фрагментами. Для этого требуется аппаратная поддержка для ведения
относительной адресации. Виртуальный адрес представляется состоящим из двух
полей. Первое поле указывает часть программы, с которой сейчас осуществляется
работа для определения местоположения этой части в памяти, а второе поле
виртуального адреса помогает найти нужную ячейку относительно найденного
адреса.
Существуют три способа организации виртуальной памяти для реализации
разрывных методов: сегментный, страничный и сегментно-страничный.
О первых двух уже мы говорили при рассмотрении особенностей
архитектуры микропроцессоров i80x86.
Вспомним:
Сегментная организация виртуальной памяти состоит в том, что
программа разбивается на логические элементы (например, блоки, процедуры) ─
так называемые сегменты разной длины, которые размещаются в памяти как до
определенной степени самостоятельная единица. Логически обращение к
элементам программы будет представляться как указание имени сегмента и
смещения относительно начала этого сегмента. Физическое имя сегмента (его
порядковый номер) будет соответствовать некоторому адресу, с которого этот
сегмент начинается при его размещении в памяти, и смещение должно
прибавляться к этому базовому адресу. Таким образом, адрес для этого способа
состоит из двух полей: номер сегмента и смещение относительно сегмента.
Каждый сегмент, размещаемый в памяти, имеет соответствующую
информационную структуру, называемую дескриптором сегмента.
Страничная организация виртуальной памяти состоит в том, что все
фрагменты программы, на которые она разбивается произвольным образом,
имеют одинаковую длину. Эти одинаковы части называют страницами и говорят,
28
что память разбивается на физические страницы, а программа ─ на виртуальные
страницы. Часть виртуальных страниц задачи размещается в оперативной
памяти, а часть ─ во внешней. Величина страницы выбирается кратной степени
двойки. Таким образом, вместо одномерного адресного пространства можно
говорить о двумерном. Первая координата адресного пространства ─ это номер
страницы, а вторая ─ номер ячейки внутри выбранной страницы (его называют
индексом). Таким образом, физический адрес определяется парой (Pp,i), а
виртуальный адрес ─ парой (Pν,i), где Pν ─ номер виртуальной страницы, Pp ─
номер физической страницы, i ─ индекс ячейки внутри страницы. Количество
битов, отводимое под индекс, определяет размер страницы, а количество битов,
отводимое под номер виртуальной страницы ─ объем возможной виртуальной
памяти, которой может воспользоваться программа. При это нет необходимости
ограничивать число виртуальных страниц числом физических, то есть не
поместившиеся страницы можно размещать во внешней памяти, которая в этом
случае служит расширением оперативной. Для отображения виртуального
адресного пространства задачи на физическую память для каждой задачи, как и в
случае сегментного способа, необходимо иметь таблицу страниц для трансляции
адресных пространств. Для описания каждой страницы диспетчер памяти ОС
заводит соответствующий дескриптор.
При сегментно-страничном способе организации виртуальной памяти
виртуальный адрес состоит из трех компонентов: сегмент, страница, индекс. Этот
способ организации памяти вносит еще большую задержку доступа к памяти.
Сначала надо вычислить адрес дескриптора сегмента и прочитать его, затем
вычислить адрес элемента таблицы страниц этого сегмента и извлечь из памяти
необходимый элемент, и только потом можно к номеру физической страницы
приписать номер ячейки в странице (индекс). Этот способ в ПК практически не
используется (значительные затраты вычислительных ресурсов), хотя его
возможность заложена в микропроцессорах i80x86. Его используют в дорогих,
мощных вычислительных системах.
5. Распределение оперативной памяти в современных ОС для ПК
a) Microsoft Windows 95/98
Это 32-разрядные, многопотоковые ОС с вытесняющей многозадачностью.
Основной пользовательский интерфейс – графический.
В системе фактически действует только страничный механизм
преобразования виртуальных адресов в физические, т.к. используется плоская
модель памяти (имеется только один сегмент). Этот сегмент отображается
непосредственно в область виртуального линейного адресного пространства,
состоящего из 4 Кбайт страниц. Каждая страница может располагаться где угодно
в оперативной памяти или может быть перемещена на диск, если не запрещено
использовать страничный файл.
Каждая 32-разрядная программа выполняется в своем адресном
пространстве, но все они используют совместно один и тот же системный 3229
разрядный код. Виртуальные адресные пространства не используют всех
аппаратных средств защиты микропроцессора, поэтому неправильно написанная
программа может привести к аварийному сбою всей системы.
4 Гб
3 Гб
Системные компоненты,
относящиеся к 0 кольцу защиты
Системные DLL
Прикладные программы Win 16
Совместно используемые DLL
2 Гб
Прикладные программы Win 32
4 Мб
Компоненты реального времени
Адреса между 2 и 4 Гб
отображаются в адресное пр-во
каждой программой Win 32 и
совместно используются
Здесь каждая прикладная
программа располагает
собственное адресное пр-во,
которое недоступно для других
программ
Эта область используется всеми
процессами
64 Кб
0
Рис. 3. Модель памяти ОС Windows 95/98
Системный код размещается выше границы 2 Гб. Здесь размещаются
системные библиотеки DLL (dynamic link library – динамически загружаемый
библиотечный модуль), используемые несколькими программами. В
микропроцессорах i80x86 имеется четыре уровня защиты (кольца с номерами от 0
до 3). В наиболее привилегированном кольце с номером 0 находится ядро ОС,
модули файловой системы, подсистема управления виртуальными машинами,
виртуальные драйверы.
b) Microsoft Windows NT
Здесь тоже используется плоская модель памяти. В отличии от Windows
95/98 в гораздо большей степени используется ряд серьезных аппаратных средств
защиты, имеющихся в микропроцессоре, а также применено принципиально
другое логическое распределение адресного пространства. Все системные
программные модули и остальные программные модули самой ОС, выступающие
как серверные процессы по отношению к прикладным программам (клиентам),
находятся в своих собственных виртуальных адресных пространствах и доступ к
ним со стороны прикладных программ невозможен. Логическое распределение
адресных пространств приведено на рис.4.
Прикладным программам выделяется 2 Гб локального (собственного)
пространства от 64 Кб до 2 Гб (первые 64 Кб полностью недоступны). Они
изолированы друг от друга, хотя могут общаться через буфер обмена c помощью
30
механизмов DDE – Dynamic Data Exchange (динамический обмен данными) и OLE
– Object Linking and Embedding (связь и внедрение объектов).
Между отметками 2 и 4 Гб находятся ядро ОС, планировщик потоков и
диспетчер виртуальной памяти VMM (Virtual Memory Manager – выделение
памяти, резервирование, освобождение, подкачка).
4 Гб
Код ядра
(работает в кольце защиты с
номером 0)
2 Гб
DLL Win32
Клиентской стороны
Прикладные программы Win32
собственным виртуальным
пространством
64 Кб
Виртуальные машины Win16
Процесс
системного
сервера
Прикладные программы
обращаются к DLL,
которые
перенаправляют
обращение к системе
Этот системный код
недоступен
вызывающим его
процессам
0
Рис. 4. Модель распределения виртуальной памяти в Windows NT
Вся виртуальная память в Windows NT подразделяется на классы:
 зарезервированная (reserved) – набор непрерывных адресов, которые
диспетчер виртуальных адресов (VMM) выделяет для процесса, но не учитывает в
общей квоте памяти процесса, пока она не будет фактически использована;
 память выделена (committed) – если VMM резервирует для нее место в
специальном файле Pagefile.sys на тот случай, когда потребуется выгрузить
содержимое памяти на диск. Выделенная память ограничивается файлом
подкачки;
 доступная (available) – вся остальная память.
31
Управление вводом/выводом в операционных системах
Ввод/вывод считается одной из самых сложных областей проектирования ОС
из-за огромного числа устройств в/в разнообразной природы, которые должна
поддерживать ОС. Управление в/в занимается компонента ОС, называемая
супервизором в/в. Он решает следующие основные задачи:
1. Получает запросы на в/в от прикладных программ и программных
модулей самой ОС. Они проверяются на корректность и обрабатываются дальше,
если не содержат ошибки. В противном случае выдается диагностическое
сообщение;
2. Вызывает соответствующее распределение каналов и контроллеров,
определяет очередность в/в. Запрос либо выполняется, либо ставится в очередь;
3. Инициирует операции в/в – передает управление соответствующим
драйверам;
4. При получении сигналов прерываний по в/в идентифицирует их и
передает управление соответствующей программе ISR;
5. Осуществляет передачу сообщений об ошибках, если таковые происходят
в процессе управления в/в;
6. Посылает сообщение о завершении операции в/в запросившему эту
операцию процессу и снимает его с состояния ожидания в/в.
Имеется два основных режима ввода-вывода:
 режим обмена с опросом готовности устройства в/в;
 режим обмена с прерываниями – драйверы в этом режиме имеют секцию
запуска, одну или несколько секций продолжения и секцию завершения.
Рассмотрим рис.1.
Оперативная память
Данные
Команда в/в
Центральный
процессор или
процессор в/в
Устройство
управления
устройством в/в
Устройство в/в
Сигнал готовности
Рис. 1. Управление вводом/выводом
32
Центральный процессор посылает устройству управления команду
выполнить некоторое действие устройству в/в. УУ исполняет команду,
транслируя полученный сигналы в сигналы, понятные устройству в/в. Но
быстродействие устройства в/в намного меньше быстродействия ЦП. Поэтому
сигнал готовности от УУ устройства в/в центральному процессору о том, что
операция в/в выполнена и можно подавать новую, приходится ожидать долго. До
тех пор, пока сигнал готовности не появится, драйвер внешних устройств ничего
не делает, при этом нерационально используется время ЦП. Гораздо более
выгодно, подав команду на в/в, на время забыть об устройстве в/в и перейти на
выполнение другой команды, а сигнал готовности рассматривать как запрос на
прерывание от устройства в/в.
Устройства с последовательным доступом (например, принтер) не допускают
совместного использования. Для организации использования многими
параллельно выполняющимися задачами устройств в/в, которые не могут быть
разделяемыми, вводится понятие виртуальных устройств (SPOOLing – имитация
работы с устройством в режиме «он-лайн»). Спулинг создает видимость
параллельного разделения устройств в/в с последовательным доступом.
Например, вычислительному процессу предоставляется виртуальный принтер, т.е.
поток выводимых данных направляется в специальный файл на диске, а затем,
когда принтер освободится, выводится содержимое этого спул-файла.
Основные системные таблицы ввода-вывода
Каждая ОС имеет, по-крайней мере, три системных таблицы:
1. Содержит информацию обо всех устройствах в/в, подключенных к
вычислительной системе – таблица оборудования, а каждый ее элемент – блок
управления устройством в/в (UСB –unit control block) содержит следующую
информацию:
a)
тип устройства, конкретная модель, символическое имя,
характеристика устройства;
b)
как это устройство подключено (тип интерфейса, через какой
порт, линия запроса прерывания и т.д.):
c)
номер и адрес канала в/в:
d)
указание на драйвер, указание секции запуска и секции
продолжения драйвера:
e)
и т.д.
2. Предназначена для реализации еще одного принципа виртуализации
устройств в/в – независимости от устройства. Это таблица описания виртуальных
логических устройств (DRT – device reference table). Она предназначена для
установления связи между виртуальными (логическими) устройствами и
реальными устройствами, описанными в таблице оборудования.
3. Необходима для организации обратной связи между ЦП и устройствами
в/в – таблица прерываний, указывает для каждого сигнала запроса на прерывание
33
тот элемент UCB, который сопоставлен данному устройству, подключенному к
этой линии запроса на прерывание.
Теперь еще раз, с учетом изложенных принципов и таблиц, рассмотрим
процесс управления вводом/выводом (см. рис. 2).
Супервизор
ввода/вывода
Супервизор
программ
Таблица
UCB
Элемент
UCB
Прикладная
программа
Диспетчер
задач
Драйвер
уст-ва в/в
(секция
продолжения)
DRT
Препроцессор
ввода/вывода
Уст-во
в/в
Супервизор
прерываний
Драйвер в/в
(секция
запуска)
Рис. 2. Процесс управления вводом/выводом
От прикладной программы на супервизор программ поступает запрос на
операцию в/в. Он проверяет системный вызов и в случае ошибки возвращает
задаче соответствующее сообщение. Если запрос корректен, то он
перенаправляется в супервизор ввода/вывода. Последний по логическому имени с
помощью таблицы DRT находит соответствующий элемент UCB в таблице
оборудования. Если устройство уже занято, то описатель задачи помещается в
список задач, ожидающих настоящее устройство. Если же устройство свободно,
то супервизор ввода/вывода определяет из UCB тип устройства и при
необходимости
запускает
препроцессор,
позволяющий
получить
последовательность управляющих кодов и данных, которую сможет понять и
отработать устройство. Затем управление передается соответствующему драйверу
на секцию запуска. Драйвер инициализирует операцию управления, обнуляет
счетчик тайм-аута и возвращает управление диспетчеру задач с тем, чтобы он
поставил на процессор готовую к исполнению задачу. Система работает своим
чередом, но когда устройство в/в отработает посланную ему команду, оно
34
выставляет сигнал запроса на прерывания, по которому через таблицу
прерываний управление передается на секцию продолжения. Получив новую
команду, устройство вновь начинает ее обрабатывать, а управление процессором
опять передается диспетчеру задач, и процессор продолжает полезную работу.
Таким образом, получается параллельная обработка задач, на фоне которой
процессор осуществляет управление операциями ввода/вывода.
Если имеются специальные аппаратные средства для управления в/в,
снимающие эту работу с центрального процессора (каналы прямого доступа к
памяти), то в функции ЦП будут по-прежнему все рассмотренные выше шаги, за
исключением последнего – непосредственного управления операциями в/в. В
случае использования каналов прямого доступа к памяти последние используют
канальные программы и разгружают ЦП, избавляя его от непосредственного
обмена данными между памятью и внешними устройствами.
Задача, выдавшая запрос на операцию в/в, переводится супервизором в
состояние ожидания завершения заказанной операции. Когда супервизор
получает от секции завершения сообщение о том, что операция завершилась, он
переводит задачу в состояние готовности к выполнению, и она продолжает свою
работу. Эта ситуация соответствует синхронному в/в. Он является стандартным
для большинства ОС.
Чтобы увеличить скорость выполнения приложений, в мультипрограммных
ОС при необходимости используют асинхронный в/в. Простейшим вариантом
асинхронного в/в является буферизированный вывод данных на внешнее
устройство, при котором данные из приложений передаются не непосредственно
на устройство в/в, а в специальный системный буфер. В этом случае логически
операция вывода для приложения считается выполненной сразу же, и задача
может не ожидать окончания действительного процесса передачи данных на
устройство.
Средняя скорость работы процессора с оперативной памятью на 2-3 порядка
выше, чем средняя скорость передачи данных на магнитных дисках в
оперативную память. Чтобы сгладить такое сильное несоответствие в
производительности основных подсистем, используется буферирование и/или
кэширование данных. Простейшим вариантом ускорения дисковых операций
чтения данных можно считать использование двойного буферирования. Его суть
заключается в том, что пока в один буфер заносятся данные с магнитного диска,
из второго буфера, ранее считанные данные могут быть прочитаны и переданы
запросившей их задаче. Аналогичный процесс происходит и при записи данных.
Буферирование используется во всех ОС, но помимо буферирования применяется
и кэширование. Кэширование исключительно полезно, когда программа
неоднократно читает с диска одни и те же данные. После того как они будут
помешены в кэш, обращений к диску больше не потребуется и скорость работы
программы значительно возрастет.
35
Файловая система
Файловая система – это набор спецификаций и соответствующее им
программное обеспечение, которые отвечают за создание, уничтожение,
организацию, чтение, запись, модификацию и перемещение файловой
информации, а также за управление доступом к файлам и за управление
ресурсами, которые используются файлами.
Все современные ОС имеют соответствующие системы управления файлами.
Система управления файлами является основной (самой видимой) подсистемой в
современных ОС, с ее помощью:
1. Связываются по данным все системные обрабатывающие программы;
2. Решаются проблемы централизованного распределения дискового
пространства и управления данными:
3. Пользователям предоставляются следующие возможности:
a) создание, удаление, переименование и т.д. именованных наборов
данных из своих программ или посредством специальных управляющих
программ;
b) работа с не дисковыми периферийными устройствами как с файлами;
c) обмен данными между файлами, между устройствами, между файлом
и устройством (и наоборот);
d) работа с файлами с помощью обращений к программным модулям
системы управления файлами;
e) защита файлов от несанкционированного доступа.
В некоторых ОС может быть несколько систем управления файлами, что
обеспечивает им возможность работать с несколькими файловыми системами.
1. Структура магнитного диска
Чтобы загрузить с диска саму ОС, а затем с ее помощью организовать работу
систему управления файлами, были приняты специальные системные соглашения
о структуре диска.
Информация на дисках размещается и передается блоками. Каждый такой
блок называется сектором, сектора расположены на концентрических дорожках
поверхности диска. Каждая дорожка (track) образуется при вращении диска под
зафиксированной в определенном положении
головкой чтения/записи.
Накопитель на жестких дисках (винчестер – 1973 г.) содержит несколько дисков
(часто два или три).
Группы дорожек (треков) одного радиуса, расположенных на поверхностях
дисков, образуют цилиндры. Современные диски имеют по несколько десятков
тысяч таких цилиндров. 3.5” дискета имеет 80 цилиндров (две рабочие
поверхности, 18 секторов на каждой дорожке, каждый сектор 512 байт –
2х80х18х512 = 1 474 560 байт = 1.44 Мбайт).
Каждый сектор состоит из поля данных и поля служебной информации.
Размер сектора устанавливается контроллером или драйвером. В большинстве
36
современных ОС сектор имеет размер 512 байт. Физически адрес сектора на
диске определяется триадой [c-h-s], где c – номер цилиндра (дорожки на
поверхности диска, cylinder), h – номер рабочей поверхности диска (магнитной
головки, head), а s – номер сектора на дорожке (sector).
Обмен информацией между оперативной памятью и дисками физически
осуществляется только секторами.
Жесткий диск может быть разбит на несколько разделов (partition). На
каждом разделе может быть организована своя файловая система. Разделы диска
могут быть двух типов – primary (первичный) и extended (расширенный). На диске
должен быть, по крайней мере, один primary-раздел (максимум – 4). Загрузчик
располагается в активном разделе и ему передается управление при включении
компьютера и загрузке ОС.
На жестком диске может быть только один extended-раздел, который может
быть разделен на большое количество подразделов – логических дисков. Каждый
логический диск управляется своим логическим приводом. Каждому логическому
диску на винчестере соответствует своя относительная нумерация. Физическая же
адресация жесткого диска сквозная.
По физическому адресу [0-0-1] на винчестере располагается главная
загрузочная запись (master boot record – MBR), содержащая внесистемный
загрузчик (non-system bootstrap – NSB), а также таблицу разделов (partition table –
PT). Эта запись занимает один сектор и размещается в оперативной памяти,
начиная с адреса 0:7С00h. Затем управление передается коду, содержащемуся в
этом самом первом секторе диска. MBR является основным средством загрузки с
жесткого диска.
PT описывает размещение и характеристики имеющихся на винчестере
разделов. Это одна из наиболее важных структур на жестком диске. Если эта
таблица будет повреждена, то не только не будет загружаться ОС, но перестанут
быть доступными и данные, расположенные на винчестере, особенно, если он
разбит на несколько разделов.
Вслед за сектором MBR размещаются собственно сами разделы. В процессе
начальной загрузки сектора MBR, содержащего PT, работают программные
модули BIOS. Начальная загрузка считается выполненной корректно, когда
таблица разделов содержит допустимую информацию.
Одной из самых известных и до сих пор используемых утилит, с помощью
которой можно посмотреть и отредактировать PT, а также выполнить и другие
действия, связанные с изучением и исправлением данных на диске, является
программа Disk editor, работающая в среде DOS. На сегодняшний день ее
главный недостаток, что она ограничена размером диска 8 Гбайт. В настоящее
время оной из известных и мощных программ для работы с разделами жесткого
диска является программа Partition Magic (работает в среде Win32API).
37
2. Файловая система FAT
File Allocation Table (таблица размещения файлов) – линейная табличная
структура со сведениями о файлах. В файловой системе FAT логическое дисковое
пространство любого логического диска делится на две области: системную
область и область данных. Системная область создается и инициализируется при
форматировании и состоит из следующих компонент, расположенных друг за
другом (рис.1):
1. Загрузочная запись (boot record – BR);
2. Зарезервированные сектора (reserved sector – RS);
3. Таблицы размещения файлов (FAT);
4. Корневой каталог (root directory – Rdir).
BR
RS
FAT1
FAT2
RDir
Системная область
Каталоги и файлы
Область данных
Рис.1. Структура логического диска
Таблица размещения файлов
Она представляет карту области данных, в которой описывается состояние
каждого участка области данных. Область данных разбивают на кластеры.
Кластер – это один или несколько смежных секторов в логическом адресном
пространстве области данных. В таблице FAT кластеры, принадлежащие одному
файлу (или некорневому каталогу), связываются в цепочки. Для указания номера
кластера в FAT-16 используется 16-битовое слово, следовательно, можно иметь
до 216 = 65536 кластеров (с номерами от 0 до 65535). В FAT – 32 в 32-битовом
слове фактически учитывается только 28 разрядов, поэтому количество кластеров
не может превышать 228 = 268 435 456.
Кластер – это минимальная адресуемая единица дисковой памяти,
выделяемая файлу (или некорневому каталогу). Файл или каталог занимает целое
число кластеров. Последний кластер при этом может быть задействован не
полностью, что приведет к заметной потере дискового пространства при большом
размере кластера. На дискетах кластер занимает 2 сектора, а на жестких дисках –
в зависимости от объема раздела от 2 до 32 секторов. Слишком большой размер
кластера ведет к неэффективному использованию дискового пространства,
особенно в случае большого количества маленьких файлов.
Первый допустимый номер кластера всегда начинается с номера 2. Номера
кластеров всегда соответствуют элементам таблицы размещения файлов.
38
Наглядно идею файловой системы FAT можно проиллюстрировать с
помощью рис.2.
Начальный номер кластера
Directory Entry
My_file txt
00
10
a
Time
Data
08
Size
00
01
02
03
04
05
06
07
08
09
0A
0B
OC
0D
0E
0F
ID
FF
03
04
05
FF
00
00
09
0A
0B
15
00
00
00
00
00
00
00
00
00
16
17
19
F7
1A
1B
1C
1D
FF
00
00
Рис.2. Основная концепция FAT
Начальный номер кластера записывается в элемент каталога (Directory Entry).
Таблица FAT имеет столько элементов, сколько имеется кластеров на диске. В
элемент таблицы FAT с номером, соответствующим номеру кластера цепочки,
записывается номер следующего кластера цепочки. При форматировании диска в
элементы FAT, соответствующие дефектным кластерам, записывается код F7.
Свободные кластеры помечаются кодом 00. В элемент FAT, соответствующий
последнему кластеру цепочки, записывается код FF.
Из рисунка видно, что файл с именем My_file.txt размещается, начиная с
восьмого кластера. Цепочка кластеров для этого файла имеет вид:
8, 9, 0A, 0B, 15, 16, 17, 19, 1A, 1B, 1C, 1D
При выделении нового кластера для записи файла берется первый свободный
кластер. Т.к. файлы в процессе работы изменяются, то это правило приводит к
фрагментации файлов, т.е. данные одного файла могут располагаться не в
смежных кластерах, образуя сложные цепочки. Это приводит к замедлению
работы с файлами.
В связи с чрезвычайной важностью FAT она обычно хранится в двух
идентичных экземплярах, второй из которых непосредственно следует за первым.
Для каждого файла и каталога в файловой системе хранится следующая
информация: имя файла или каталога, атрибуты файла, резервное поле, время
создания, дата создания, дата последнего доступа, зарезервировано, время
последней модификации, дата последней модификации, номер начального
кластера в FAT, размер файла.
Структура системы файлов является иерархической. Элементом каталога
может быть такой файл, который сам, в свою очередь, является каталогом.
39
3. Файловая система NTFS
New Technology File System (файловая система новой технологии)
содержит ряд значительных усовершенствований и изменений, существенно
отличающих ее от других файловых систем. В отличие от FAT работа на дисках
большого
объема происходит намного эффективнее; имеются средства для
ограничения доступа к файлам, введены механизмы, повышающие надежность
файловой системы, сняты многие ограничения на максимальное количество
дисковых секторов и/или кластеров.
Структура тома с файловой системой NTFS
Одним из основных понятий при работе с NTFS является понятии тома
(volume). Все дисковое пространство тома делится на кластеры. NTFS
поддерживает размеры кластеров от 512 байт до 64 Кбайт. Стандартом считается
кластер размером 2 или 4 Кбайт.
Все дисковое пространство делится на две неравные части (рис.3). Первые
12% диска отводятся под MFT-зону (master file table) – пространство, которое
может занимать, увеличиваясь в размере, главный служебный метафайл MFT.
Эта MFT-зона всегда держится пустой, чтобы самый главный служебный файл
MFT не фрагментировался при росте. Остальные 88% тома представляют собой
обычное пространство для хранения файлов.
1
2
3
4
5
Рис. 3. Структура тома NTFS
1- MFT; 2- зона MFT; 3- зона для размещения файлов
и каталогов; 4- копия первых 16 записей MFT; 5- зона
для размещения файлов и каталогов.
MFT – централизованный каталог всех остальных файлов диска, в том числе
и себя самого. Он поделен на записи фиксированной размера в 1 Кбайт, и каждая
запись соответствует одному файлу. Первые 16 файлов носят служебный характер
и недоступны ОС – они называются метафайлами, причем самый первый
метафайл – сам MFT. Эти первые 16 элементов MFT – единственная часть диска,
имеющая строго фиксированное положение. Копия этих 16 записей хранится в
середине тома для надежности. Эти первые 16 файлов отвечают за какой-либо
аспект работы системы. Таким образом, В MFT хранится вся информация о
файлах, за исключением собственно данных.
40
Файл в томе с NTFS идентифицируется так называемой файловой ссылкой,
которая представляется как 64-разрядное число. Файловая ссылка состоит из
номера файла, который соответствует позиции его файловой записи в MFT, и
номера последовательности. Последний увеличивается всякий раз, когда данная
позиция в MFT используется повторно, что позволяет файловой системе
выполнять внутренние проверки целостности.
Каждый файл представлен с помощью потоков. Один из потоков носит
привычный нам смысл – данные файла. К файлу, например, можно «прилепить»
еще один поток, записав в него любые данные. Эти дополнительные потоки не
видны стандартными средствами: наблюдаемый размер файла – это лишь размер
основного потока. Можно иметь файл нулевой длины, при стирании которого
освободится 1 Гбайт свободного места – просто потому, что какая-нибудь хитрая
программа «прилепила» к нему дополнительный поток большого размера (так на
идее подмены потока был создан вирус для Windows 2000). В настоящее время
потоки практически не используются.
Имя файла может содержать любые символы, включая полный набор
национальных алфавитов. Максимальная длина имени – 255 символов.
Каталоги в NTFS представляют собой специальный файл, хранящий ссылки
на другие файлы и каталоги, создавая иерархическое строение данных на диске.
Файл каталога поделен на блоки, каждый из которых содержит имя файла,
базовые атрибуты и ссылку на элемент MFT. Внутренняя структура каталога
представляет собой бинарное дерево. Поиск файлов осуществляется с помощью
получения двухзначных ответов на вопросы о положении файла. Каждый ответ
сужает зону поиска примерно в два раза.
Основные отличия FAT от NTFS
 FAT более компактна и менее сложна;
 Система NTFS не может использоваться для форматирования флоппидисков. Не стоит ей пользоваться для форматирования разделов объемом менее
50-100 Мбайт;
 Разделы FAT имеют объем до 2 Гбайт, разделы NTFS – до 16 Эбайт
64
(2 байт, это приблизительно 16 000 млрд Гбайт). В настоящее время размер
файлов ограничивается 2 Тбайт – 240 байт:
 Разделы FAT могут использоваться практически во всех ОС, с разделами
NTFS напрямую можно работать только из Windows NT;
 Разделы NTFS обеспечивают локальную безопасность как файлов, так и
каталогов. Разделы FAT устанавливают лишь общие права, связанные с общим
доступом к каталогам в сети;
 Windows NT содержит утилиту CONVERT.EXE, которая может
преобразовать тома FAT в эквивалентные тома NTFS. Однако для обратного
преобразования утилит нет.
41
Управление параллельными взаимодействующими
вычислительными процессами
Основной особенностью мультипрограммных ОС является то, что в их среде
параллельно развивается несколько вычислительных процессов. Параллельными
называют последовательные вычислительные процессы, которые одновременно
находятся в каком-либо активном состоянии. Два параллельных процесса могут
быть независимыми либо взаимодействующими.
Независимыми являются процессы, множества переменных которых не
пересекаются. Под переменными в этом случае понимают файлы данных, а также
области оперативной памяти, сопоставленные определенным в программе (и
промежуточным) переменным. Независимые процессы не влияют на работу друг
друга. Они могут только быть причиной задержек исполнения других процессов,
так как вынуждены разделять ресурсы системы.
Взаимодействующие процессы совместно используют общие переменные, и
выполнение одного процесса может повлиять на выполнение другого.
Взаимодействовать могут либо конкурирующие процессы, либо процессы,
совместно выполняющие общую работу.
Процессы, выполняющие общую совместную работу таким образом, что
результаты вычислений одного процесса в явном виде передаются другому
(обмен данными), называются сотрудничающими.
Чтобы предотвратить некорректное исполнение конкурирующих процессов
вследствие нерегламентированного доступа к разделяемым (общим) переменным,
необходимо ввести механизм взаимного исключения, который не позволит двум
процессам одновременно обращаться к разделяемым переменным. Такие общие
переменные называют критическими ресурсами.
Кроме этого, в ОС должны быть предусмотрены средства,
синхронизирующие работу взаимодействующих процессов. Другими словами,
процессы должны обращаться к неким средствам не только ради синхронизации с
целью взаимного исключения, но и чтобы обмениваться данными.
Те места в программах, где происходит обращение к критически ресурсам,
называются критическими секциями или критическими интервалами.
Необходима организация такого доступа к критическому ресурсу, когда только
одному процессу разрешается входить в критическую секцию.
Обеспечение взаимоисключения является одной из ключевых проблем
параллельного программирования. Было предложено несколько способов
решения этой проблемы – программные и аппаратные.
1. Использование
блокировки
параллельных процессов.
памяти
при
синхронизации
Все вычислительные системы имеют такое средство для организации
взаимного исключения, как блокировка памяти. Это средство запрещает
одновременное использование двух (и более) команд, которые обращаются к
42
одной и той же ячейке памяти. Механизм блокировки памяти предотвращает
одновременный доступ к разделяемой переменной, но не предотвращает
чередование доступа. Таким образом, если критические интервалы
исчерпываются одной командой обращения к памяти, данного средства может
быть достаточно для непосредственной реализации взаимного исключения. Если
критические секции требую более одного обращения к памяти, задача становится
сложной, но алгоритмически разрешимой.
Рассмотрим следующую модель двух взаимодействующих процессов.
CS1
(Критический
интервал)
CS2
(Критический
интервал)
PR1
(Оставшаяся
часть процесса 1)
PR2
(Оставшаяся
часть процесса 2)
Рис. 1. Модель взаимодействующих процессов
Пусть имеется два циклических процесса, в которых есть критические
секции, т.е. каждый из процессов состоит из двух частей:
 некоторого критического интервала;
 оставшаяся часть кода, в которой нет работы с общими переменными.
Пусть эти два процесса асинхронно разделяют по времени единственный
процессор, либо выполняются на отдельных процессорах, каждый из которых
имеет доступ к некоторой общей части памяти, с которой и работают критические
секции.
Рассмотрим вариант решения взаимного исключения, использующий только
блокировку памяти. Это известный алгоритм, предложенный математиком
Деккером. Алгоритм Деккера основан на использовании 3-х переменных: перекл1,
перекл2 и ОЧЕРЕДЬ. С каждым из процессов CS1 и CS2 будут связаны
соответственно переменные перекл1 и
перекл2, по смыслу являющиеся
переключателями, которые принимают значение true, когда соответствующий
процесс находится в своем критическом интервале, и false – в противном случае.
Переменная целого типа ОЧЕРЕДЬ указывает, чье сейчас право сделать попытку
входа, при условии, что оба процесса хотят выполнить свои критические
интервалы.
43
Если перекл2= true и перекл1= false, то выполняется критический интервал
для процесса CS2 независимо от значения переменной ОЧЕРЕДЬ. Аналогично для
случая перекл1= true и перекл2= false. Если же оба процесса хотят выполнить свои
критические интервалы, т.е. перекл2= true и перекл1= true, то выполняется
критический интервал того процесса, на который указывало значение переменной
ОЧЕРЕДЬ, независимо от скоростей развития процесса.
2. Синхронизация процессов посредством операции «ПРОВЕРКА И
УСТАНОВКА»
Операция «ПРОВЕРКА И УСТАНОВКА» является, как и блокировка памяти,
одним из аппаратных средств решения задачи критического интервала. Данная
операция реализована во многих компьютерах. Так в IBM 360 эта команда
называлась TS (test and set). Действие этой двухоперандной команды
заключается в том, что процессор присваивает значение второго операнда
первому, после чего второму операнду присваивается значение, равное единице.
Эта команда является неделимой, то есть между ее началом и концом не могут
выполняться никакие другие команды.
Чтобы использовать команду TS для решения проблемы критического
интервала, свяжем с ней переменную CS1, которая будет общей для всех
процессов, использующих некоторый критический ресурс. Данная переменная
будет принимать единичное значение, если какой-либо из взаимодействующих
процессов находится в своем критическом интервале. С каждым процессом
связана своя локальная переменная local, которая принимает значение, равное
единице, если данный процесс хочет войти в свой критический интервал.
Операция TS будет присваивать
значение common переменной local и
устанавливать common в единицу.
Пусть значение common равно нулю. Предположим, что первым захочет
войти в свой критический интервал процесс CS1. В этом случае значение local1
установится в единицу, а после цикла проверки с помощью команды
TS(local1, common) – в ноль. При этом значение common станет равным единице.
Процесс CS1 войдет в свой критический интервал. После выполнения этого
критического интервала common примет значение равное нулю, что даст
возможность второму процессу CS2 войти в свой критический интервал.
В микропроцессорах i80386 и старше есть специальные команды BTC, BTS
(bit test and reset – проверка бита и установка), BTR, которые как раз и являются
вариантами реализации команды типа «ПРОВЕРКА И УСТАНОВКА».
Несмотря на то, что и алгоритм Деккера и операция «ПРОВЕРКА И
УСТАНОВКА» пригодны для реализации взаимного исключения, оба эти приема
очень неэффективны. Всякий раз, когда один из процессов выполняет свой
критический интервал, любой другой процесс, который пытается войти в свою
критическую секцию, попадает в цикл проверки соответствующих переменныхфлагов, регламентирующих доступ к критическим переменным (находится в
44
активном ожидании). В результате имеем общее замедление вычислительной
системы процессами, которые реально не выполняют никакой полезной работы.
До тех пор, пока процесс, занимающий в данный момент критический ресурс,
не решит его уступить, все другие процессы, ожидающие этого ресурса, могли бы
вообще не конкурировать за процессорное время. Для этого их надо перевести в
состояние ожидания (заблокировать их выполнение)
Вместо того чтобы связывать с каждым процессом свою собственную
переменную можно со всем множеством конкурирующих критических секций
связать одну переменную, которую и рассматривать как некоторый «ключ».
Перед входом в свой критический интервал процесс забирает «ключ» и тем самым
блокирует другие процессы. Таким образом, каждый процесс, входящий в
критический интервал, должен вначале проверить, доступен ли «ключ», и если
это так, то сделать его недоступным для других процессов. Самым главным здесь
является то, что эти два действия должны быть неделимыми, чтобы два или более
процессов не могли одновременно получить доступ к «ключу».
Таким образом, мы подошли к одному из главных механизмов решения
проблемы взаимного исключения – семафорам Дейкстры.
3. Семафорные примитивы Дейкстры
Семафор – переменная специального типа, которая доступна параллельным
процессам для проведения над ней только двух операций: «закрытии» и
«открытия», названных соответственно P- и V-операциями. Эти операции
являются примитивами относительно семафора, который указывается в качестве
параметра операции. Здесь семафор выполняет роль вспомогательного
критического ресурса, так как операции P и V неделимы при своем выполнении и
взаимно исключают друг друга.
Основным достоинством семафорных операций является отсутствие
состояния «активного ожидания», что повышает эффективность работы
мультипрограммной вычислительной системы.
В настоящее время используют много различных семафорных механизмов.
Варьируемыми параметрами, которые отличают различные виды примитивов,
являются:
 начальное значение и диапазон изменения значений семафора;
 логика действий семафорных операций;
 количество семафоров, доступных для обработки при исполнении
отдельного примитива.
Обобщенный смысл примитива P(S) состоит в проверке текущего значения
семафора S (P – от голландского Proberen – проверить), и если оно не меньше
нуля, то осуществляется переход к следующей за примитивом операции. В
противном случае процесс снимается на некоторое время с выполнения и
переводится в состояние «пассивного ожидания». Находясь в списке
заблокированных, ожидающий процесс не проверяет семафор непрерывно, как в
случае активного ожидания.
45
Операция V(S) связана с увеличением значения семафора на единицу (V – от
голландского Verhogen – увеличить) и переводом одного или нескольких
процессов в состояние готовности к центральному процессору.
Операции P и V выполняются операционной системой в ответ на запрос,
выданный некоторым процессом и содержащий имя семафора в качестве
параметра.
Допустимыми значениями семафора являются только целые числа. Двоичным
семафором называют семафор, максимальное значение которого равно единице.
В противном случае семафоры называют N-ичными.
Рассмотрим на нашем примере двух конкурирующих процессов
использование данных семафорных примитивов для решения проблемы
критического интервала:
1) семафор имеет начальное значение, равное 1. Если процессы CS1 и CS2
попытаются одновременно выполнить примитив P(S), то это удастся сделать
только одному из них. Пусть это будет CS2:
2) процесс CS2 закрывает семафор S (выполняет операцию P(S)) и выполняет
свой критический интервал. Процесс CS1 будет заблокирован на семафоре S. Тем
самым гарантируется взаимное исключение;
3) после выполнения примитива V(S) процессом CS2 семафор S открывается,
указывая на возможность захвата каким-либо процессом освободившегося
критического ресурса. При этом производится перевод процесса
CS1 из
заблокированного состояния в состояние готовности.
4. Мониторы Хоара
Несмотря на очевидные достоинства (простота, независимость от количества
процессов, отсутствие «активного ожидания») семафорные механизмы имеют и
ряд недостатков. Они слишком примитивны, так как семафор не указывает
непосредственно на синхронизирующее условие, с которым он связан, или на
критический ресурс. Поэтому при построении сложных схем синхронизации
алгоритмы получаются весьма непростыми и ненаглядными.
Необходимо иметь понятные, очевидные решения, которые позволят
программистам создавать параллельные взаимодействующие программы. К таки
решениям можно отнести так называемые мониторы, предложенные Хоаром.
В параллельном программировании монитор – это пассивный набор
разделяемых переменных и повторно входимых процедур доступа к ним, которым
процессы пользуются в режиме разделения, причем в каждый момент им может
пользоваться только один процесс.
Монитор – это механизм организации параллелизма, который содержит как
данные, так и процедуры, необходимые для реализации динамического
распределения общего ресурса. Процесс, желающий получить доступ к
разделяемым переменным, должен обратиться к монитору, который либо
предоставит доступ, либо откажет в нем. Вход в монитор находится под жестким
46
контролем – здесь осуществляется взаимоисключение процессов, так что в
каждый момент времени только одному процессу можно войти в монитор.
Процессам, которым надо войти в монитор, когда он уже занят, приходится
ждать, причем режимом ожидания автоматически управляет сам монитор. При
отказе в доступе монитор блокирует обратившийся к нему процесс и определяет
условие, по которому процесс ждет. Внутренние данные монитора могут быть
либо глобальными (относящимися ко всем процедурам монитора), либо
локальными (относящимися только к одной конкретной процедуре). Ко всем этим
данным можно обращаться только изнутри монитора. При первом обращении
монитор присваивает своим переменным начальные значения. При каждом новом
обращении используются те значения переменных, которые сохранились от
предыдущего обращения.
Со временем процесс, который занимал данный ресурс, обратится к
монитору, чтобы возвратить ресурс системе. Чтобы гарантировать, что процесс,
находящийся в ожидании некоторого ресурса, со временем получит этот ресурс,
делается так, что ожидающий процесс имеет более высокий приоритет, чем новый
процесс, пытающийся войти в монитор.
По сравнению с семафорами мониторы обеспечивают
значительное
упрощение организации взаимодействующих вычислительных процессов и
большую наглядность лишь при незначительной потере в эффективности.
5. Почтовые ящики
Тесное взаимодействие между процессами предполагает не только
синхронизацию – обмен временными сигналами, но и передачу, и получение
произвольных данных – обмен сообщениями. В системе с одним процессором
посылающий и принимающий процессы не могут работать одновременно.
Следовательно, для хранения посланного, но еще не полученного сообщения
необходимо место. Оно называется буфером сообщений или почтовым ящиком.
Это информационная структура, поддерживаемая операционной системой. Она
состоит из головного элемента, в котором находится информация о данном
почтовом ящике, и из нескольких буферов (гнезд), в которые помещают
сообщения. Размер каждого буфера их количество обычно задаются при
образовании почтового ящика.
Основные достоинства почтовых ящиков:
 процессу не нужно знать о существовании других процессов до тех пор,
пока он не получит сообщения от них;
 два процесса могут обмениваться более чем одним сообщением за один
раз;
 операционная система может гарантировать, что никакой процесс не
вмешается в «беседу» других процессов:
 очереди буферов позволяют процессу-отправителю продолжать работу,
обращая внимания на получателя.
47
Основным недостатком буферизации сообщений является появление еще
одного ресурса, которым нужно управлять.
6. Конвейеры (программные каналы)
Конвейер (pipe –программный канал, транспортер) является средством, с
помощью которого можно производить обмен данными между процессами.
Принцип работы конвейера основан на механизме ввода/вывода, который
используется с файлами в UNIX – задача, передающая информацию, действует
так, как будто она записывает данные в файл, в то время как задача, для которой
предназначается эта информация, читает ее из этого файла. Операции записи и
чтения осуществляются не записями, как это делается в обычных файлах, а
потоком байтов, как это делается в UNIX-системах. Функции, с помощью
которых выполняется запись в канал и чтение из него, являются теми же самыми,
что и при работе с файлами. На самом деле конвейеры являются не файлами на
диске, а представляют собой буферную память, работающую по принципу
обычной очереди (FIFO – first input, first output)
Конвейер имеет максимальный размер 64 Кбайт и работает циклически.
Head
Tail
Tail
Head
Рис. 2. Организация очереди на массиве.
Имеется некий массив и два указателя, равные нулю в начальный момент:
 один показывает на первый элемент – Head (Голова);
 второй – на последний – Tail (Хвост).
Запись (добавление) одного элемента в пустую очередь делает оба указателя,
равными единице. В последующем при добавлении нового элемента
увеличивается указатель Tail. Чтение (удаление) элемента производится, начиная
с первого элемента созданной очереди. При этом, следовательно, будет
увеличиваться указатель Head. Таким образом, в результате операций записи и
чтения указатели будут перемещаться от начала массива к его концу. При
достижении указателем значения индекса последнего элемента, значение
48
указателя вновь становится равным единице. Массив как бы замыкается в кольцо,
организуя круговое перемещение указателей. Сказанное проиллюстрировано на
рис. 2.
Конвейеры представляют системный ресурс. Чтобы начать работу с
конвейером, процесс должен заказать его у операционной системы и получить в
свое распоряжение. Процессы, знающие идентификатор конвейера, могут через
него обмениваться данными.
7. Очереди сообщений
Очереди сообщений (queue) являются более сложным методом связи между
взаимодействующими процессами по сравнению с каналами. С помощью
очередей также можно из одной или нескольких задач независимым образом
посылать сообщения некоторой задаче-приемнику. При этом только процессприемник может читать и удалять сообщения из очереди, а процессы-клиенты
имеют право лишь помещать в очередь свои сообщения. Таким образом, очередь
работает в одном направлении. Если необходима двухсторонняя связь, то можно
создать две очереди.
Отличия работы с очередями от работы с конвейерами:
 очереди предоставляют возможность использовать несколько дисциплин
обработки сообщений:
o FIFO – сообщение, записанное первым, будет первым и прочитано;
o LIFO – сообщение, записанное последним, будет прочитано первым:
o приоритетный – сообщения читаются с учетом их приоритета;
o произвольный доступ, т.е. можно читать любое сообщение, тогда как
конвейер обеспечивает только дисциплину FIFO.
 при чтении сообщения из конвейера оно из него удаляется. При чтении из
очереди этого не происходит, сообщение при желании может быть прочитано
несколько раз;
 в очередях присутствуют не непосредственно сами сообщения, а только их
адреса в памяти и размер.
Каждый процесс, использующий очередь, должен предварительно получить
разрешение на использование общего сегмента памяти с помощью системных
запросов API (application program interface).
49
Проблема тупиков и методы борьбы с ними
При организации параллельного выполнения нескольких процессов одной из
главных функций ОС является решение сложной задачи корректного
распределения ресурсов между выполняющимися процессами и обеспечение
последних средствами взаимной синхронизации и обмена данными.
При параллельном исполнении процессов могут возникать ситуации, при
которых два или более процессов все время находятся в заблокированном
состоянии. Самым простым является случай, когда каждый из двух процессов
ожидает ресурс, занятый другим процессом. Эта тупиковая ситуация называется
дедлоком (dead lock –смертельное объятие), тупиком или клинчем. Тупики чаще
всего возникают из-за конкуренции несвязанных параллельных процессов за
ресурсы вычислительной системы, но иногда к тупикам приводят и ошибки
программирования.
Рассмотрим пример, поясняющий причину возникновения тупиков.
Пусть имеются три процесса ПР1, ПР2, ПР3, которые вырабатывают
соответственно сообщения М1, М2, М3. Пусть процесс ПР1 является
«потребителем» сообщения М3, процесс ПР2 получает сообщение М1, а ПР3 –
сообщение М2 от процесса ПР2, то есть каждый из процессов является и
«поставщиком» и «потребителем» одновременно и вместе они образуют
«кольцевую» систему передачи сообщений через почтовые ящики (ПЯ) – рис.1.
ПР1
ПЯ
1
ПЯ
2
ПР3
ПР2
ПЯ
3
Рис.1. Кольцевая схема взаимодействия процессов
Если процедуры в каждом процессе выполняются в следующем порядке:
ПР1:
…
Послать сообщение (ПР2, М1, ПЯ2);
Ждать сообщение (ПР3, М3, ПЯ1);
…
50
ПР2:
…
Послать сообщение (ПР3, М2, ПЯ3);
Ждать сообщение (ПР1, М1, ПЯ2);
…
ПР3: …
Послать сообщение (ПР1, М3, ПЯ1);
Ждать сообщение (ПР2, М2, ПЯ3);
…,
то никаких трудностей не возникает. Однако перестановка этих двух
процедур в каждом из процессов (Ждать….;Послать….;) вызывает тупик. В самом
деле, в этом случае ни один из процессов не может послать сообщения до тех пор,
пока сам его не получит, а этого события никогда не произойдет, поскольку ни
один процесс не может этого сделать.
Проблема борьбы с тупиками становится все более актуальной и сложной по
мере развития и внедрения параллельных систем. Борьба с тупиковыми
ситуациями основывается на одной из трех стратегий:
 предотвращение тупика;
 обход тупика;
 распознавание тупика с последующим восстановлением.
Предотвращение тупиков
Предотвращение тупика основывается на предположении о чрезвычайно
высокой его стоимости, поэтому лучше потратить дополнительные ресурсы
системы, чтобы исключить вероятность возникновения тупика при любых
обстоятельствах. Этот подход используется в наиболее ответственных системах,
часто это системы реального времени.
Для того чтобы возник тупик необходимо, чтобы одновременно выполнялись
следующие условия:
1. Взаимного исключения – процессы осуществляют монопольный доступ к
ресурсам;
2. Ожидания – процесс, запросивший ресурс, будет ждать, пока запрос не
будет удовлетворен, продолжая удерживать все остальные ресурсы, которые он
уже получил;
3. Отсутствия перераспределения – никакие ресурсы нельзя отобрать у
процесса, если они ему уже выделены;
4. Кругового ожидания – существует замкнутая цепь процессов, каждый из
которых ждет ресурс, удерживаемый его предшественником в этой цепи.
Дисциплина, предотвращающая тупик просто должна гарантировать, что ни
одно из четырех условий, необходимых для его наступления, не может
возникнуть.
51
Условие взаимного исключения можно подавить путем разрешения
неограниченного распределения ресурсов. Это совершенно неприемлемо к
совместно используемым переменным в критических интервалах.
Условие ожидания можно подавить, предварительно выделяя ресурсы. При
этом процесс может начать исполнение, только получив все необходимые
ресурсы. Это может привести к снижению эффективности работы
вычислительной системы в целом. Кроме того, это сделать зачастую невозможно,
так как необходимые ресурсы становятся известны процессу только после начала
исполнения.
Условие отсутствия перераспределения можно исключить, позволяя ОС
отнимать у процесса ресурсы. Перераспределение процессора реализуется
достаточно легко, в то время как перераспределение устройств ввода/вывода
крайне нежелательно.
Условие кругового ожидания можно исключить, предотвращая образование
цепи запросов. Это можно обеспечить с помощью принципа иерархического
выделения ресурсов, если порядок использования ресурсов является
иерархическим.
В целом стратегия предотвращения тупиков – это очень дорогое решение
проблемы, и она используется нечасто.
Обход тупиков
Это можно интерпретировать как запрет входа в опасное состояние. Если ни
одно из 4-х условий не исключено, то вход в опасное состояние можно все же
предотвратить при наличии у системы информации о последовательности
запросов, связанных с каждым параллельным процессом. Достаточно проверить,
не приведет ли выделение затребованного ресурса к опасному состоянию. Если
да, то запрос отклоняется. Если нет, то запрос выполняется. Проверка того,
является ли состояние опасным или нет, требует анализа последующих запросов
процессов. Существуют методы эффективного выполнения такого просмотра.
Распознавание тупика
За счет различных дорогостоящих вычислений можно установить,
существуют ли процессы, находящиеся в состоянии тупика. Чтобы выполнить эти
вычисления, ОС должна вести список тех ресурсов, которые ждет каждый
заблокированный процесс, и список тех процессов, которые держат каждый
недоступный ресурс. Алгоритм распознавания замкнутых цепей можно
выполнять с любой нужной частотой. Как только тупик выявлен, должно быть
выполнено восстановление. Существуют следующие методы восстановления:
1. Самый простой – это принудительное завершение всех процессов и запуск
ОС заново;
52
2. Менее радикальный – принудительное завершение всех процессов,
находящихся в тупике. В этом случае пользователи могут ввести их когда-нибудь
снова;
3. Принудительное завершение процессов, находящихся в тупике, по
одному и после каждого завершения вызов алгоритма выявления тупика до тех
пор, пока тупик не исчезнет;
4. Запуск процессов, находящихся в тупике, со своих контрольных точек в
предположении, что тупик больше не возникнет. Естественно, для этого должны
быть контрольные точки;
5. Перераспределение ресурсов одного или нескольких процессов, среди
которых могут быть даже такие, которые не находятся в тупике. Ресурсы
назначаются одному из оставшихся процессов, находящихся в тупике, и он
возобновляет исполнение;
6. Теоретически применим, если в момент, когда тупик выявлен, существует
несколько пользовательских процессов, которые не находятся в тупике. Если этим
процессам позволить доработать до конца и запретить образование новых
процессов, то они могут освободить достаточно ресурсов, чтобы тупик исчез.
Стоимость стратегии распознавания тупика зависит от того, насколько часто
выполняется алгоритм распознавания. Основная цена восстановления от тупика –
это потери времени, которые могут быть существенными.
53
Современные операционные системы
На ПК типа IBM PC наиболее популярными являются ОС семейства Windows
компании Microsoft. Это и Windows 95/98, и Windows NT, и Windows 2000, и
Windows XP. Но, кроме этих ОС, на ПК используются ОС Unix, Linux, OS/2,
QNX.
Изучая теорию ОС и работая на ПК, мы фактически познакомились с OC
семейства Windows. Поэтому не будем отдельно описывать эти ОС.
Рассмотрим же кратко ОС UNIX, которая является примером исключительно
удачной реализацией простой мультипрограммной и многопользовательской ОС.
Семейство операционных систем UNIX
UNIX проектировалась как инструментальная система для разработки
программного обеспечения. Была создана по сути, двумя разработчиками (Кен
Томпсон и Денис Ритчи) для себя и написана на языке С.
Unix-системы уже существуют 30 лет и сейчас поставляются с большим
набором системных и прикладных программ, включающим редакторы текстов,
программируемые интерпретаторы командного языка, компиляторы с нескольких
популярных языков программирования, отладчики, многочисленные библиотеки
системных и пользовательских программ, средства сортировки и ведения баз
данных, многочисленные административные и обслуживающие программы.
1. Основные понятия системы UNIX
Система UNIX – многопользовательская. Каждому пользователю после
регистрации предоставляется виртуальный компьютер, в котором есть все
необходимые ресурсы: процессор (процессорное время выделяется на основе
«карусельной» диспетчеризации – RR и с использованием динамических
приоритетов), память, устройства, файлы. Текущее состояние такого
виртуального компьютера называется образ. Образ состоит из:
 образа памяти;
 значений общих регистров процессора;
 состояния открытых файлов;
 текущего директория (каталога файлов) и другой информации.
Образ процесса во время его выполнения размещается в основной памяти.
Образ памяти делится на три логических сегмента:
 сегмент реентерабельных процедур – начинается с нулевого адреса в
виртуальном адресном пространстве процесса;
 сегмент данных – располагается сразу за сегментом процедур;
 сегмент стека – начинается со старших адресов и растет в сторону
младших.
Чтобы войти в систему пользователь должен со свободного терминала ввести
свое учетное имя (account name) и, возможно, пароль (password). Каждый
54
зарегистрированный пользователь получает неограниченный доступ к своему
домашнему (home) каталогу.
Традиционный способ взаимодействия пользователя с системой UNIX –
использование командных языков. Но сейчас работают все чаще с графическим
интерфейсом X Window. Общее название для любого командного интерпретатора
ОС UNIX – shell (оболочка). Вызванный командный интерпретатор выдает
приглашение на ввод пользователем командной строки, которая может содержать
простую команду, конвейер команд или последовательность команд.
Оболочкой (shell) называют механизм взаимодействия между пользователем
и системой. Любой командный язык семейства shell состоит из трех частей:
 служебных инструкций;
 встроенных команд, выполняемых интерпретатором командного языка;
 команд, представляемых отдельными выполняемыми файлами.
Процессы в ОС UNIX понимаются в классическом смысле этого термина, т.е.
как программа, выполняемая в собственном виртуальном адресном пространстве.
Когда пользователь входит в систему, автоматически создается процесс. Для
создания нового процесса и запуска в нем программы используются два
системных вызова API – fork() и exec(имя_выполняемого_файла). Каждый
процесс, за исключением нулевого, порождается в результате запуска другим
процессом операции fork(). Каждый процесс имеет одного родителя, но может
породить много процессов. Процесс с идентификатором 1, известный под именем
unit является предком любого другого процесса в системе и связан с каждым
процессом особым образом.
2. Функционирование системы UNIX
Процесс может выполняться в одном из двух состояний: пользовательском
(выполняет пользовательскую программу) и системном (выполняет программы
ядра и имеет доступ к системному сегменту данных).
Когда пользовательскому процессу требуется выполнить системную
функцию, он создает системный вызов. Фактически происходит вызов ядра
системы как подпрограммы. С этого момента процесс считается системным.
В UNIX- системах используется разделение времени, т.е. каждому процессу
выделяется квант времени. Процессам, которые получили большое количество
процессорного времени, назначают более низкие приоритеты, а процессам с
небольшим процессорным временем – повышают приоритет. Все системные
процессы имеют более высокие приоритеты по сравнению с пользовательскими
процессами.
Функции ввода/вывода задаются в основном с помощью пяти системных
вызовов:
 open – открыть файл;
 close – закрыть файл;
55
 read – чтение;
 write – запись;
 seek – операция поиска.
Механизм перенаправления ввода/вывода является одним из наиболее
элегантных, мощных и одновременно простых механизмов OC UNIX.
Реализация этого механизма основывается на следующих свойствах OC
UNIX:
 любой ввод/вывод трактуется как ввод из некоторого файла и вывод в
некоторый файл;
 клавиатура и экран также интерпретируются как файлы (первый можно
только читать, а во второй – только писать);
 доступ к любому файлу производится через его дескриптор
(положительное целое число). Файл с дескриптором 1 – файл стандартного ввода
(stdin), 2 – файл стандартного вывода (stdout) и 3 – файл стандартного вывода
диагностического сообщения (stderr);
 программа, запущенная в некотором процессе, «наследует» от
породившего процесса все дескрипторы открытых файлов.
Файлом стандартного ввода является клавиатура, а файлом стандартного
вывода и вывода диагностических сообщений – экран. Однако при запуске любой
команды можно сообщить какой файл или вывод какой программы должен
служить соответствующим файлом. Тогда интерпретатор перед выполнением
системного вызова exec открывает указанные файлы, подменяя смысл
дескрипторов 1, 2, 3.
Функция printf неявно использует stdout, функция scan – stdin, функция error
– stderr. Т.е. указывать дескриптор при использовании этих функций не надо.
3. Файловая система
Файл в UNIX представляет собой множество символов с произвольным
доступом. Рассмотрим организацию файлов на диске.
Информация на диске размещается поблочно, по 512 байт в каждом блоке.
Диск разбивается на области (см. рис.1):
 неиспользуемый блок;
 управляющий блок (суперблок), в котором содержится размер диска и
границы других областей;
 i-ый список, состоящий из описаний файлов, называемых i-узлами;
 область для хранения содержимого файлов.
Каждый i-ый узел содержит:
 идентификацию владельца;
 идентификацию группы владельца;
 биты защиты;
 физические адреса на диске, где находится содержимое файла;
 размер файла;
56
…
Свободный блок
Файл
Свободный блок
Блок с данными файла
Блок с данными файла
Блок с данными файла
i-узел n
…
i-узел 3
i-узел 2
i-узел 1
Суперблок
Неиспользуемый блок
 время создания файла;
 время последнего использования файла;
 время последнего изменения атрибутов;
 число связей-ссылок, указывающих на файл;
 индикацию, является ли файл директорией, обычным файлом или
специальным файлом.
Следом за i-м списком идут блоки, предназначенные для хранения
содержимого файлов. Пространство, оставшееся свободным от файлов, образует
связанный список свободных блоков.
Файл
Рис.1. Организация файлов в UNIX на диске.
Каждый файл однозначно идентифицируется:
 старшим номером устройства (определяет массив входных точек в
драйверы):
 младшим номером устройства (для выбора устройства из группы
идентичных физических устройств):
 i-м номером ( индекс i-узла данного файла в массиве i-узлов).
4. Межпроцессорные коммуникации
Для построения программных систем, работающих по принципам модели
«клиент-сервер» в UNIX существуют следующие механизмы:
 сигналы;
 семафоры;
 программные каналы;
 очереди сообщений;
 сегменты разделяемой памяти;
 вызовы удаленных процедур.
Многие из этих механизмов уже нам знакомы. Рассматривать их не будем.
57
Download