Единое окно доступа к образовательным ресурсам

Операционные системы. Теория и практика: Учебное пособие

Голосов: 2

В учебном пособии изложены особенности функционирования, назначения и архитектуры современных операционных систем (ОС). В работе отражены: понятие и эволюция операционных систем, архитектурные особенности и классификация ОС по различным критериям, особенности управления процессами и памятью, основы организации файловых систем и некоторые их конкретные примеры, рассмотрены консолидированные серверные системы хранения данных большого объема RAID. Для получения практических навыков работе в операционных системах (на примере систем семейства Unix-Linux) учебное пособие освещает вопросы разработки программных проектов с использованием специализированных утилит, а также по управлению процессами и потоками и средствами их синхронизации. Предназначено для студентов, обучающихся по направлению 230100 Информатика и вычислительная техника.

Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
    лицу сегментов, которую чаще называют таблицей дескрипторов сег-
ментов задачи.
     Таким образом, виртуальный адрес для этого способа будет состо-
ять из двух полей – номера сегмента и смещения относительно начала
сегмента. Соответствующая иллюстрация приведена на рис. 28 для слу-
чая обращения к ячейке, виртуальный адрес которой равен сегменту с
номером 11 со смещением от начала этого сегмента, равным 612. Как
видно в данном случае, ОС разместила данный сегмент в памяти, начи-
ная с ячейки с номером 19700.
     Регистр таблицы сегментов
     (таблицы дескрипторов
     сегментов)                                              Виртуальный адрес
            31500                                             11             612
                                                      S (Segment)     D (Destination)
                                          +


                                      Таблица дескрипторов текущей задачи
                                 P   Адрес начала    Длина          Права
                                      сегмента      сегмента       доступа

                                 1      19700         1300          R-X
               31511




                                                        Сегмент № 11
                                 +      19700




                                        23312




   Рисунок 28 – Сегментный способ организации распределения памяти
     Итак, каждый сегмент, размещаемый в памяти, имеет соответству-
ющую информационную структуру, часто называемую дескриптором
сегмента. Именно ОС строит для каждого исполняемого процесса соот-
ветствующую таблицу дескрипторов сегментов, и при размещении каж-
дого из сегментов в оперативной или внешней памяти отмечает в де-
скрипторе текущее местоположение сегмента. Если сегмент задачи в
данный момент находится в ОП, то об этом делается пометка в дескрип-
                                         101


торе. Как правило, для этого используется бит присутствия Р (от англ.
present). В этом случае в поле адреса диспетчер памяти записывает ад-
рес физической памяти, с которого сегмент начинается, а в поле длины
сегмента (limit) указывается количество адресуемых ячеек памяти. Это
поле используется не только для того, чтобы размещать сегменты без
наложения друг на друга, но и для того, чтобы контролировать, не об-
ращается ли код исполняющейся задачи за пределы текущего сегмента.
В случае превышения длины сегмента вследствие ошибок программи-
рования можно выявить нарушения адресации и с помощью введения
специальных аппаратных средств генерировать сигналы прерывания,
которые позволят фиксировать (обнаруживать) ошибки такого рода.
     Помимо информации о местоположении сегмента, в дескрипторе
сегмента, как правило, содержатся данные о его типе (сегмент кода или
сегмент данных), правах доступа к этому сегменту (можно или нельзя
его модифицировать, предоставлять другой задаче), отметка об обраще-
ниях к данному сегменту (информация о том, как часто или как давно
этот сегмент используется или не используется, на основании которой
можно принять решение о том, чтобы предоставить место, занимаемое
текущим сегментом, другому сегменту).
     При передаче управления следующей задаче ОС должна занести в
соответствующий регистр адрес таблицы дескрипторов сегментов этой
задачи. Сама таблица дескрипторов сегментов, в свою очередь, также
представляет собой сегмент данных, который обрабатывается диспетче-
ром памяти ОС.
     При таком подходе появляется возможность размещать в ОП не все
