
- •Введение
- •1 Тема 7. Подсистема управления вводом-выводом
- •1.1 Язык С как стандарт взаимодействия с ОС
- •1.2 Системные операции для работы с файловой системой
- •1.2.1 Системные вызовы open() и close()
- •1.2.2 Системные вызовы read() и write()
- •1.2.3 Системный вызов lseek()
- •1.3 Создание специальных файлов
- •1.4 Запрос информации о статусе файлов
- •1.5 Каналы
- •1.5.1 Полудуплексные каналы UNIX
- •1.5.2 Именованные каналы FIFO
- •1.6 Дублирование дескрипторов файлов
- •1.7 Монтирование и демонтирование ФС
- •1.8 Ссылки на имена файлов
- •1.9 Лабораторная работа по теме №7
- •1.9.1 Интегрированная среда разработки Eclipse
- •1.9.2 Список заданий выполняемых работ
- •1.9.3 Проблема типов в языке С
- •1.9.4 Анализ структуры MBR блочных устройств
- •1.9.5 Запрос информации о статусе файлов
- •1.9.6 Неименованные каналы ядра ОС
- •1.9.7 Именованные каналы FIFO
- •1.9.8 Монтирование flashUSB
- •1.9.9 Работа с именами файлов
- •2 Тема 8. Подсистема управления памятью
- •2.1 Классификация способов управления ОЗУ
- •2.2 Программный и аппаратный способы адресации памяти
- •2.3 Страничная и сегментная адресации памяти
- •2.4 Комбинированный способ адресации памяти
- •2.5 Лабораторная работа по теме №8
- •2.5.1 Структура поцесса
- •2.5.2 Определяемые сегменты процесса
- •2.5.3 Создание и удаление процессов из памяти
- •2.5.4 Динамическое выделение и освобождение памяти процесса
- •3 Тема 9. Базовое взаимодействие процессов
- •3.1 Подсистема управления процессами
- •3.2 Синхронизация процессов
- •3.3 Стандарты POSIX
- •3.4 Системные вызовы ОС по управлению процессами
- •3.5 Системный вызов fork() и каналы процесса
- •1.5.1 Пример использования каналов процессов
- •1.5.2 Имитация конвейеров языка shell
- •3.6 Нити (Threads)
- •3.7 Сигналы POSIX
- •3.8 Лабораторная работа по теме №9
- •3.8.1 Системные вызовы общей группы
- •3.8.2 Управление потоками процессов
- •3.8.3 Обработка сигналов ОС
- •4 Тема 10. Асинхронное взаиодействие процессов
- •4.1 Проблемы распределения ресурсов ОС
- •4.2 Системный пакет IPC
- •4.3 Утилиты управления средствами пакета IPC
- •Утилита ipcmk
- •Утилита ipcs
- •Утлита ipcrm
- •4.4 Семафоры
- •4.5 Задача об обедающих философах
- •4.5.1 Описание задачи
- •4.5.2 Выбор стратегии решения
- •4.5.3 Модель философа
- •4.5.4 Программа-монитор
- •4.6 Лабораторная работа по теме №10
- •4.6.1 Синхронизация двух процессов
- •4.6.2 Задача «Обедающие философы»
- •5 Тема 11. Эффективное взаиодействие процессов
- •5.1 Прикладные средства пакета IPC
- •5.2 Разделяемые сегменты памяти
- •5.3 Задача о читателях и писателях
- •5.4 Передача сообщений
- •5.5 Лабораторная работа по теме №11
- •5.5.1 Задачи с разделяемыми сегментами памяти
- •5.5.2 Программы передачи сообщений
- •6 Тема 12. Системная шина D-Bus
- •6.1 Графические среды ОС
- •6.2 Рабочий стол пользователя
- •6.3 Различия графических сред ОС
- •6.4 X-сервер UNIX
- •6.5 Архитектура шины D-Bus
- •6.5.2 Бибиотека libdbus
- •6.5.3 Проекции ПО D-Bus на языки программирования
- •6.6 Лабораторная работа по теме №12
- •6.6.1 Утилита qdbus
- •6.6.2 Взаимодействие через шину с приложением evince
- •Заключение
- •Список использованных источников

