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

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

Голосов: 2

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

Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
        4.2     Распределение памяти
    4.2.1   Общие принципы управления памятью в однопрограммных
    ОС
     Непрерывное распределение. Непрерывное распределение – это
самая простая и распространенная схема, согласно которой вся память
условно может быть разделена на три области:
      область, занимаемая ОС;
      область, в которой размещается исполняемый процесс;
      свободная область памяти.
     Эта схема предполагает, что ОС не поддерживает мультипрограм-
мирование, поэтому не возникает проблемы распределения памяти меж-
ду несколькими процессами. Программные модули, необходимые для
всех программ, располагаются в области самой ОС, а вся оставшаяся
память может быть предоставлена исполняемому процессу. Эта область
памяти получается непрерывной, что облегчает работу системы про-
граммирования. Поскольку в различных однотипных вычислительных
комплексах может быть разный состав внешних устройств (и, соответ-
ственно, они содержат различное количество драйверов), для системных
нужд могут быть отведены отличающиеся объемы ОП, и получается,
что можно не привязывать жестко виртуальные адреса программы к фи-
зическому адресному пространству. Эта привязка осуществляется на
этапе загрузки задачи (процесса) в память.
     Для того чтобы отвести задачам как можно больший объем памяти,
ОС строится таким образом, чтобы постоянно в ОП располагалась толь-
ко самая нужная ее часть – ядро ОС. Прежде всего, в ядро ОС входят
основные модули супервизора. Для однопрограммных систем понятие
супервизора вырождается в модули, получающие и выполняющие пер-
вичную обработку запросов от обрабатывающих и прикладных про-
грамм, и в модули подсистемы памяти. Ведь если программа по ходу
своего выполнения запрашивает некоторое множество ячеек памяти, то
подсистема управления памятью должна их выделить (если они есть), а
после освобождения памяти эта подсистема должна выполнить дей-
ствия, связанные с возвратом памяти в систему. Остальные модули ОС,
не относящиеся к ее ядру, могут быть обычными диск-резидентными
(или транзитными), то есть загружаться в ОП только по необходимо-
сти, и после своего выполнения вновь освобождать память.
     Такая схема распределения влечет за собой два вида потерь вычис-
лительных ресурсов:
     1) Потерю процессорного времени, потому что процессор простаи-
вает, пока задача ожидает завершения операций ввода-вывода.
                                 91


     2) Потерю самой ОП, потому что далеко не каждая программа ис-
пользует всю память, а режим работы в этом случае однопрограммный.
В то же время это недорогая реализация, которая позволяет отказаться
от многих второстепенных функций ОС. В частности, такая сложная
проблема, как защита памяти, здесь практически отсутствует. Един-
ственное, что желательно защищать – это программные модули и обла-
сти памяти самой ОС.
     Оверлейное распределение. Если есть необходимость создать
программу, логическое адресное пространство которой должно быть
больше, чем свободная область памяти, или даже больше, чем весь воз-
можный объем ОП, то используется распределение с перекрытием, в ос-
нове которого лежит использование так называемых оверлейных струк-
тур (англ. overlay – перекрытие, расположение поверх чего-то).
     Этот метод распределения предполагает, что вся программа может
быть разбита на части – сегменты. Каждая оверлейная программа имеет
одну главную (main) часть и несколько сегментов (segments), причем в
памяти машины одновременно могут находиться только ее главная
часть и один или несколько не перекрывающихся сегментов. На рис. 22
представлен пример организации некоторой программы с перекрытием,
причем в представленном случае поочередно можно загружать в память
ветви A-B, A-C-D и A-C-E программы.
                                               A
         Programme A    Subroutine C
         …              …
         Call B         Call D          B            С
         …              …
         Call C         Call E
         …              …                     D             E


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


                                  92


сегмент загрузить в ОП, и вновь отдает управление одному из сегмен-
тов, располагающихся в памяти.
     Простейшие схемы сегментирования предполагают, что в памяти в
каждый конкретный момент времени может располагаться только один
сегмент (вместе с главным модулем). Более сложные схемы, используе-
мые в больших вычислительных системах, позволяют располагать в па-
мяти несколько сегментов. В некоторых вычислительных комплексах
могли существовать отдельно сегменты кода и сегменты данных. Сег-
менты кода, как правило, не претерпевают изменений в процессе своего
исполнения, поэтому при загрузке нового сегмента кода на место отра-
ботавшего последний можно не сохранять во внешней памяти, в отли-
чие от сегментов данных, которые сохранять необходимо.
     Первоначально программисты сами должны были включать в тек-
