Программа лекций и презентации по курсу "ОС 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. Оконная система и TeX (презентация) (запись)
- X Window system, Wayland и D-Bus.
- Оконные менеджеры, GTK+ и QT.
- wine.
- TeX и LaTeX.
- Структура документа и фОрматирование текста.
- Beamer и Metapost.
Задания для лабораторных работ
Лабораторная работа 1
Требуется написать скрипт, совместимый с POSIX Shell,
который производит сборку некоторого исходного файла.
Таким файлом может быть как программа на языке C/C++,
так и страница TeX.
Скрипт должен:
- Возвращать информативный код ошибки (скажем, если исходный файл вообще невозможно откомпилировать).
- Анализировать текст и находить заготовленный комментарий с именем конечного файла.
Комментарий должен быть некоторым ключевым словом, наиболее логично использовать, скажем, "
Output:
".
- Сборка должна производиться в временном каталоге, который должен быть создан при помощи утилиты mktemp.
- Каталог должен быть удалён при любом исходе работы скрипта, включая обработку сигналов,
которые требует немедленного прекращения работы.
- Рядом с исходным файлом после завершения работы должен появиться конечный файл с именем,
как в распознанном комментарии.
Все попутные файлы компиляции должны быть удалены вместе со временным каталогом
(что очевидно, потому что они не должны покидать пределы временного каталога).
Лабораторная работа 2
Требуется безопасно и эффективно реализовать монитор с двумя потоками:
потоком-поставщиком и потоком-потребителем.
Поток-поставщик должен с задержкой в одну секунду инициировать условное событие,
о чём должен выводить сообщение на экран.
Поток-потребитель должен это условное событие получать, о чём также должен сообщать на экране.
В итоге на экране должна появляться серия чередующихся сообщений об отправлении события и его обработке.
Сообщения не должны нарушать очерёдность.
Ожидание события должно происходить с минимальным потреблением процессорного времени,
т. е. быть практически равным нулю.
Подразумевается, что условное событие может содержать несериализуемые данные (скажем, передаётся экземпляр класса по указателю).
Лабораторная работа 3
Требуется подготовить безопасную реализацию серверного процесса,
который совмещает обработку соединений TCP/IP с обработкой сигналов
(можно выбрать, скажем, сигнал SIGHUP
).
Приложение должно:
- Принимать соединения на некоторый порт, сообщать о новых соединениях на терминал, одно соединение оставлять принятым, остальные закрывать сразу после подключения.
- При появлении любых данных в соединении выводить сообщение на терминал (для простоты достаточно вывести только количество полученных данных).
- При получении сигнала выводить сообщение на терминал.
Фактически, работа сводится к правильному вызову функции
pselect()
,
но все действия должны быть выполнены в предельно безопасном виде,
исключающем любые race condition.
Инструкция по сборке лабораторных при помощи 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 ведь тоже подойдёт?