70
2 Тема 8. Подсистема управления памятью
Существует множество контекстов, в которых употребляется понятие память. Сама память может быть разных видов и не всегда очевидно о какой памяти идет речь.
В общем виде, всю память любой ЭВМ, обобщенно, можно представить в виде, показанном на рисунке 2.1, где приведены скоростные характеристики и ее взаимодействие с процессором компьютера.
Рисунок 2.1 - Обобщенный вид памяти ЭВМ
Замечание
Характеристики, приведенные на рисунке 2.1, соответствуют определенному историческому периоду и уровню технологий, доступных на этот период.
Тем не менее, легко заметить, что разные виды памяти, расположенные с лева на право, обладают следующими свойствами:
•уменьшается скорость обмена данными;
•увеличивается доступная емкость памяти;
•уменьшается стоимость памяти, на каждый байт записанной информации.
Очевидно, что ЭВМ управляет всеми видами памяти, хотя подходы к управлению ими — различны.
В данной теме мы будем рассматривать основную память (ОП), поскольку она занимает центральное место в ЭВМ и выполняет важные функции, влияющие на архитектуру ядра ОС:

71
•ОП обеспечивает процессор командами;
•ОП обеспечивает процессор входными данными;
•часть ОП, называемая оперативным запоминающим устройством (ОЗУ), обеспечивает процессор местом для хранения данных получаемых результатов (выходных данных).
Изучение конструктивных особенностей основной памяти не входит в курс нашего обучения, но студент должен четко представлять, что:
•ОЗУ — оперативное запоминающее устройство, позволяющее изменять данные, записанные в него;
•ПЗУ — постоянное запоминающее устройство, в котором данные оперативно изменяться не могут.
Известны две архитектурные особенности ЭВМ, связанные по способу использования памяти:
•Гарвардская архитектура, разработанная Говардом Эйкеном в конце 1930-х годов в Гарвардском университете;
•архитектура фон Неймана, названная по имени автора идеи и разработанная им в 1944 году.
Отличительными признаками Гарвардской архитектуры являются:
•хранилище инструкций и хранилище данных представляют собой разные физические устройства;
•каналы инструкций и данных так же физически разделены.
Замечание
В Гарвардской архитектуре, процессор может одновременно читать команды и входные данные, что увеличивает скорость работы ЭВМ.
Поскольку каналы (шины) команд и данных разные, то они могут иметь различную размерность, что может быть выгодно для специализированных вычислителей, но мало пригодно для универсальных ЭВМ, решающих различные задачи.
Отличительные признаки архитектуры фон Неймана показаны на рисунке 2.2.
Кним относятся:
•принцип однородности памяти — команды и данные хранятся в одной и той же памяти и внешне неразличимы;
•принцип адресности — память состоит из пронумерованных ячеек и процессору доступна любая такая ячейка в любой момент времени;
•принцип программного управления — вычисления представлены последовательностью команд, выполняющихся в естественной последовательности, которая может быть изменена специальными командами управления;
•принцип двоичного кодирования — команды и данные имеют свой двоичный тип команд и формате команды можно выделить два поля: поле кода операции и поле адресов.

72
Рисунок 2.2 — Архитектура машины фон Неймана
Замечание
Архитектура фон Неймана имеет более простую физическую реализацию как процессора, так и ЭВМ в целом, что и обеспечило ей широкое распространение, но содержит в себе все проблемы, связанные с общей шиной и общей основной памятью.
Изучая дисциплину «Операционные системы», мы изучаем ОС ЭВМ с архитектурой фон Неймана. Соответственно, основные проблемы, которые порождает такая архитектура, должны быть изучены и хорошо пониматься студентом.
Сточки зрения применения ЭВМ в целом, можно выделить две проблемы:
•прикладное использование процессом памяти ЭВМ, необходимое для обеспечения обработки данных;
•ситемное использование ядром ОС памяти ЭВМ, необходимое для организации мультипрограммного режима работы вычислительной системы.
Подходы к решению этих проблем опираются на реализацию:
•способов управления ОЗУ ЭВМ;
•способов адресации основной памяти ЭВМ. Изучению этих способов и посвящен даный раздел темы.

73
2.1Классификация способов управления ОЗУ
Впервых вариантах компьютеров, ОС как таковые — отсутствовали:
•программа пользователя загружалась в ОЗУ с адреса, который указывал оператор ЭВМ;
•после загрузки программы, оператор указывал на пульте ЭВМ стартовый адрес программы и нажимал кнопку «Пуск»;
•после выполнения текущей программы, в ЭВМ загружадась новая программа.
Фактически, в таком (пакетном) режиме работы ЭВМ, управление памятью не проводилось или проводилось в упрощенных вариантах.
Со временем, появление первых супервизорных систем, а затем — и первых ОС, управление памятью ЭВМ стало актуальной задачей.
С появлением и совершенствованием первых ОС, которые также, как и прикладное ПО, являются программным обеспечением, стали применять три способа загрузки, которые показаны на рисунке 2.3.
Рисунок 2.3 - Три способа загрузки ОС и программы пользователя
Развите этих способов загрузки ПО показано слева на право:
•певый способ предполагает первоначальную загрузку ОС, обычно в младшие адреса ОЗУ; такой способ применялся в мэйнфреймах и первых миникомпьютерах; программы пользователя загружались с помощью ПО ОС в остальную часть ОЗУ;
•второй способ стал применяться в некоторых «карманных» компьютерах и встроенных системах, которые обладают малыми ресурсами и, как правило, разными конструктивными особенностями; здесь ОС пишется в ПЗУ, которое соответствует верхним адресам памяти, оставляя ОЗУ полностью для ПО пользователей;

