Программа лекций и презентации по курсу «ОС UNIX»
- Лекция 1. Введение, история и разновидности (презентация)
- История развития UNIX.
- Сильные и слабые стороны UNIX.
- Разновидности UNIX и дистрибутивы GNU/Linux.
- Лекция 2. Пакеты, процессы и файловая система (презентация)
- Понятие пакета, пакетные менеджеры, типы зависимостей между пакетами.
- Обработка зависимостей между пакетами и её вычислительная сложность.
- Процессы, зомби, демоны, группы процессов, сигналы, идентификатор процесса
pid\_t
.
- Управление процессами, функции
fork()
, exec*()
, wait()
; команды ps
, kill
, killall
.
- Структура файловой системы, типы файловых систем, монтирование файловых систем, команда
chroot
.
- Типы файлов и права доступа.
- Лекция 3. Управление сетью и инструменты обеспечения безопасности (презентация)
- Сетевые интерфейсы, таблица маршрутизации и беспроводные подключения.
- Инструменты отладки
nmap
, ping
и traceroute
.
- Установление сетевого подключения.
- Утилиты подсчёта хэш-сумм.
- Утилиты
gpg
и cryptsetup
.
- Лекция 4. Контейнерная виртуализация (презентация)
- Технологии контейнерной виртуализации, плюсы и минусы.
- Docker и его понятия.
- Сервисы в Docker Compose и Docker Stack.
- Инструменты оркестрации.
- Лекция 5. «Хитрости» микросервисной архитектуры (презентация)
- Порядок «горячего» обновления контейнеров.
- Файловые системы для сетевого доступа.
- Назначение брокеров и их примеры.
- Лекция 6. Сигналы и инструменты межпроцессного взаимодействия (презентация)
- Обработка и блокирование сигналов, функция
signalfd()
.
- Трубы для потоковой передачи данных.
- Семафоры, разделяемая память и очереди сообщений.
- Сервис D-Bus.
- Лекция 7. Оконная система, терминалы и TeX (презентация)
- X Window system и Wayland.
- Оконные менеджеры, GTK+ и QT.
- Терминалы и псевдотерминалы.
- TeX и LaTeX.
- Структура документа и форматирование текста.
- Лекция 8. Работа с оборудованием в Linux (презентация)
- Каталоги
/dev
, /proc
и /sys
.
- Получение информации о блочных устройствах.
- Файловая система ext4.
- Команды
lsmod
, lsusb
и lspci
.
- Протоколирование системных событий.
Лекции, названия которых выделены полужирным шрифтом, выносятся на устный зачёт.
Презентации к практическим работам
- Оболочка и скриптовые инструменты.
- Оформление проектов и инструменты сборки.
- Использование Docker.
- Сигналы и слоты в QT.
Задания для практических работ
Практическая работа «Скрипт для сборки»
Требуется написать скрипт, совместимый с POSIX Shell,
который производит сборку некоторого исходного файла.
Таким файлом может быть как программа на языке C/C++,
так и документ TeX.
Скрипт должен:
- Возвращать информативный код ошибки (скажем, если исходный файл вообще невозможно откомпилировать).
- Анализировать текст и находить заготовленный комментарий с именем конечного файла.
Комментарий должен быть некоторым ключевым словом, наиболее логично использовать, скажем, &
Output:
.
- Сборка должна производиться в временном каталоге, который должен быть создан при помощи утилиты
mktemp
.
- Каталог должен быть удалён при любом исходе работы скрипта, включая обработку сигналов,
которые требуют немедленного прекращения работы.
- Рядом с исходным файлом после завершения работы должен появиться конечный файл с именем,
как в распознанном комментарии.
Все попутные файлы компиляции должны быть удалены вместе со временным каталогом
(что очевидно, потому что они не должны покидать пределы временного каталога).
Практическая работа «Конкурентный контейнер»
Для выполнения работы следует:
- завести некоторый разделяемый том в Docker, который можно подключать к нескольким контейнерам;
- подготовить
Dockerfile
и скрипт на POSIX Shell, с помощью которых можно создать образ контейнера для конкурентного управления файлами.
Под конкурентным управлением файлами мы подразумеваем следующие действия:
- Выполняются поочерёдно (бесконечно в цикле) две операции, между которами всегда осуществляется задержка в одну секунду: создание файла в каталоге общего тома и его последующее удаление.
- Для определения имени файла следует выбрать первое незанятое имя из последовательности
001
, 002
, 003
и т. д.
- В файл нужно записать некоторый случайно сгенерированный идентификатор контейнера (контейнер во все свои файлы записывает всегда один и тот же идентификатор) и порядковый номер созданного файла для этого контейнера (в первый записывается
1
, во второй 2
и т. д.).
- Определение незанятого имени и создание файла с ним должно проводиться как атомарная операция (т. е. этот фрагмент должен быть внутри блока с вызовом
flock
на некотором служебном файле синхронизации).
Атомарная операция должна длиться как можно короче.
Контейнер будет проверяться с запуском в единственном экземпляре, с запуском десяти экземпляров и с запуском 50 экземпляров.
Во всех случаях работа должна быть стабильной и исключающей race condition.
Практическая работа «Оконное приложение на QT#187;
Необходимо разработать любое оконное приложение с использованием библиотеки QT, которое должно удовлетворять следующим требованиям:
- приложение должно содержать как минимум два любых элемента управления;
- приложение должно обрабатывать как минимум одно событие от пользователя;
- функционал приложения не должен встречаться в работах других студентов.
Мастерская работа «Горизонтально масштабируемый сервис»
Работа повышенной сложности и ориентирована на учащихся, желающих отточить своё мастерство с особенным усердием.
Для снижения требований допускаются три смягчающих правила:
- разрешается работу не выполнять в обмен на расширение списка вопросов на устном зачёте до материала всех лекций (не только четырёх отмеченных жирным шрифтом);
- разрешается работу не выполнять, если аналогичный функционал присутствует в практическом проекте по программной инженерии;
- разрешается работу выполнять парами студентов, причём фактический вклад каждого из них вточности проверяться не будет.
В рамках работы необходимо разработать сервис по микросервисной архитектуре, отвечающий следующим требованиям:
- Сервис должен содержать контейнеры не менее двух различных типов и один брокер. В общем случае допускается реализация одного управляющего контейнера, одного брокера и множество тиражируемых контейнеров-работников, запускаемых из общего образа.
- Сервис должен быть горизонтально масштабируемым. Другими словами, как минимум контейнер одного типа должен быть реплицируемым с балансировки нагрузки на все запущенные реплики.
- Функциональность сервиса любая по интерес авторов.