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

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

Голосов: 2

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

Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
         После открытия очереди процесс может помещать в него сообще-
ния с помощью вызова msgsnd или читать сообщения с помощью вызова
msgrsv. Программист может влиять на то, как ОС будет обрабатывать
ситуацию, когда процесс пытается читать сообщения, которые еще не
поступили в очередь, то есть на синхронизацию процесса с данными.
     Разделяемая память. Разделяемая память представляет собой сег-
мент физической памяти, отображенной в виртуальное адресное про-
странство двух или более процессов. Механизм разделяемой памяти
поддерживается подсистемой виртуальной памяти, которая настраивает
таблицы отображения адресов для процессов, запросивших разделение
памяти, так что одни и те же адреса некоторой области физической па-
мяти соответствуют виртуальным адресам разных процессов.
     Для работы с разделяемой памятью используются четыре систем-
ных вызова:
      shmget – создает новый сегмент разделяемой памяти или нахо-
дит существующий сегмент с тем же ключом;
      shmat – подключает сегмент с указанным дескриптором к вирту-
альной памяти обращающегося процесса;
      shmdt – отключает от виртуальной памяти ранее подключенный
к ней сегмент с указанным виртуальным адресом начала;
      shmctl – служит для управления разнообразными параметрами,
связанными существующим сегментом.
     После того как сегмент разделяемой памяти подключен к виртуаль-
ной памяти процесса, процесс может обращаться к соответствующим
элементам памяти с использованием обычных машинных команд чтения
и записи, не прибегая к дополнительным системным вызовам. Синтак-
сис системного вызова shmget выглядит следующим образом:
    shmid = shmget ( key, size, flag );
     Параметр size определяет желаемый размер сегмента в байтах. Да-
лее, если в таблице разделяемой памяти находится элемент, содержащий
заданный ключ, и права доступа не противоречат текущим характери-
стикам обращающегося процесса, то значением системного вызова яв-
ляется дескриптор существующего сегмента (и обратившийся процесс
так и не узнает реального размера сегмента, хотя впоследствии его мож-
но узнать с помощью системного вызова shmctl). В противном случае
создается новый сегмент, размер которого не меньше, чем установлен-
ный в системе минимальный размер сегмента разделяемой памяти, и не
больше, чем установленный максимальный размер. Создание сегмента
не означает немедленного выделения для него основной памяти. Это
действие откладывается до первого системного вызова подключения
сегмента к виртуальной памяти некоторого процесса. Аналогично, при
                                      81


выполнении последнего системного вызова отключения сегмента от
виртуальной памяти соответствующая основная память освобождается.
    Подключение сегмента к виртуальной памяти выполняется путем
обращения к системному вызову shmat:
      virtaddr = shmat ( id, addr, flags ).
    Здесь id – ранее полученный дескриптор сегмента, addr – требуе-
мый процессу виртуальный адрес, который должен соответствовать
началу сегмента в виртуальной памяти. Значением системного вызова
является реальный виртуальный адрес начала сегмента (его значение не
обязательно совпадает со значением параметра addr). Если значением
addr является нуль, ядро выбирает подходящий виртуальный адрес
начала сегмента.
    Для отключения сегмента от виртуальной памяти используется си-
стемный вызов shmdt:
      shmdt ( addr ),
где addr – виртуальный адрес начала сегмента в виртуальной памяти,
ранее полученный с помощью системного вызова shmat. При этом си-
стема гарантирует (опираясь на данные таблицы сегментов процесса),
что указанный виртуальный адрес действительно является адресом
начала разделяемого сегмента в виртуальной памяти данного процесса.
    Для управления памятью служит системный вызов shmctl:
      shmctl ( id, cmd, shsstatbuf ).
     Параметр cmd идентифицирует требуемое конкретное действие, то
есть ту или иную функцию. Наиболее важной является функция уни-
чтожения сегмента разделяемой памяти, которое производится следую-
щим образом. Если к моменту выполнения системного вызова ни один
процесс не подключил сегмент к своей виртуальной памяти, то основная
память, занимаемая сегментом, освобождается, а соответствующий эле-
мент таблицы разделяемых сегментов объявляется свободным. В про-
тивном случае в элементе таблицы сегментов выставляется флаг, запре-
щающий выполнение системного вызова shmget по отношению к этому
сегменту, но процессам, успевшим получить дескриптор сегмента, по-
прежнему разрешается подключать сегмент к своей виртуальной памя-
ти. При выполнении последнего системного вызова отключения сегмен-
та от виртуальной памяти операция уничтожения сегмента завершается.

      3.4 Вопросы для самопроверки
      1. Чем характеризуется мультипрограммирование в современных
ОС?

                                        82


     2. Какие критерии используют для определения эффективности вы-
