
- •Перечень контрольных вопросов по дисциплине «Системное программирование»
- •Понятие системного программного продукта.
- •Стадии разработки программного обеспечения.
- •Технология инкрементального программирования.
- •Понятие объекта: состояние, поведение, методы. Понятие класса и идентичность объектов.
- •Принципы объектной модели
- •Проблема создания и уничтожения объектов
- •Понятие ссылки. Операции над ссылками и способы применения ссылок.
- •Статические и постоянные члены класса. Встраиваемые методы.
- •Дружественные функции.
- •Иерархические отношения между классами: композиция.
- •Иерархические отношения между классами: наследование.
- •Виртуальные методы и позднее связывание.
- •Понятие абстрактного класса.
- •Использование потокового ввода-вывода.
- •Порождаемые функции в обобщённом программировании.
- •Порождаемые классы в обобщённом программировании.
- •Использование основных контейнеров стандартной библиотеки.
- •Классы функциональных объектов: создание и применение.
- •Использование алгоритмов стандартной библиотеки операционной системы, ее назначение и функции.
- •Операционная система, ее назначение и функции
- •Утилиты операционной системы gnu/Linux
- •Понятие файла. Виртуальная файловая система gnu/Linux
- •Разграничение доступа к файлам. Доступ к устройствам
- •Организация взаимодействия пользователя с системой
- •Организация ввода-вывода системного уровня
- •Концепция процесса. Состояние процесса и диаграмма смены состояний процесса
- •Операции над процессами. Разграничение доступа процессов к ресурсам системы.
- •Планирование процессов. Политики планирования
- •Сигналы и их использование для управления процессами
- •Понятие потока выполнения. Сравнительный анализ потоков и процессов.
- •Асинхронные параллельные потоки. Проблематика разработки многопоточных приложений.
- •Задача «разделение доступа к ресурсу». Способы ее решения.
- •Задача «синхронизация по готовности данных». Способы ее решения.
- •Системные средства синхронизации потоков.
- •1.Решение задачи «разделение доступа к ресурсу».
- •2.Способы обеспечения атомарности операций
- •3.Обеспечение взаимоисключения потоков через мьютексы.
- •4.Решение задачи «синхронизация по готовности данных»
- •Мониторы Хоара. Пример проектирования монитора «склад» для задачи «производитель-потребитель».
- •Проектирование и модели многопоточных приложений.
- •Иерархия памяти. Виртуальная память: концепция и инструменты.
- •Взаимодействие процессов: проблематика и средства.
- •Модули ядра Linux.
2.Способы обеспечения атомарности операций
Программный способ – процессы своими средствами обеспечивают взаимоисключение.
Алгоритм Деккера для двух процессов: используются признаки запроса процессов на вход в критический участок и дескриптор процесса, имеющего приоритет при конкуренции. Этот приоритет поочередно отдаётся каждому из процессов. Процессы сами временно снимают свой запрос при обнаружении конкуренции и отсутствии у себя приоритета.
Недостатки рассмотренного способа: сильное сцепление между потоками (все должны знать про всех), загрузка процессора (постоянный опрос).
Аппаратный способ – взаимоисключение обеспечивается с использованием аппаратной части ВС. Машинная инструкция testandset(a,b) { a=b; b=1 }. Недостаток – постоянный опрос не устранен.
Использование «арбитра». Процессы подают заявки арбитру на использование ресурса, а он рассматривает их и выдает «лицензию».
В качестве арбитра может быть использовано ядро ОС. В однопроцессорной системе исполнение ядром операций entercritical и leavecritical гарантирует их атомарность. В многопроцессорной системе атомарность гарантируется за счёт дополнительного использования аппаратного способа.
3.Обеспечение взаимоисключения потоков через мьютексы.
При использовании ОС в качестве арбитра взаимоисключение может быть обеспечено с помощью мьютексов.
Мьютекс позволяет войти в критическую секцию ресурса одновременно не более чем одному потоку.
Операции над мьютексом: инициализация, блокировка (ожидание выдачи «лицензии»), разблокировка (возврат «лицензии»).
Если ресурс – это комната, то мьютекс – это дверь, которая автоматически блокируется при нахождении кого-либо в комнате. Постучавшиеся в дверь должны дождаться разблокирования двери (освобождения комнаты).
Для удобной и надёжной работы с мьютексами полезно определить класс-обёртку Mutex.
Пример решения задачи учёта поступления средств в банк с использованием мьютекса.
4.Решение задачи «синхронизация по готовности данных»
Синхронизация потоков по действиям и данным может быть выполнена с помощью семафоров.
Семафор S – защищённая переменная, значение которой можно опрашивать и менять только специальными операциями P и V, а также операцией инициализации. Множество значений семафора: неотрицательные целые числа.
Операция инициализации: определяет начальное значение семафора.
Операция P(S): значение семафора уменьшается на 1, если оно положительно или поток блокируется, если значение семафора нулевое.
Операция V(S): пробуждение одного из потоков, ожидающих на семафоре, или увеличение значения на 1, если таковых нет.
При входе в критическую секцию поток должен выполнять операцию P(S), а при выходе – V(S).
Расширение операции P (неблокирующий вариант) – P'(S) : при нулевом значении семафора немедленно возвращается признак отказа в доступе.
Для удобной и надёжной работы с семафорами полезно определить wrapper-класс (класс-обёртку) Semaphor.
Мониторы Хоара. Пример проектирования монитора «склад» для задачи «производитель-потребитель».
Явное использование мьютексов и семафоров.
Мьютексы и семафоры решают задачи взаимоисключения и синхронизации.
Они представляют средства низкого уровня (аналог языка Ассемблера для программирования) – требуют тщательного анализа и подвержены ошибочному использованию.
Типичный случай №1: использование ресурса без выполнения входа в критическую секцию, что приводит к нарушению состояния ресурса.
Типичный случай №2: не выполнение выхода из критической секции, что влечёт невозможность использования ресурса кем-либо ещё.
Типичный случай №3: использование средств синхронизации не по назначению, что разрушает взаимодействие потоков с непредсказуемыми последствиями.
Типичный случай №4: вложенное использование, которое приводит поток к тупику, поскольку он пытается получить доступ к занятому ресурсу, а освободить его может только он сам.
Понятие монитора
В рассмотренной ранее схеме каждый поток отвечает за решение двух задач: функциональной и обеспечения синхронизации с другими потоками. Отсюда проблема. Её решение – избавление от одной из ответственностей. Поток не должен непосредственно обеспечивать синхронизацию. Проблема устраняется при переходе к высокоуровневым средствам обеспечения взаимоисключения.
Как правило в задаче известен допустимый набор операций над разделяемым ресурсом.
Осуществляется инкапсуляция набора операций в специальный класс – монитор.
Переменные состояния монитора определяют ресурс.
Доступ через методы класса к операциям над ресурсом, но не к самому ресурсу.
Преимущества: непосредственное использование ресурса сосредоточено в одном месте. Легче контролировать, обеспечить надёжное манипулирование ресурсом.
Пример использования монитора.
Постановка задачи «производитель-потребитель» со складом вместимости N: Созданная производителем продукция поступает на склад. Склад может хранить N экземпляров продукта. При достижении количества N склад затоварен и не может принимать новые поступления. Со склада продукцию извлекает один или несколько потребителей. Они запрашивают по одному экземпляру. Если продукции нет, то ждут ее поступления.
Операции: «добавить экземпляр на склад», «взять экземпляр из склада», «очистить склад от продукции».
Для представления склада удобно использовать контейнер «список».
Вместимость склада зададим константой.
Для определения возможности помещения экземпляра продукции на склад
используем семафор «количество свободных мест» freeCount.
Для определения наличия продукции на складе используем семафор «количество экземпляров» productsCount.
Пример использования: производитель создает продукцию с периодом P1, потребитель извлекает продукцию с периодом P2.
Для обеспечения исключительного доступа к складу используем мьютекс