Программа лекций и презентации по курсу "ОС UNIX"
Часть 1: Основы
- Лекция 1: Введение, история и разновидности (презентация)
- История развития UNIX
- Сильные и слабые стороны UNIX
- Разновидности UNIX и дистрибутивы GNU/Linux
- Лекция 2: процессы и файловая система (презентация)
- Процессы, зомби, демоны, группы процессов, сигналы, идентификатор процесса
pid\_t
.
- Управление процессами, функции
fork()
, exec*()
, wait()
; команды ps
, kill
, killall
.
- Структура файловой системы, типы файловых систем, монтирование файловых систем, команда
chroot
.
- Типы файлов, права доступа, umask; файловый дескриптор, функции
open()
, read()
, write()
и close()
.
- Команды работы с файлами:
cp
, rm
, mv
, rmdir
, find
, stat
.
- Лекция 3: пакетная система и ядро Linux (презентация)
- Понятие пакета, пакетные менеджеры, типы зависимостей между пакетами.
- Обработка зависимостей между пакетами и её вычислительная сложность.
- Понятие ядра операционной системы и порядок загрузки GNU/Linux.
- Системные вызовы и способы взаимодействия процессов с ядром системы.
- Модули ядра и драйверы устройств.
- Лекция 4: оболочка и скриптовые инструменты (презентация)
- Введение в bash.
- Операции выполнение команд, перенаправления стандартных потоков ввода/вывода.
- Условия и циклы, строковые операции.
- Обработка сигналов в bash, функции и файловые блокировки.
- Популярные утилиты, обзор
sed
и awk
.
- Лекция 5: управление сетью и инструменты обеспечения безопасности (презентация)
- Сетевые интерфейсы, таблица маршрутизации и беспроводные подключения.
- Инструменты отладки
nmap
, ping
и traceroute
.
- Установление сетевого подключения.
- Утилиты подсчёта хэш-сумм.
- Утилиты
gpg
и cryptsetup
.
- Лекция 6: оформление проектов и инструменты сборки (презентация)
- Динамические библиотеки, gcc, использование команды
strace
.
- Утилиты
make
, cmake
, scons
.
- Работа с autoconf и automake.
- Сборка rpm-пакета и deb-пакета.
- Лекция 7: схема серверного приложения (презентация)
- Порядок обработки клиентских соединений.
- Общая схема серверного приложения.
- Безопасное совмещение обработки соединений с обработкой сигналов.
- Системный вызов
pselect()
- Библиотека pthread.
- Лекция 8: инструменты межпроцессного взаимодействия (презентация)
- Мьютексы и условные переменные pthread.
- Понятие монитора и его реализация.
- Семафоры и разделяемая память.
- Трубы, очереди сообщений и файловые блокировки.
- Лекция 9: оконная система, виртуализация и кроссплатформенность (презентация) (запись)
- X Window system, Wayland и D-Bus.
- Оконные менеджеры, GTK+ и QT.
- Назначение инструментов виртуализации и её типы.
- проекты wine, cygwin и mingw.
Часть 2: Разработка ПО в UNIX
- Лекция 10: OpenSSL и конфигурирование серверных служб (презентация)
- Описание и назначение стандарта X.509, протоколов SSL и TLS.
- Работа с сертификатами, структура сертификата, получение сертификата.
- OpenSSL, создание закрытого ключа и сертификата с его помощью.
- Порядок подготовки к работе веб-сервера Apache с поддержкой HTTPS.
- Лекция 11: введение в контейнерную виртуализацию на примере Docker (презентация)
- Понятие контейнерной виртуализации и её отличительные черты.
- Пространства имён Linux и контрольные группы.
- Docker и его понятия: (образы, контейнеры, тома и пр.)
- Создание контейнера и Docker Hub.
- Понятие оркестрации.
- Лекция 12: асинхронная разработка (презентация)
- Промисы и промисифайзеры.
- Ключевые слова
async
и await
.
- Библиотека
asyncio
для Python.
- Лекция 13: разделяемые библиотеки (презентация)
- Особенности работы с разделяемыми библиотеками в GNU/Linux.
- Подключение сторонней библиотеки в Rust.
- Работа с JNI.
- Лекция 14: введение в TensorFlow (презентация)
- Понятия машинного обучения и нейронных сетей.
- TensorFlow и Keras.
- Установка и запуск TensorFlow в Docker.
- Модели TensorFlow.
- Лекция 15: Java в Linux (презентация)
- Особенности установки и использования Java в GNU/Linux.
- Библиотека JNA.
- Библиотеки для доступа к системнозависимым функциям (сокеты UNIX, D-Bus и псевдотерминалы).
- Лекция 16: введение в TeX (презентация)
- TeX и LaTeX.
- Структура документа.
- ФОрматирование текста.
- Beamer и Metapost.
Задания для лабораторных работ
Лабораторная работа 1
Требуется написать скрипт, совместимый с POSIX Shell,
который производит сборку некоторого исходного файла.
Таким файлом может быть как программа на языке C/C++,
так и страница TeX.
Скрипт должен:
- Возвращать информативный код ошибки (скажем, если исходный файл вообще невозможно откомпилировать).
- Анализировать текст и находить заготовленный комментарий с именем конечного файла.
Комментарий должен быть некоторым ключевым словом, наиболее логично использовать, скажем, "
Output:
".
- Сборка должна производиться в временном каталоге, который должен быть создан при помощи утилиты mktemp.
- Каталог должен быть удалён при любом исходе работы скрипта, включая обработку сигналов,
которые требует немедленного прекращения работы.
- Рядом с исходным файлом после завершения работы должен появиться конечный файл с именем,
как в распознанном комментарии.
Все попутные файлы компиляции должны быть удалены вместе со временным каталогом
(что очевидно, потому что они не должны покидать пределы временного каталога).
Лабораторная работа 2
Требуется безопасно и эффективно реализовать монитор с двумя потоками:
потоком-поставщиком и потоком-потребителем.
Поток-поставщик должен с задержкой в одну секунду инициировать условное событие,
о чём должен выводить сообщение на экран.
Поток-потребитель должен это условное событие получать, о чём также должен сообщать на экране.
В итоге на экране должна появляться серия чередующихся сообщений об отправлении события и его обработке.
Сообщения не должны нарушать очерёдность.
Ожидание события должно происходить с минимальным потреблением процессорного времени,
т. е. быть практически равным нулю.
Подразумевается, что условное событие может содержать несериализуемые данные (скажем, передаётся экземпляр класса по указателю).
Лабораторная работа 3
ВНИМАНИЕ! На первый семестр 2020–2021 гг. лабораторная работа отменена.
Требуется подготовить безопасную реализацию серверного процесса,
который совмещает обработку соединений TCP/IP с обработкой сигналов
(можно выбрать, скажем, сигнал SIGHUP
).
Приложение должно:
- Принимать соединения на некоторый порт, сообщать о новых соединениях на терминал, одно соединение оставлять принятым, остальные закрывать сразу после подключения.
- При появлении любых данных в соединении выводить сообщение на терминал (для простоты достаточно вывести только количество полученных данных).
- При получении сигнала выводить сообщение на терминал.
Фактически, работа сводится к правильному вызову функции
pselect()
,
но все действия должны быть выполнены в предельно безопасном виде,
исключающем любые race condition.
Лабораторная работа 4
Требуется подготовить программу на C/C++ в традициях "Hello, world!",
которая должна собираться комплектом automake/autoconf.
Другими словами, в ходе работы нужно, чтобы были правильно составлены файлы
hello.c
,
configure.in
,
automake.am
позволяющие получить дистрибутив программы.
Полученный дистрибутив должен собираться командой:
./configure && make
Лабораторная работа 5
Требуется подготовить контейнер Docker, содержащий любой HTTP-сервер,
который при запуске открывает порт 80 и умеет отсылать index.html
,
содержащий текст "Куда мы без UNIX?".
Инструкция по сборке лабораторных при помощи Docker в Microsoft Windows
Лабораторные работы можно выполнять в Microsoft Windows при помощи Docker.
Его дистрибутив можно найти по этой ссылке.
В качестве примера здесь можно найти программу для языка C
с приложенным Dockerfile
.
Чтобы скомпилировать и запустить программу, нужно в папке с проектом
выполнить две команды:
docker build -t unix-lab .
docker run unix-lab
В университетском Moodle доступен видеоролик, как это выполняется.
С помощью докера можно запускать bash-скрипты следующей командой:
docker run -it --rm -v //d/path/to/script.sh:/script.sh bash:4.4 bash /script.sh
Где //d/path/to/script.sh - путь к баш-скрипту где-то на диске D. К сожалению,
не нашёл официального контейнера для чистого shell, но bash ведь тоже подойдёт?