сегменты задачи, а только задействованные в данный момент. Благодаря
этому, с одной стороны, общий объем виртуального адресного про-
странства задачи может превосходить объем физической памяти компь-
ютера, на котором эта задача будет выполняться, с другой стороны, да-
же если потребности в памяти не превосходят имеющуюся физическую
память, можно размещать в памяти больше задач, поскольку любой за-
даче, как правило, все ее сегменты единовременно не нужны. Как из-
вестно, увеличение коэффициента мультипрограммирования µ позволя-
ет увеличить загрузку системы и более эффективно использовать ресур-
сы вычислительной системы.
     Очевидно, однако, что увеличивать количество задач можно только
до определенного предела, т.к. если в памяти не будет хватать места для
часто используемых сегментов, то производительность системы резко
упадет. Ведь сегмент, находящийся вне ОП, для участия в вычислениях
должен быть перемещен в ОП. При этом если в памяти есть свободное
пространство, то необходимо всего лишь найти нужный сегмент во
внешней памяти и загрузить его в ОП. Если свободного места нет, при-
                                  102


дется принять решение – на место какого из присутствующих сегментов
будет загружаться требуемый. Перемещение сегментов из ОП на жест-
кий диск и обратно часто называют свопингом сегментов.
     Итак, если требуемого сегмента в ОП нет, то возникает прерывание,
и управление передается через диспетчер памяти программе загрузки
сегмента. Пока происходит поиск сегмента во внешней памяти и загруз-
ка его в оперативную, диспетчер памяти определяет подходящее для
сегмента место. Возможно, что свободного места нет, и тогда принима-
ется решение о выгрузке какого-нибудь сегмента и выполняется его пе-
ремещение во внешнюю память. Если при этом еще остается время, то
процессор передается другой готовой к выполнению задаче. После за-
грузки необходимого сегмента процессор вновь передается задаче, вы-
звавшей прерывание из-за отсутствия сегмента. Всякий раз при считы-
вании сегмента в ОП в таблице дескрипторов сегментов необходимо
установить адрес начала сегмента и признак присутствия сегмента.
     Если свободного фрагмента памяти достаточного объема нет, но,
тем не менее, сумма этих свободных фрагментов превышает требования
по памяти для нового сегмента, то в принципе может быть применено
сжатие памяти, упомянутое выше в п. 4.2.5.
     В идеальном случае размер сегмента должен быть достаточно ма-
лым, чтобы его можно было разместить в случайно освобождающихся
фрагментах ОП, но достаточно большим, чтобы содержать логически
законченную часть программы с тем, чтобы минимизировать межсег-
ментные обращения.
     Дисциплины замещения. Для решения проблемы замещения
(определения того сегмента, который должен быть либо перемещен во
внешнюю память, либо просто замещен новым) используются следую-
щие дисциплины:
      FIFO (First In First Out – первый пришедший первым и выбыва-
     ет);
      LRU (Least Recently Used – неиспользуемый дольше других);
      LFU (Least Frequently Used – используемый реже других);
      random – случайный выбор сегмента.
     Первая и последняя дисциплины являются самыми простыми в реа-
лизации, но они не учитывают, насколько часто используется тот или
иной сегмент, и, следовательно, диспетчер памяти может выгрузить или
расформировать тот сегмент, к которому в самом ближайшем будущем
будет обращение. Безусловно, достоверной информация о том, какой из
сегментов потребуется в ближайшем будущем, в общем случае быть не
может, но вероятность ошибки для этих дисциплин многократно выше,
чем у второй и третьей, в которых учитывается информация об исполь-

                                 103


зовании сегментов.
     При использовании дисциплины FIFO с каждым сегментом связы-
вается очередность его размещения в памяти. Для замещения выбирает-
ся сегмент, первым попавший в память. Каждый вновь размещаемый в
памяти сегмент добавляется в хвост этой очереди. В этом случае учиты-
вается только время нахождения сегмента в памяти, но не учитывается
фактическое использование сегментов. Например, первые загруженные
сегменты программы могут содержать переменные, требующиеся на
протяжении всей ее работы. Это приводит к немедленному возвраще-
нию к только что замещенному сегменту.
     Для реализации дисциплин LRU и LFU необходимо, чтобы процес-