74
•третий способ соответствует большинству современных систем, подобных IBM PC; в ПЗУ записывается ПО BIOS, которое работает только при включении питания компьютера; ПО BIOS находит и загружает в младшие адреса ОЗУ ПО ОС; программам пользователей предоставляется оставшееся ОЗУ до 640 Кбайт, в младших адресах, и вся оставшаяся память свыше первого Мбайт; память ОЗУ между 640 Кб и 1 Мб (скрытая область) распределяется между ПО BIOS и памятью прямого доступа для внешних устройств.
Для компьютера, память (ОЗУ) всегда была и остается дефицитом:
•всегда имеются программы, которым, по тем или иным причинам, недостаточно выделенного объема ОЗУ ЭВМ;
•проблемы реализации языков программирования требуют решать многие воп-
росы, связанные с адресацией памяти и ее распределением.
Для решения этих и многих других вопросов было введено понятие виртуальной памяти.
Виртуальная память, идея которой наглядно показана на рисунке 2.4, призвана
разрешить противоречие в адресации команд и данных, связанных с потребностями прикладного ПО и ресурсами ОЗУ, которые имеет конкретная ЭВМ.
Рисунок 2.4 - Типы адресов оперативной (основной) памяти
Идея состоит в использовании таблицы виртуальных адресов, которая указывает адресам всех команд и данных, выставленных компилятором, соответствие физических адресов ОЗУ.
Реализация такого соответствия может выполняться:
• специальным загрузчиком (статически);

75
• или специальными аппаратными средствами (динамически).
Появление ОС, поддерживающих мультипрограммирование, потребовало решения вопросов распределения памяти ОЗУ между многими одновременно выполняемыми программами (процессами). На рисунке 2.5, приведена классификация различных подходов, решающих поставленную проблему.
Рисунок 2.5 - Классификация способов распределения памяти
Здесь можно выделить две большие группы подходов:
•методы, не использующие внешнюю память, обычно, накопители на жестких дисках;
•методы, использующие внешнюю память, которая теоретически продолжает (расширяет, увеличивает) ОЗУ ЭВМ.
Методы, не использующие внешнюю память, предполагают, что ОЗУ доста-точно для решения самой крупной задачи, или, что программу можно исполнять по частям, для которых ОЗУ достаточно. Здесь, в большинстве случаев, задачи распределения памяти ставятся как оптимальное разбиение ОЗУ на сегменты (отдельные и не пересекающиеся участки памяти), обеспечивающие максимальную эффективность использования процессорного времени ЭВМ.
Методы, использующие внешнюю память, предполагают, что ОЗУ расширя-ется за счет памяти медленных внешних устройств и становится возможным одновременное выполнение необходимого числа «параллельно» работающих процессов.

76
Здесь, в большинстве случаев, задачи распределения памяти ставятся как ограничения на скорость выполнения отдельных процессов или эффективность использования ОЗУ ЭВМ по управлению самим процессом распределения памяти ЭВМ.
В любом из указанных случаев, ОЗУ расходуется не идеально, а эффективность используемых идей сильно зависит как от величины соотношения объем ОЗУ/ размер процессов, так и от аппаратной реализации поддержки указанных подходов.
Основными причинами неэффективности использования ОЗУ являются:
•сильная фрагментация памяти как во время загрузки, так и во время завершения процессов;
•затраты, связанные с устранением последствий такой фрагментации.
Чтобы показать это наглядно, рассмотрим рисунок 2.6, на котором, слева на право, показано развитие фрагментации, на примере работы некоторой абстрактной ЭВМ.
Рисунок 2.6 - Варианты способов использования памяти
Замечание
Фрагментация вызывается не только из-за различных размеров запускаемых процессов, но и, по-причине, дополнительных требований ряда процессов к динамическому выделению дополнительной памяти ОЗУ.