сты своих программ соответствующие обращения к ОС (системные вы-
зовы) и тщательно планировать, какие сегменты могут находиться в ОП
одновременно, чтобы их адресные пространства не пересекались. Одна-
ко с некоторых пор такого рода обращения к ОС системы программиро-
вания стали подставлять в код программы сами, автоматически, если в
том возникает необходимость.
     В известной и популярной в недалеком прошлом системе програм-
мирования Turbo Pascal программист просто указывал, что данный мо-
дуль является оверлейным. При обращении к нему из основной про-
граммы модуль загружался в память и получал управление. Все адреса
определялись системой программирования автоматически, обращения к
DOS для загрузки оверлеев тоже генерировались системой Turbo Pascal.
     Рассмотрев основные принципы работы с памятью в однопро-
граммных ОС, перейдем к рассмотрению особенностей распределения
памяти для более распространенных сегодня мультипрограммных ОС.
    4.2.2 Особенности организации управления памятью в мульти-
    программных ОС
    Для организации мультипрограммного режима необходимо обеспе-
чить одновременное расположение в ОП нескольких задач (целиком или
частями). При решении этой задачи ОС должна учитывать целый ряд
моментов:
     следует ли назначать каждому процессу одну непрерывную об-
ласть физической памяти или фрагментами;
     должны ли сегменты программы, загруженные в память, нахо-
диться на одном месте в течение всего периода выполнения процесса
или можно ее время от времени сдвигать;
     что следует предпринять, если сегменты программы не поме-
щаются в имеющуюся память.
                                 93


     Разные ОС по-разному «отвечают» на подобные вопросы управле-
ния памятью. Рассмотрим ниже наиболее общие подходы к распределе-
нию памяти, которые были характерны для разных периодов развития
ОС.
     Все методы распределения памяти по критерию использования раз-
личных видов запоминающих устройств можно разделить на два класса
(рис. 23):
      в которых используется перемещение сегментов процессов
между ОП и диском;
      в которых внешняя память не привлекается.
                                 Методы распределения
                                        памяти




            Без испо льзования                    С испо льзованием
             внешней памяти                        внешней памяти




                Фиксированными                          Страничное
                разделами                               распределение



                Динамическими                           Сегментное
                разделами                               распределение



                Перемещаемыми                           Сегментно-страничное
                разделами                               распределение

                   Рисунок 23 – Методы распределения памяти
    Рассмотрим эти методы более подробно, начав обзор с методов
распределения без использования внешней памяти.
    4.2.3     Распределение фиксированными разделами
    Простейший способ управления ОП состоит в том, что память раз-
бивается на несколько областей фиксированной величины, называемых
разделами. Такое разбиение может быть выполнено вручную операто-
ром во время старта системы или во время ее установки. После этого
границы разделов не изменяются. Очередной новый процесс, поступив-
ший на выполнение, помещается либо в общую очередь (рис. 24а), либо
в очередь к некоторому разделу (рис. 24б). В каждом разделе в каждый
                                           94


момент времени может располагаться по одной программе (задаче), и к
каждому разделу в отдельности можно применить методы, используе-
мые при распределении памяти в однопрограммных системах.

                                         ОС

               Очередь задач                           Раздел 1




               -свободная                              Раздел 2
               область
               -занятая
               область

                                                       Раздел 3

                                 а)
          Очереди к
          разделам                        ОС

                                                         Раздел 1




                                                         Раздел 2




                                                         Раздел 3


                                   б)
     Рисунок 24 – Распределение памяти фиксированными разделами:
           с общей очередью (а); с отдельными очередями (б)
     Подсистема управления памятью в этом случае выполняет следую-
щие задачи:
     1) Сравнивает объем памяти, требуемый для вновь поступившего
процесса, с размерами свободных разделов и выбирает подходящий раз-
дел.
     2) Осуществляет загрузку программы в один из разделов и
настройку адресов. Уже на этапе трансляции разработчик программы
                                 95


может задать раздел, в котором ее следует выполнять. Это позволяет
сразу, без использования перемещающего загрузчика, получить машин-
ный код, настроенный на конкретную область памяти.
     При очевидном преимуществе как простота реализации, данный