сор имел дополнительные аппаратные средства, обеспечивающие под-
держку реализации этих дисциплин. Минимальные требования – доста-
точно, чтобы при обращении к дескриптору сегмента для получения фи-
зического адреса, с которого сегмент начинает располагаться в памяти,
соответствующий бит обращения менял свое значение (скажем, с нуле-
вого, которое устанавливает ОС, в единичное). Тогда диспетчер памяти
может время от времени просматривать таблицы дескрипторов испол-
няющихся задач и собирать для соответствующей обработки статисти-
ческую информацию об обращениях к сегментам. В результате можно
составить список, упорядоченный либо по длительности простоя (для
дисциплины LRU), либо по частоте использования (для дисциплины
LFU).
     Защита памяти. Важнейшей проблемой, которая возникает при
организации мультипрограммного режима, является защита памяти. Для
того чтобы выполняющиеся приложения не смогли испортить саму ОС
и другие вычислительные процессы, необходимо, чтобы доступ к таб-
лицам сегментов с целью их модификации был обеспечен только для
кода самой ОС. Для этого код ОС должен выполняться в некотором
привилегированном режиме, из которого можно осуществлять манипу-
ляции дескрипторами сегментов, тогда как выход за пределы сегмента в
обычной прикладной программе должен вызывать прерывание по защи-
те памяти. Каждая прикладная задача должна иметь возможность обра-
щаться только к собственным и к общим сегментам.
     При сегментном способе организации виртуальной памяти появля-
ется несколько интересных возможностей по оптимизации управления
памятью.
     Во-первых, при загрузке программы на исполнение можно разме-
щать ее в памяти не целиком, а «по мере необходимости». Действитель-
но, поскольку в подавляющем большинстве случаев алгоритм, по кото-
рому работает код программы, является разветвленным, а не линейным,
то в зависимости от исходных данных некоторые части программы, рас-
                                 104


положенные в самостоятельных сегментах, могут быть не задействова-
ны, а значит их можно и не загружать в ОП.
     Во-вторых, некоторые программные модули, являющиеся сегмен-
тами, могут быть разделяемыми, поэтому относительно легко организо-
вать доступ к таким общим сегментам. Сегмент с разделяемым кодом
располагается в памяти в единственном экземпляре, а в нескольких таб-
лицах дескрипторов сегментов исполняющихся задач будут находиться
только указатели на такие разделяемые сегменты.
     Однако у сегментного способа распределения памяти есть и недо-
статки. Согласно схеме доступа к искомой ячейке памяти, представлен-
ной на рис. 28, сначала необходимо найти и прочитать дескриптор сег-
мента, а уже потом, используя полученные данные о местонахождении
нужного сегмента, вычислить конечный физический адрес, что требует
времени. Для того чтобы уменьшить эти временные потери использует-
ся кэширование, то есть размещение в сверхоперативной памяти (специ-
альных регистрах, размещаемых в процессоре) тех дескрипторов, с ко-
торыми идет работа в текущий момент.
     Пример использования. Примером использования сегментного
способа организации виртуальной памяти является ОС OS/2 первого по-
коления, которая была создана для персональных компьютеров на базе
процессора i80286. В этой ОС в полной мере использованы аппаратные
средства микропроцессора, который специально проектировался для
поддержки сегментного способа распределения памяти. Система OS/2
v.l поддерживала распределение памяти, при котором выделялись сег-
менты программы и сегменты данных. Система позволяла работать как с
именованными, так и с неименованными сегментами. Имена разделяе-
мых сегментов данных имели ту же форму, что и имена файлов. Про-
цессы получали доступ к именованным разделяемым сегментам, ис-
пользуя их имена в специальных системных вызовах. Операционная си-
стема OS/2 v.1 допускала разделение программных сегментов приложе-
ний и подсистем, а также глобальных сегментов данных подсистем. Во-
обще, вся концепция системы OS/2 была построена на понятии разделе-
ния памяти: процессы почти всегда разделяют сегменты с другими про-
цессами. В этом состояло существенное отличие системы OS/2 от си-
стем типа Unix, которые обычно разделяют только реентерабельные
программные модули между процессами.
     Сегменты, которые активно не использовались, могли выгружаться