числительных систем при использовании мультипрограммирования?
     3. Какие критерии к «мультипрограммной смеси» применяют в си-
стемах пакетной обработки?
     4. Какие особенности имеет мультипрограммирование в системах
пакетной обработки?
     5. Какие критерии к «мультипрограммной смеси» применяют в си-
стемах разделения времени?
     6. Какие особенности имеет мультипрограммирование в системах
разделения времени?
     7. Какие критерии к «мультипрограммной смеси» применяют в си-
стемах реального времени?
     8. Какие особенности имеет мультипрограммирование в системах
реального времени?
     9. Чем характеризуется мультипроцессорная обработка? На какие
виды ее разделяют?
     10. Что означает симметричная и несимметричная мультипроцес-
сорная обработка с точки зрения архитектуры?
     11. Что означает симметричная и несимметричная мультипроцес-
сорная обработка с точки зрения организации вычислительного процес-
са?
     12. Что означает масштабирование в многопроцессорной архитек-
туре по вертикали? По горизонтали?
     13. Что такое «кластерная мультипроцессорная система»?
     14. Какова роль прерываний при мультипрограммировании?
     15. На какие классы делят прерывания? В чем отличия этих классов
между собой?
     16. Какова пошаговая последовательность реализации прерываний
в вычислительной системе? Каковы при этом главные функции меха-
низма прерываний?
     17. Что такое «обработчик прерывания»? В чем его функция?
     19. В какие моменты при обработке прерывания система должна
отключать возможности прерывания?
     20. Для чего в ОС используется супервизор прерываний? Каково
его место в общей схеме обработки прерываний?
     21. Что такое «приоритет прерывания»? Обработка прерываний ка-
ких компонентов вычислительной системы обладает более высоким, а
каких – более низким приоритетом?
     22. В чем отличие между терминами программа или задание и тер-
мином процесс?
     23. Что такое поток или нить исполнения? В чем заключаются ос-
новные отличия нити от процесса?
                                 83


     24. Каковы основные предпосылки появления потоков?
     25. Какие основные этапы создания процесса?
     26. Какую информацию содержит описатель потока?
     27. Какие элементы выделяют на диаграмме состояний процессов?
Как при этом реализуется механизм смены состояний процессов?
     28. В чем заключается планирование использования процессора?
Какие задачи предполагаются к решению при планировании?
     29. В чем заключается диспетчеризация процессов? В чем ее отли-
чие от планирования? Какие основные задачи при этом должны быть
решены?
     30. Какие выделяют уровни планирования? Чем характеризуется
каждый из уровней?
     31. Какие основные цели и свойства алгоритмов планирования?
     32. Что такое параметры планирования? Какие виды параметров
выделяют?
     33. Какие виды планирования выделяют?
     34. Какие разновидности приоритетного планирования выделяют?
     35. Какие существуют алгоритмы планирования? В чем заключают-
ся их достоинства и недостатки?
     36. Что понимают под параллельно действующими процессами? В
чем отличие независимых и взаимодействующих процессов?
     37. В чем заключается обеспечение синхронизации процессов?
     38. Какие механизмы ОС относят к средствам синхронизации про-
цессов и потоков?
     39. Какие примеры необходимости обеспечения синхронизации
процессов Вам известны?
     40. Каков механизм синхронизации процессов с использованием
блокирующей переменной, семафоров, мониторов, сигналов? Какие ха-
рактерные особенности каждого из этих методов, достоинства и недо-
статки?
     41. В чем заключается и когда возникает взаимная блокировка про-
цессов (тупик)? Какие подзадачи требуют разрешения для решения про-
блемы тупиков? Какие условия необходимы для возникновения тупиков
и как их избежать? Какие существуют пути восстановления системы по-
сле тупиков?
     42. Какие механизмы ОС относят к классу средств межпроцессного
взаимодействия? В чем заключаются основные особенности практиче-
ского использования каждого из этих средств?




                                 84


                   4. УПРАВЛЕНИЕ ПАМЯТЬЮ
     4.1 Основные положения
     Запоминающие устройства компьютера разделяют, как минимум,
на два вида:
      основную (главную, оперативную);
      вторичную (внешнюю) память.
     Основная память (англ. memory) представляет собой упорядочен-
ный массив однобайтовых ячеек, каждая из которых имеет свой уни-
кальный адрес (номер). Процессор извлекает команду из основной па-
мяти, декодирует и выполняет ее. Для выполнения команды могут по-
требоваться обращения еще к нескольким ячейкам основной памяти.
Обычно основная память изготавливается с применением полупровод-
никовых технологий и теряет свое содержимое при отключении пита-
ния.
     Вторичную память (англ. storage) также можно рассматривать как