метод имеет существенный недостаток – существенные потери памяти
от внутренней фрагментации. Фрагментация возникает потому, что про-
цесс не полностью занимает выделенный ему раздел или потому, что
некоторые разделы слишком малы для выполняемых пользовательских
программ. Кроме того, учитывая то, что в каждом разделе может выпол-
няться только один процесс, уровень мультипрограммирования заранее
ограничен числом разделов, т.к. процесс независимо от размера будет
занимать весь раздел. Так, например, в системе с тремя разделами не-
возможно выполнять одновременно не более трех процессов, даже если
им требуется совсем мало памяти.
     Такой способ управления памятью применялся в ранних мульти-
программных ОС. Однако и сейчас метод распределения памяти фикси-
рованными разделами находит применение в ОСРВ, в основном благо-
даря небольшим затратам на реализацию. Детерминированность вычис-
лительного процесса систем реального времени (заранее известен набор
выполняемых задач, их требования к памяти, а иногда и моменты запус-
ка) компенсирует недостаточную гибкость данного способа управления
памятью.
    4.2.4   Распределение динамическими разделами
     Чтобы избавится от фрагментации, присущей распределению памя-
ти с фиксированными разделами, целесообразно размещать в ОП задачи
«плотно», одну за другой, выделяя ровно столько памяти, сколько тре-
бует процесс. Именно такой принцип лежит в основе распределения па-
мяти разделами переменной величины (динамическими разделами). В
этом случае память машины не делится заранее на разделы, и сначала
вся память, отводимая для приложений, свободна. Каждому вновь по-
ступающему на выполнение приложению на этапе создания процесса
выделяется вся необходимая ему память (если достаточный объем памя-
ти отсутствует, то приложение не принимается на выполнение и процесс
для него не создается). После завершения процесса память освобожда-
ется, и на это место может быть загружен другой процесс. Таким обра-
зом, в произвольный момент времени ОП представляет собой случай-
ную последовательность занятых и свободных участков (разделов) про-
извольного размера. Список свободных участков памяти может быть
упорядочен либо по адресам, либо по объему.
     На рис. 25 показано состояние памяти в различные моменты време-
ни при использовании динамического распределения. Так, в момент t0 в
                                 96


памяти находится только ОС, а к моменту t1 память разделена между 5-
ю процессами, причем процесс П4, завершаясь, покидает память. На
освободившееся от процесса П4 место загружается процесс П6, посту-
пивший в момент t3.
                                          П6



                ОС         ОС             ОС           ОС             ОС

                           П1             П1           П1
                           П2             П2           П2
                           П3             П3           П3
                           П4                          П6

                           П5             П5           П5




                 t          t              t            t      …       t
                  0          1              2           3                  k

                       - свободная область
                      - занятая область
           Рисунок 25 – Распределение памяти динамическими разделами
     Задачами ОС при реализации данного метода распределения памя-
ти являются:
      ведение таблиц свободных и занятых областей, в которых ука-
зываются начальные адреса и размеры участков памяти;
      при поступлении новой задачи – анализ запроса, просмотр таб-
лицы свободных областей и выбор раздела, размер которого достаточен
для размещения поступившей задачи9;
      загрузка задачи в выделенный ей раздел и корректировка таблиц
свободных и занятых областей;
      после завершения задачи корректировка таблиц свободных и за-
нятых областей.
     По сравнению с методом распределения памяти фиксированными
разделами данный метод обладает гораздо большей гибкостью, но ему
также присущ недостаток, связанный с наличием фрагментации памя-
ти – наличие столь большого числа несмежных участков свободной па-
9
 Выбор раздела может осуществляться по разным правилам, например: «первый попавшийся раздел
достаточного размера», «раздел, имеющий наименьший достаточный размер» или «раздел, имеющий
наибольший достаточный размер».
                                             97


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




                  П1                         П1


                             a               П2
                  П2
                                             П3
                             b
                  П3                         П4
                                 Процедура




                             c
                                  сжатия




                  П4
                                                       a+b+c+d




                             d

                  t1                          t2
Рисунок 26 – Сжатие памяти при распределении динамическими разделами
    Сжатие может выполняться:
     1) При каждом завершении задачи (меньше однократной вычисли-
тельной работы).
     2) В случае, когда для вновь поступившей задачи нет свободного
раздела достаточного размера (процедура выполняется реже).
    Хотя процедура сжатия и приводит к более эффективному исполь-
зованию памяти, она может требовать значительного времени, что часто
нивелирует преимущества данного метода.
                                  98


    В связи с тем, что программы перемещаются по ОП в ходе своего