на жесткий диск. Система восстанавливала их, когда в этом возникала
необходимость. Учитывая то, что все области памяти, используемые
сегментом, должны были быть непрерывными, OS/2 перемещала в ос-
новной памяти сегменты таким образом, чтобы максимизировать объем
свободной физической памяти (осуществляла уплотнение памяти). Об-
                                 105


ласти в младших адресах физической памяти, которые использовались
для запуска DOS-программ и кода самой OS/2, в уплотнении памяти не
участвовали. Кроме того, система или прикладная программа могла
временно фиксировать сегмент в памяти с тем, чтобы гарантировать
наличие буфера ввода-вывода в физической памяти до тех пор, пока
операция ввода-вывода не завершится. Если в результате уплотнения
памяти не удавалось создать необходимое свободное пространство, то
супервизор выполнял операции фонового плана для перекачки доста-
точного количества сегментов из физической памяти, чтобы дать воз-
можность завершиться исходному запросу.
    4.2.7   Страничное распределение
     Несмотря на то, что рассмотренный выше сегментный способ рас-
пределения памяти приводит к существенно меньшей фрагментации па-
мяти, по сравнению со способами с неразрывным распределением,
фрагментация все равно присутствует. Кроме того, много памяти и про-
цессорного времени теряется на размещение и обработку дескриптор-
ных таблиц, так как на каждую задачу необходимо иметь свою таблицу
дескрипторов сегментов, а при определении физических адресов прихо-
дится выполнять достаточно затратные операции сложения.
     Поэтому другим способом разрывного размещения задач в памяти
стал страничный способ организации виртуальной памяти, при котором
все фрагменты задачи считаются равными (одинакового размера), при-
чем длина фрагмента в идеале должна быть кратна степени двойки, что-
бы операции сложения можно было заменить операциями конкатена-
ции.
     Как уже упоминалось, при страничном способе организации вирту-
альной памяти все фрагменты программы, на которые она разбивается
(за исключением последней ее части), получаются одинаковыми. Оди-
наковыми полагаются и единицы памяти, которые предоставляются для
размещения фрагментов программы. Эти одинаковые части называют
страницами и говорят, что ОП разбивается на физические страницы, а
программа – на виртуальные страницы. Часть виртуальных страниц за-
дачи размещается в ОП, а часть – во внешней памяти. Обычно место во
внешней памяти, в качестве которой в абсолютном большинстве случаев
выступают накопители на магнитных дисках (поскольку они относятся к
быстродействующим устройствам с прямым доступом), называют фай-
лом подкачки, или страничным файлом (англ. paging file). Иногда этот
файл называют swap-файлом, тем самым подчеркивая, что записи этого
файла – страницы – замещают друг друга в ОП. В некоторых ОС вы-
груженные страницы располагаются не в файле, а в специальном разде-
ле дискового пространства.
                                106


     Разбиение всей ОП на страницы одинаковой величины, причем
кратной степени двойки, приводит к тому, что вместо одномерного ад-
ресного пространства памяти можно говорить о двухмерном. Первая ко-
ордината адресного пространства – это номер страницы, вторая коорди-
ната – номер ячейки внутри выбранной страницы (его называют индек-
сом). Таким образом, физический адрес определяется парой (Рp, i), а
виртуальный адрес – парой (Pv, i), где Pv – номер виртуальной страни-
цы, Рр – номер физической страницы, i – индекс ячейки внутри страни-
цы. Количество битов, отводимое под индекс, определяет размер стра-
ницы, а количество битов, отводимое под номер виртуальной страницы,
– объем потенциально доступной для программы виртуальной памяти.
Отображение, осуществляемое системой во время исполнения, сводится
к отображению Pv в Рр и приписыванию к полученному значению битов
адреса, задаваемых величиной i. При этом нет необходимости ограничи-
вать число виртуальных страниц числом физических, то есть не поме-
стившиеся страницы можно размещать во внешней памяти, которая в
данном случае служит расширением оперативной.
     Для отображения виртуального адресного пространства задачи на