одномерное линейное адресное пространство, состоящее из последова-
тельности байтов. Как правило, внешняя память реализована с исполь-
зованием различного рода дисков. В отличие от ОП, она является энер-
гонезависимой, имеет существенно большую емкость и используется в
качестве расширения основной памяти.
     Эту схему можно дополнить еще несколькими промежуточными
уровнями. Разновидности памяти могут быть объединены в иерархию по
убыванию времени доступа, возрастанию цены и увеличению емкости
(рис. 20).
       Цена бита                                 Время доступа
                         Регистры процессора
                                                 Емкость
                           Кэш процессора        запоминающих
                                                 устройств
                          Основная память

                         Электронные диски

                          Магнитные диски

                          Магнитные ленты

            Рисунок 20 – Иерархическая организация памяти
     Как правило, иерархическая многоуровневая схема используются
следующим образом. Информация, которая находится в памяти верхне-
го уровня, обычно сохраняется также и на более низких уровнях. Если
                                 85


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


    4.1.2   Типы адресации
     Если не принимать во внимание программирование на машинном
языке (эта технология практически не используется уже очень давно), то
можно сказать, что программист обращается к памяти с помощью неко-
торого набора логических имен, которые чаще всего являются символь-
ными, а не числовыми, и для которого отсутствует отношение порядка.
Другими словами, в общем случае множество переменных в программе
не упорядочено, хотя отдельные переменные могут иметь частичную
упорядоченность (например, элементы массива). Имена переменных и
входных точек программных модулей составляют пространство сим-
вольных имен, иногда называемое логическим адресным пространством.
     С другой стороны, при выполнении программы идет работа с физи-
ческой ОП, собственно с которой и работает процессор, извлекая из нее
команды и данные и помещая в нее результаты вычислений. Физическая
память представляет собой упорядоченное множество ячеек реально
существующей ОП, и все они пронумерованы, то есть к каждой из них
можно обратиться, указав ее порядковый номер (адрес). Количество
ячеек физической памяти ограничено и фиксировано.
     Системное ПО должно связать каждое указанное пользователем
символьное имя с физической ячейкой памяти, то есть осуществить
отображение пространства имен на физическую память компьютера. В
общем случае это отображение осуществляется в два этапа – сначала си-
стемой программирования, а затем ОС (рис. 21).
     Система программирования осуществляет трансляцию и компонов-
ку программы, используя библиотечные программные модули. В ре-
зультате работы этой системы программа получает виртуальные адреса,
которые могут иметь двоичную или символьно-двоичную формы. Те
модули, адреса для которых пока не могут быть определены, имеют по-
прежнему символьную форму, и их окончательная привязка к физиче-
ским ячейкам будет осуществлена на этапе загрузки программы в па-
мять непосредственно перед ее исполнением. Физические адреса соот-
ветствуют номерам ячеек ОП, где в действительности расположены или
будут расположены переменные и команды.
     Второе отображение, реализуемое посредством ОС, осуществляется
с помощью соответствующих аппаратных средств процессора – подси-
стемы управления памятью, которая использует дополнительную ин-
формацию, подготавливаемую и обрабатываемую ОС.
     Между этими этапами обращения к памяти имеют форму вирту-
ального адреса. Говорят, что множество всех допустимых значений вир-
туального адреса для некоторой программы определяет ее виртуальное
адресное пространство или виртуальную память. Виртуальное адрес-
ное пространство программы зависит, прежде всего, от архитектуры
                                  87


процессора и от системы программирования и практически не зависит
от объема реальной физической памяти компьютера.

                                                      Логическое (символьное имя)

                                                      Пространство имен программы




            Вир туальное адресное пространство


                   Вир туальный адрес                       Система
                                                       программирования




                                                                 Операционная
                                                                   система



                                                      Физическая память компьютера


                                                       Ячейка оперативной памяти
                                                           (физический адрес)




Рисунок 21 – Отображение пространства имен на физическую память ком-
                              пьютера
    Диапазон возможных адресов виртуального пространства у всех
процессов является одним и тем же. Например, при использовании 32-
разрядных виртуальных адресов этот диапазон задается границами
0000000016 и FFFFFFFF16. Тем не менее, каждый процесс имеет соб-
ственное виртуальное адресное пространство – транслятор независимо
присваивает виртуальные адреса переменным и кодам каждой выполня-
емой программе. Можно еще сказать, что адреса команд и переменных в
машинной программе, подготовленной к выполнению системой про-
граммирования, как раз и являются виртуальными адресами.
    Возможны различные варианты перехода от символьных имен к
физическим адресам. Рассмотрим ряд частных и промежуточных вари-
антов такого перехода.
    Одним из частных случаев общей схемы трансляции адресного
пространства является тождественность виртуального адресного про-
странства исходному логическому пространству имен. Здесь уже отоб-
ражение выполняется самой ОС, которая во время исполнения исполь-
                                                 88


