Лабораторные работы по дисциплине "Операционные системы" в ЛЭТИ
Лаба 1: Создание и уничтожение потоков
Написать программу, содержащую два потока (в дополнение к основному потоку). Каждый из потоков должен выводить определенное число на экран
Лаба 2: Cинхронизация потоков с помощью мьютексов и неименованных семафоров
Написать программу, содержащую два потока, осуществляющих координированный доступ к разделяемому ресурсу.
Необходимо убедиться, что в случае отсутствия мьютекса (семафора) потоки выводят символы в произвольном порядке, например: 121212121212121212121212121212121212121212121212121212121212121.
В случае использования мьютекса (семафора) потоки выводят символы в определенном порядке, например: 111111111122222222221111111111222222222211111111112222222222.
Студент, который находится в списке группы под нечетным номером, использует мьютексы для координации доступа к ресурсу.
Студент, который находится в списке группы под четным номером, использует неименованные семафоры для координации доступа к ресурсу.
В обоих случаях студент реализует три варианта программы:
- С блокирующей операцией захвата мьютекса (семафора) pthread_mutex_lock() (sem_wait());
- С операцией проверки захвата мьютекса (семафора) без блокировки pthread_mutex_trylock() (sem_trywait());
- С блокировкой на время операции захвата мьютекса (семафора) pthread_mutex_timedlock() (sem_timedwait()).
Лаба 3: Взаимодействие потоков через неименованные каналы
Написать программу, содержащую два потока, обменивающихся информацией через неименованный канал (pipe).
Устранить блокировки потоков для случая чтения из пустого канала двумя способами (pipe2() и fcntl()).
Лаба 4: Cоздание и уничтожение процессов
- Написать программу 1, которая при запуске принимает несколько (3 – 5) аргументов в командной строке, а затем в цикле выводит каждый аргумент на экран с задержкой в несколько секунд.
Программа 1 должна выводить на экран свой идентификатор и идентификатор процесса-родителя.
Программа 1 должна сформировать код завершения.
- Написать программу 2, которая запускает программу 1 в качестве дочернего процесса с помощью вызовов fork() и exec().
Программа 2 должна вывести на экран идентификатор процесса-родителя, свой идентификатор и идентификатор дочернего процесса.
Программа 2 должна сформировать набор параметров для передачи в дочерний процесс аргументов командной строки.
Программа 2 должна ожидать завершения дочернего процесса, проверяя событие завершения каждую половину секунды, а по завершению дочернего процесса вывести на экран код завершения.
- Написать программу 3, которая запускает программу 1 в качестве дочернего процесса с помощью вызовов clone() и exec().
Программа 3 должна вывести на экран идентификатор процесса-родителя, свой идентификатор и идентификатор дочернего процесса.
Программа 3 должна сформировать набор параметров для передачи в дочерний процесс аргументов командной строки.
Программа 3 должна ожидать завершения дочернего процесса, проверяя событие завершения каждую половину секунды, а по завершению дочернего процесса вывести на экран код завершения.
Лаба 5: Cинхронизация процессов с помощью именованных семафоров
Необходимо выбрать общий ресурс - файл и осуществлять запись данных в него из двух программ.
Обе программы должны создать (или открыть, если создан) один и тот же именованный семафор, должны создать (или открыть, если создан) один и тот же файл, но записывать в файл разные символы.
Необходимо убедиться, что в случае отсутствия именованного семафора процессы выводят символы в файл в произвольном порядке, например: 1212121212121212121212121212121212121212121212121212121212121.
В случае использования именованного семафора процессы выводят символы в файл в определенном порядке, например: 111111111122222222221111111111222222222211111111112222222222.
Использовать функции входа в критический участок с блокировкой и без блокировки.
Лаба 6: Взаимодействие процессов через разделяемую память
Написать комплект из двух программ, одна из которых посылает данные в разделяемую память, а вторая – читает эти данные. Поскольку механизм разделяемой памяти не содержит средств синхронизации записи и чтения, для синхронизации требуется применить механизм именованных семафоров.
Лаба 7: Взаимодействие процессов через именованные каналы
Написать комплект из двух программ, одна из которых записывает данные в именованный канал, а вторая – считывает эти данные. Проверить работу функций с блокировкой и без блокировки.
Лаба 8: Взаимодействие процессов через очереди сообщений
Написать комплект из двух программ, одна из которых передает сообщение в очередь сообщений, а вторая – принимает сообщения из очереди сообщений. Проверить работу функций с блокировкой и без блокировки.
Лаба 9: Сетевое взаимодействие процессов через сокеты
Написать комплект из двух программ, одна из которых выполняет функции сервера, а вторая выполняет функции клиента.
Клиент после установления соединения с сервером посылает ему запросы.
Сервер принимает запросы, обрабатывает их и отправляет ответы клиенту. Функцию обработки следует выбрать из таблицы.
Клиент принимает ответы и выводит их на экран.
Использовать функции работы с сокетами без блокировки.
В качестве очередей запросов на обработку и передачу использовать типы данных std::vector или std::queue.
Необходимо учесть, что очереди запросов на обработку и передачу являются критическими ресурсами, с которыми работают несколько потоков одновременно. Поэтому работа с очередями должна производиться в режиме взаимного исключения.
Студент, который находится в списке группы под четным номером, использует протокол с установлением соединения (TCP).
Студент, который находится в списке группы под нечетным номером, использует протокол без установления соединения (UDP).