физическую память, как и в случае сегментного способа организации,
для каждой задачи необходимо иметь таблицу страниц для трансляции
адресных пространств. Для описания каждой страницы диспетчер памя-
ти ОС заводит соответствующий дескриптор, который отличается от де-
скриптора сегмента прежде всего тем, что в нем нет поля длины – ведь
все страницы имеют одинаковый размер. По номеру виртуальной стра-
ницы в таблице дескрипторов страниц текущей задачи находится соот-
ветствующий элемент (дескриптор). Если бит присутствия имеет еди-
ничное значение, значит данная страница размещена в оперативной, а не
во внешней памяти, и в дескрипторе – номер физической страницы, от-
веденной под данную виртуальную. Если же бит присутствия равен ну-
лю, то в дескрипторе – адрес виртуальной страницы, расположенной во
внешней памяти. Именно таким образом осуществляется трансляция
виртуального адресного пространства на физическую память. Этот ме-
ханизм трансляции иллюстрирует рис. 29.
     Защита страничной памяти. Защита страничной памяти, как и в
случае сегментного механизма, основана на контроле уровня доступа к
каждой странице. Как правило, возможны следующие уровни доступа:
      только чтение;
      чтение и запись;
      только выполнение.
     Каждая страница снабжается соответствующим кодом уровня до-
ступа. При трансформации логического адреса в физический сравнива-

                                 107


ется значение кода разрешенного уровня доступа с фактически требуе-
мым. При их несовпадении работа программы прерывается.
       Регистр таблицы страниц                              Виртуальный адрес
              32000                                          17              612
                                                          P (Page)         i (index)
                                             +


                                          Таблица страниц текущей задачи
                                 P    Номер физической     Права
                                        страницы или      доступа
                                       адрес на диске
           32017
                                 1               23        R-X




                                                         Страница № 23
                                 //      23000
                                 /


                                         23612




     Рисунок 29 – Страничный способ организации распределения памяти
     При обращении к виртуальной странице, не оказавшейся в данный
момент в ОП, возникает прерывание, и управление передается диспет-
черу памяти, который должен найти свободное место. Обычно предо-
ставляется первая же свободная страница. Если свободной физической
страницы нет, то диспетчер памяти по одной из вышеупомянутых дис-
циплин замещения (LRU, LFU, FIFO, случайный доступ) определит
страницу, подлежащую расформированию или сохранению во внешней
памяти. На ее месте он разместит новую виртуальную страницу, к кото-
рой было обращение из задачи, но которой не оказалось в ОП.
     Напомним, что дисциплина LFU позволяет выбрать для замещения
ту страницу, на которую не было ссылки на протяжении наиболее дли-
тельного периода времени. Дисциплина LRU ассоциирует с каждой
страницей время ее последнего использования. Для замещения выбира-
ется та страница, которая дольше всех не использовалась.
     Для использования дисциплин LRU и LFU в процессоре должны
                                       108


быть соответствующие аппаратные средства. В дескрипторе страницы
размещается бит обращения, который становится единичным при обра-
щении к дескриптору.
    Если объем физической памяти небольшой и даже часто требуемые
страницы не удается разместить в ОП, возникает так называемая «про-
буксовка» – ситуация, при которой загрузка нужной страницы вызывает
перемещение во внешнюю память той страницы, с которой идет актив-
ная работа. Очевидно, что это очень плохое явление. Чтобы его не до-
пускать, желательно увеличить объем ОП (учитывая сравнительно низ-
кую стоимость – это, как правило, не сложно), уменьшить количество
параллельно выполняемых задач или прибегнуть к более эффективным
дисциплинам замещения.
    На рис. 30 представлен пример страничного распределения памяти