зует таблицу символьных имен. Такая схема отображения используется
чрезвычайно редко, так как отображение имен на адреса необходимо
выполнять для каждого вхождения имени (каждого нового имени), и
особенно много времени расходуется на квалификацию имен. Данную
схему можно было встретить в интерпретаторах, в которых стадии
трансляции и исполнения практически неразличимы. Это характерно
для простейших компьютерных систем, в которых вместо ОС использо-
вался встроенный интерпретатор (например, Basic).
     Другим частным случаем отображения пространства символьных
имен на физическую память является полная тождественность вирту-
ального адресного пространства физической памяти. При этом нет необ-
ходимости осуществлять второе отображение. В таком случае говорят,
что система программирования генерирует абсолютную двоичную про-
грамму: в этой программе все двоичные адреса таковы, что программа
может исполняться только тогда, когда ее виртуальные адреса будут
точно соответствовать физическим. Некоторые программные модули
любой ОС обязательно должны быть абсолютными двоичными про-
граммами. Эти программы размещаются по фиксированным адресам
физической памяти, и с их помощью можно впоследствии реализовы-
вать размещение остальных программ, подготовленных системой про-
граммирования таким образом, что они могут работать на различных
физических адресах (то есть на тех адресах, на которые их разместит
ОС). Примером таких программ являются программы загрузки ОС.
     Возможны и промежуточные варианты. В простейшем случае
транслятор-компилятор генерирует относительные адреса, которые, по
сути, являются виртуальными адресами, с последующей настройкой
программы на один из непрерывных разделов. Второе отображение
осуществляется перемещающим загрузчиком. После загрузки програм-
мы виртуальный адрес теряется, и доступ выполняется непосредственно
к физическим ячейкам. Более эффективное решение достигается в том
случае, когда транслятор вырабатывает в качестве виртуального адреса
относительный адрес и информацию о начальном адресе, а процессор,
используя подготавливаемую ОС адресную информацию, выполняет
второе отображение не один раз (при загрузке программы), а при каж-
дом обращении к памяти.
     Следует отметить, что термин виртуальная память фактически от-
носится к системам, которые сохраняют виртуальные адреса во время
исполнения. В связи с тем, что второе отображение осуществляется в
процессе исполнения задачи, то адреса физических ячеек могут изме-
няться. При правильном применении такие изменения улучшают ис-
пользование памяти, избавляя программиста от деталей управления ею,
и повышают надежность вычислений.
                                 89


     Если рассматривать общую схему двухэтапного отображения адре-
сов, представленную на рис. 21, то с позиции соотношения объемов
упомянутых адресных пространств можно отметить наличие следующих
трех ситуаций:
      объем виртуального адресного пространства программы Vv
меньше объема физической памяти Vp (Vv < Vp);
      объем виртуального адресного пространства программы Vv ра-
вен объему физической памяти Vp (Vv = Vp);
      объем виртуального адресного пространства программы Vv
больше объема физической памяти Vp (Vv > Vp).
     Ситуация (Vv < Vp) сейчас на практике практически не встречается,
но недавно, например 16-разрядные мини-ЭВМ имели систему команд,
в которых программисты могли адресовать до 216 = 64 Кбайт адресов
(обычно в качестве адресуемой единицы выступала ячейка памяти раз-
мером 1 байт). При этом физически старшие модели этих мини-ЭВМ
могли иметь объем ОП в несколько мегабайтов. Обращение к памяти
столь большого объема осуществлялось с помощью специальных реги-
стров, содержимое которых складывалось с адресом операнда (или ко-
манды), извлекаемым из поля операнда или указателя команды (и/или
определяемым по значению поля операнда или указателя команды). Со-
ответствующие значения в эти специальные регистры, выступающие как
базовое смещение в памяти, заносила ОС. Для одной задачи в регистр
заносилось одно значение, а для второй (третьей, четвертой и т.д.) зада-
чи, размещаемой одновременно с первой, но в другой области памяти,
заносилось, соответственно, другое значение. Таким образом, вся физи-
ческая память разбивалась на разделы объемом по 64 Кбайт, и на каж-
дый такой раздел осуществлялось отображение своего виртуального ад-
ресного пространства.
     Вторая ситуация (Vv = Vp) особенно характерна для недорогих вы-
числительных комплексов. Для этого случая имеется большое количе-
ство методов распределения ОП.
     Третья ситуация, при которой объема виртуального адресного про-
странства программы превышает объем физической памяти (Vv > Vp),
сегодня наиболее характерна. Теперь это самая обычная ситуация, и для
нее имеется несколько методов распределения памяти, отличающихся
как сложностью, так и эффективностью, которые более подробно будут
рассмотрены ниже в п. 4.2.




                                  90



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