выполнения, то невозможно выполнить настройку адресов с помощью
перемещающего загрузчика. Здесь более подходящим оказывается ди-
намическое преобразование адресов.
    Сжатие применяется и при использовании других методов распре-
деления памяти, когда отдельному процессу выделяется не одна сплош-
ная область памяти, а несколько несмежных участков памяти произ-
вольного размера (сегментов). Такой подход был использован в ранних
версиях OS/2, в которых память распределялась сегментами, а возни-
кавшая при этом фрагментация устранялась путем периодического пе-
ремещения сегментов.
    Распределение памяти динамическими разделами легло в основу
подсистем управления памятью многих мультипрограммных ОС 60-70-х
годов, в частности такой популярной ОС, как OS/360.
    4.2.6   Сегментное распределение
     Наряду с рассмотренными в пп. 4.2.3-4.2.5 методами непрерывного
распределения памяти не использующими внешнюю память, существует
целый ряд разрывных методов распределения памяти, при которых за-
даче не предоставляется сплошная (непрерывная) область памяти, и
кроме того используется внешняя память.
     Идея выделять память задаче не одной сплошной областью, а фраг-
ментами позволяет уменьшить фрагментацию памяти, однако этот под-
ход требует для своей реализации больше ресурсов, он значительно
сложнее. Если задать адрес начала текущего фрагмента программы и ве-
личину смещения относительно этого начального адреса, то можно ука-
зать необходимую нам переменную или команду. Таким образом, вир-
туальный адрес можно представить состоящим из двух полей. Первое
поле будет указывать на ту часть программы, к которой обращается
процессор, для определения местоположения этой части в памяти, а
второе поле виртуального адреса позволит найти нужную нам ячейку
относительно найденного адреса. Программист может либо самостоя-
тельно разбивать программу на фрагменты, либо можно ав-
томатизировать эту задачу, возложив ее на систему программирования.
     Первым среди разрывных методов распределения памяти был сег-
ментный. В соответствие с этим методом программу необходимо разби-
вать на части и уже каждой такой части выделять физическую память.
Естественным способом разбиения программы на части является разби-
ение ее на логические элементы – так называемые сегменты. В принци-
пе, каждый программный модуль (или их совокупность) может быть
воспринят как отдельный сегмент, и вся программа тогда будет пред-
ставлять собой множество сегментов.
                                 99


    Следует отметить, что разбиение на сегменты позволяет дифферен-
цировать способы доступа к разным частям программы (сегментам).
Например, можно запретить обращаться с операциями записи и чтения в
кодовый сегмент программы, а для сегмента данных разрешить только
чтение. Кроме того, разбиение программы на «осмысленные» части де-
лает принципиально возможным разделение одного сегмента несколь-
кими процессами. Например, если два процесса используют одну и ту
же математическую подпрограмму, то в ОП может быть загружена
только одна копия этой подпрограммы (рис. 27).

                                                                  ОС
   Виртуальное адресное    Таблица сегментов
 пространство процесса А       процесса А
                                                              Сегмент 0
      Сегмент 0            0                                  процесса А
      Сегмент 1            1
      Сегмент 2            2   выгружен
      Сегмент 3            3   выгружен
                                                          Сегмент 1 процесса А
                                                                   …
                                            Разделенный
                                                          Сегмент 2 процесса В
                                              сегмент
   Виртуальное адресное Таблица сегментов
 пространство процесса В    процесса В
      Сегмент 0            0                                  Сегмент 0
                                                              процесса В
      Сегмент 1            1   выгружен
      Сегмент 2            2



          Рисунок 27 – Пример распределения памяти сегментами
    Каждый сегмент размещается в памяти как до определенной степе-
ни самостоятельная единица. Логически обращение к элементам про-
граммы в этом случае будет состоять из имени сегмента и смещения от-
носительно начала этого сегмента. Физически имя (или порядковый но-
мер) сегмента будет соответствовать некоторому адресу, с которого этот
сегмент начинается при его размещении в памяти, и смещение должно
прибавляться к этому базовому адресу.
    Преобразование имени сегмента в его порядковый номер осу-
ществляет система программирования. Для каждого сегмента система
программирования указывает его объем. Он должен быть известен ОС,
чтобы она могла выделять ему необходимый объем памяти. Операцион-
ная система будет размещать сегменты в памяти и вести для каждого
сегмента учет о местонахождении этого сегмента. Вся информация о те-
кущем размещении сегментов задачи в памяти обычно сводится в таб-
                                       100



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