с участием двух процессов. Подпись «Nвс» в таблицах страниц означает
«номер виртуальной страницы», подпись «Nфс» – «номер физической
страницы».
     Виртуальное адресное
    пространство процесса 1         Таблица страниц пр.1

                0                  N вс     N фс     Упр. инф.
                1                   0         5                      Физическая     N физ
                2                   1       ВП                        память         стр.
                3                   2       ВП                                        0
                                    3        10                                       1
               4                                                       4 пр. 1        2
                                    4         2
                                                                                      3
                                                                                      4
      Фиктивная                                                        0 пр. 1        5
       область                                                                        6
                                                                                      7
      Виртуальное адресное                                             0 пр. 2        8
     пространство процесса 2          Таблица страниц пр.2                            9
                 0                 N вс     N фс     Упр. инф.                        10
                 1                  0         5                        5 пр. 2        11
                 2                  1       ВП                                        12
                 3                  2       ВП                                        13
                 4                  3        10                                       14
                 5                  4         2
                                    5

      Vвирт.стр.=Vфиз.стр.= 2k
                                                                 Страничный обмен

         Регистр адреса таблицы страниц

           Рисунок 30 – Пример распределения памяти страницами
     Примеры использования. Для абсолютного большинства совре-
менных ОС характерна дисциплина замещения страниц LRU как наибо-
лее эффективная. Так, именно эта дисциплина использована в OS/2 и
Linux. Однако в ОС Windows NT/2000/XP разработчики, желая сделать
их максимально независимыми от аппаратных возможностей процессо-
ра, отказались от этой дисциплины и применили правило FIFO.
                                                   109


     Для того чтобы компенсировать неэффективность правила FIFO,
была введена «буферизация» тех страниц, которые должны быть запи-
саны в файл подкачки на диск10 или просто расформированы. Принцип
буферизации следующий. Прежде чем замещаемая страница действи-
тельно окажется во внешней памяти или просто расформированной, она
помечается как кандидат на выгрузку, если в следующий раз произойдет
обращение к странице, находящейся в таком «буфере», то страница ни-
куда не выгружается и уходит в конец списка FIFO. В противном случае
страница действительно выгружается, а на ее место в «буфер» попадает
следующий «кандидат». Величина такого «буфера» не может быть
большой, поэтому эффективность страничной реализации памяти в Win-
dows NT/2000/XP намного ниже, чем в других ОС, и явление пробуксов-
ки проявляется даже при относительно большом объеме ОП.
     В ряде ОС с пакетным режимом работы для борьбы с пробуксовкой
используется метод «рабочего множества». Рабочее множество – это
множество «активных» страниц задачи за некоторый интервал Т, то есть
тех страниц, к которым было обращение за этот интервал времени. Ре-
ально количество активных страниц задачи (за интервал Т) все время
изменяется, и это естественно, но, тем не менее, для каждой задачи
можно определить среднее количество ее активных страниц. Это коли-
чество и есть рабочее множество задачи. Ряд наблюдений за исполнени-
ем множества различных программ показали, что даже если интервал Т
равен времени выполнения всей работы, то размер рабочего множества
часто существенно меньше, чем общее число страниц программы. Та-
ким образом, если ОС может определить рабочие множества испол-
няющихся задач, то для предотвращения пробуксовки достаточно пла-
нировать на выполнение только такое количество задач, чтобы сумма их
рабочих множеств не превышала возможностей системы.
     Как и в случае с сегментным способом организации виртуальной
памяти, страничный механизм приводит к тому, что без специальных
аппаратных средств он существенно замедляет работу вычислительной
системы, поэтому используют различные походы к повышению эффек-
тивности использования таблиц страниц. Например, одним из примеров
эффективного механизма кэширования является ассоциативный кэш.
Именно такой ассоциативный кэш и создан в 32-разрядных микропро-
цессорах i80x86. Начиная с i80386, который поддерживает страничный
способ распределения памяти, в этих микропроцессорах имеется кэш на
32 страничных дескриптора. Поскольку размер страницы в этих микро-
процессорах равен 4 Кбайт, возможно быстрое обращение к памяти раз-

10
  В системе Windows NT/2000/XP файл с выгруженными виртуальными страницами носит название
PageFile.sys.
                                          110



    
Яндекс цитирования Яндекс.Метрика