Практические работы
Учебный курс «Операционные системы»
Мониторы
Требуется безопасно и эффективно реализовать монитор с двумя потоками: потоком-поставщиком и потоком-потребителем. Поток-поставщик должен с задержкой в одну секунду инициировать условное событие, о чём должен выводить сообщение на экран. Поток-потребитель должен это условное событие получать, о чём также должен сообщать на экране. В итоге на экране должна появляться серия чередующихся сообщений об отправлении события и его обработке. Сообщения не должны нарушать очерёдность. Ожидание события должно происходить с минимальным потреблением процессорного времени, т. е. быть практически равным нулю. Подразумевается, что условное событие может содержать несериализуемые данные (скажем, передаётся экземпляр класса по указателю).
Безопасная обработка сетевых подключений и сигналов
Требуется подготовить безопасную реализацию серверного процесса,
который совмещает обработку соединений TCP/IP с обработкой сигналов
(можно выбрать, скажем, сигнал SIGHUP).
Приложение должно:
- Принимать соединения на некоторый порт, сообщать о новых соединениях на терминал, одно соединение оставлять принятым, остальные закрывать сразу после подключения.
- При появлении любых данных в соединении выводить сообщение на терминал (для простоты достаточно вывести только количество полученных данных).
- При получении сигнала выводить сообщение на терминал.
Фактически, работа сводится к правильному вызову функции pselect(),
но все действия должны быть выполнены в предельно безопасном виде,
исключающем любые race condition.
Модуль ядра Linux и работа с /proc
Требуется подготовить модуль для загрузки в ядро Linux. Модуль в базовом виде должен:
- сопровождаться
Makefileдля сборки; - оформляться в виде файла
*.ko; - загружаться командой
insmodи выгружаться командойrmmod; - при загрузке выводить в
dmesgстроку «Welcome to the Tomsk State University»; - при выгрузке выводить в
dmesgстроку «Tomsk State University forever!».
В полном виде модуль при своей загрузке должен создавать файл tsulab в каталоге /proc.
Этот файл должен содержать количество секунд, оставшихся до начала сессии.
Длинные работы в workqueue ядра Linux
Требуется подготовить модуль ядра Linux (рекомендуется на основе модуля предыдущей работы),
выполняющий длительные работы посредством механизма workqueue.
Работа не должна выполняться в контексте системного вызова загрузки модуля, обработчика таймера или обработчика прерывания.
После загрузки модуля должна создаваться собственная очередь работ.
После постановки работ в очередь функция загрузки модуля должна завершиться немедленно, не дожидаясь окончания работ. Во время выполнения работ модуль должен оставаться работоспособным и не должен обращаться к освобождённой памяти. При выгрузке модуля необходимо корректно дождаться завершения уже выполняющихся работ. Все работы, находящиеся в очереди, должны быть отменены или обработаны до уничтожения очереди. После выгрузки модуля в журнал ядра должна быть выведена информация о завершении или отмене всех работ. Модуль не должен оставлять после себя созданные очереди, таймеры, файлы или другие объекты ядра.
Очередь работ должна быть заполнена операциями, имитирующими сложный процесс.
Имитированный сложный процесс должен состоять из серии последовательных этапов.
Продолжительность каждого этапа должна составлять не менее одной секунды.
Во время выполнения каждого этапа работа должна сообщать в журнал ядра свой идентификатор, номер этапа и общее количество этапов.
Для имитации длительной операции следует использовать ожидание, допускающее засыпание потока, например msleep() или schedule_timeout_interruptible().
Запрещено имитировать длительную работу циклом, полностью занимающим процессор.
Параметры очереди и количество одновременно выполняемых работ должны определяться программой. На уровне сложности «Hey, Not Too Rough», который достаточен для приёма лабораторной работы, при загрузке модуля необходимо поставить в очередь несколько работ со случайными параметрами.
При сдаче лабораторной работы в режиме берсерка можно выводить информацию о статусе работ в /proc/tsulab,
а в режиме бешеного берсерка также запускать новые работы через запись команд в /proc/tsulab.