Презентации и программа лекций

Учебный курс «ОС UNIX»

Лекция 1

Введение, история и разновидности

  1. История развития UNIX.
  2. Сильные и слабые стороны UNIX.
  3. Разновидности UNIX и дистрибутивы GNU/Linux.

📌 Презентация

Лекция 2

Процессы и файлы

  1. Понятие процесса, типы процессов, pid процесса, функция fork().
  2. Сигналы и приоритеты процессов.
  3. Структура файловой системы, типы файлов, монтирование файловых систем, команда chroot.
  4. Типы ссылок и права доступа.
  5. Понятие файлового дескриптора, функции open(), read(), write() и close().

📌 Презентация

Лекция 3

Управление сетью и инструменты обеспечения безопасности

  1. Сетевые интерфейсы, таблица маршрутизации и беспроводные подключения.
  2. Инструменты отладки nmap, ping и traceroute.
  3. Установление сетевого подключения.
  4. Утилиты подсчёта хэш-сумм.
  5. Утилиты gpg и cryptsetup.

📌 Презентация

Лекция 4

Сигналы и инструменты межпроцессного взаимодействия

  1. Обработка и блокирование сигналов, функция signalfd().
  2. Трубы для потоковой передачи данных.
  3. Семафоры, разделяемая память и очереди сообщений.
  4. Сервис D-Bus.

📌 Презентация

Лекция 5

Контейнерная виртуализация

  1. Технологии контейнерной виртуализации, плюсы и минусы.
  2. Docker и его понятия.
  3. Сервисы в Docker Compose и Docker Stack.
  4. Инструменты оркестрации.

📌 Презентация

Лекция 6

Оконная система, терминалы и TeX

  1. X Window system и Wayland.
  2. Оконные менеджеры, GTK+ и QT.
  3. Терминалы и псевдотерминалы.
  4. TeX и LaTeX.
  5. Структура документа и форматирование текста.

📌 Презентация

Полезные материалы для практических работ

Практические работы

Практическая работа «Скрипт для сборки»

Требуется написать скрипт, совместимый с POSIX Shell, который производит сборку некоторого исходного файла. Таким файлом может быть как программа на языке C/C++, так и документ  TeX. Скрипт должен:

  1. Возвращать информативный код ошибки (скажем, если исходный файл вообще невозможно откомпилировать).
  2. Анализировать текст и находить заготовленный комментарий с именем конечного файла. Комментарий должен быть некоторым ключевым словом, наиболее логично использовать, скажем, Output:.
  3. Сборка должна производиться в временном каталоге, который должен быть создан при помощи утилиты mktemp.
  4. Каталог должен быть удалён при любом исходе работы скрипта, включая обработку сигналов, которые требуют немедленного прекращения работы. Если в ходе сборки файла создаются временные промежуточные файлы, они должна оставаться во временном каталоге и удаляться вместе с ним.
  5. Рядом с исходным файлом после завершения работы должен появиться конечный файл с именем, как в распознанном комментарии.

Практическая работа «Конкурентный контейнер»

Для выполнения работы следует:

  • завести некоторый разделяемый том в Docker, который можно подключать к нескольким контейнерам;
  • подготовить Dockerfile и скрипт на POSIX Shell, с помощью которых можно создать образ контейнера для конкурентного управления файлами.

Под конкурентным управлением файлами мы подразумеваем следующие действия:

  1. Выполняются поочерёдно (бесконечно в цикле) две операции, между которами всегда осуществляется задержка в одну секунду: создание файла в каталоге общего тома и его последующее удаление.
  2. Для определения имени файла следует выбрать первое незанятое имя из последовательности 001, 002, 003 и т. д.
  3. В файл нужно записать некоторый случайно сгенерированный идентификатор контейнера (контейнер во все свои файлы записывает всегда один и тот же идентификатор) и порядковый номер созданного файла для этого контейнера (в первый записывается 1, во второй 2 и т. д.).
  4. Определение незанятого имени и создание файла с ним должно проводиться как атомарная операция (т. е. этот фрагмент должен быть внутри блока с вызовом flock на некотором служебном файле синхронизации). Атомарная операция должна длиться как можно короче.

Контейнер будет проверяться с запуском в единственном экземпляре, с запуском десяти экземпляров и с запуском 50 экземпляров. Во всех случаях работа должна быть стабильной и исключающей race condition.

Практическая работа «Жёсткие ссылки»

Необходимо написать консольное приложение на C/C++ с использованием любой библиотеки, но без вызова внешних приложений, которое:

  1. Обходит весь указанный каталог и составляет список файлов в нём.
  2. Для каждого файла вычисляет любой вид хэша (можно SHA1).
  3. Для всех файлов, у которых обнаружен совпадающий хэш, требуется оставить только один экзэмпляр, а остальные нужно заменить на жёсткие ссылки, указывающие на тот экземпляр, который был оставлен.

Практическая работа «Горизонтально масштабируемый сервис»

В рамках работы необходимо разработать сервис по микросервисной архитектуре, отвечающий следующим требованиям:

  1. Сервис должен содержать контейнеры не менее двух различных типов и один брокер. В общем случае допускается реализация одного управляющего контейнера, одного брокера и множество тиражируемых контейнеров-работников, запускаемых из общего образа.
  2. Сервис должен быть горизонтально масштабируемым. Другими словами, как минимум контейнер одного типа должен быть реплицируемым с балансировки нагрузки на все запущенные реплики.
  3. Функциональность сервиса любая по интерес авторов.