Семестровые задания для выполнения самостоятельных работ по курсу «Операционные системы»
1. Разработать систему распределенного обмена сообщениями на основе архитектуры клиент-сервер. Пояснение: подразумевается создание процесса сервера, которые принимает сообщения от процессов клиентов и рассылает их всем подсоединившимся клиентам. В качестве аналогии можно привести сетевой chat или ICQ
2. Разработать систему обработки сообщений построенную по слабосвязанному принципу.
Пояснение: создать процесс сервер, который получает сообщения от процессов генераторов сообщений. Каждое сообщение содержит параметры обработки и иную дополнительную информацию. Сервер сообщений принимает их и ставит в очередь. Существуют процессы обработчики, которые подсоединяются к серверу, получают очередную заявку на обслуживание, выполняют её и сообщают результат серверу. Существует несколько режимов обработки заявок. При условии, что режим обработки заявки требует подтверждения, сервер должен послать сообщение с подтверждением соответствующему процессу генератору заявок. Ввести механизм приоритетов, в соответствии с которым заявки попадают в очередь.
3. Разработать распределенную систему обработки структурированных записей.
Пояснение: создать процесс сервер, задачей которого является предоставление в совместное пользование нескольким процессам клиентам некоего структурированного хранилища записей – наподобие БД. Это может быть, например, справочник контактов. При этом сами данные хранить в плоском файле, т.е. использование какого либо существующего сервера БД запрещено. Обратить внимание на обеспечение синхронизированного доступа к одной и той же записи со стороны нескольких клиентов одновременно.
4. Разработать систему распределенных агентов, позволяющих распространять данные по вычислительной сети.
Пояснение: программа-агент – это процесс, работающий в фоновом режиме, задачей которого является выполнение некоторой работы, характер которой определяется извне. Примером программы агента может быть агент SNMP. Необходимо создать систему, состоящую из одного сервера управления и нескольких процессов-агентов. Сервер управления получает команды непосредственно от человека, в то время как процессы агенты соединяются с сервером управления, получают команду, выполняют её и сообщают результат серверу управления. Тот в свою очередь, может оповещать об успешном или неуспешном выполнении команды человека оператора.
5. Разработать систему, эмулирующую работу нескольких вычислителей.
Пояснение: некоторый процесс (или несколько процессов) генерирует заявки на обслуживание и ставит их в очередь. В качестве заявок взять вычисление некоторой мат. Функции, хотя это не принципиально, т.к. время выполнения заявки задается в условных вычислительных единицах и поэтому не зависит от реального времени требуемого на вычисление выбранной мат. функции. Существуют процессы обработчики заявок, которые последовательно выбирают заявки из очереди. Время, необходимое для обработки каждой заявки выбирается случайным в некоторых пределах и задается, например, в условных операциях. Каждый обработчик имеет некоторую скорость обработки заявок заданную в количестве условных операций в секунду.
6. Реализовать планировщик очереди.
Пояснение: существует процесс, генерирующий заявки различной вычислительной длины (выраженной в количестве условных команд) и имеющих различный приоритет. Существует процесс обработчик, который читает заявки из очереди и обрабатывает их в соответствии с заданными параметрами длины. Существует процесс – планировщик очереди. Его задача: при поступлении очередной заявки переупорядочить очередь в соответствии с приоритетами.
7. Реализовать конвейер обработки сообщений состоящий из подключаемых обработчиков.
Пояснение: разработать систему, позволяющую обрабатывать команду пользователя, передавая управление ряду зарегистрированных обработчиков, которые обмениваются информацией с помощью механизма разделяемой памяти. Процессы обработчики при запуске регистрируются в некоем глобальном регистре, и получают доступ к разделяемой области памяти, которая содержит очередную заявку, требующую обработки, при наступлении их очереди – они устанавливают блокировку на заявку, совершают свою часть работы над ней, снимают блокировку и вызывают очередной обработчик.
8. Разработать многопоточную систему, выполняющую некую вычислительную задачу с целью распараллеливания вычислений.
Пояснение: программа получает на входе некоторое целое неотрицательное число в заданном диапазоне. Результатом работы программы должен быть список всех комбинаций пар множителей, являющихся делителями заданного числа. Для повышения производительности перебор можно осуществлять распараллелив процесс на несколько потоков, каждый из которых будет выполняться в на отдельном процессоре. Все возможные делители, разбиваются на группы и каждая из них перебирается на отдельном процессоре. При нахождении пары делителей – она добавляется в общий список. Необходимо предусмотреть не одноразовое разделение всего множества, а выделение каждому потоку очередной порции чисел для проверки, при окончании порции, поток обращается за следующей. Кроме этого необходимо предусмотреть возможность задания количества потоков.
9. Разработать монитор для контроля ресурсов предотвращающий взаимную блокировку.
Пояснение: разработать программу, эмитирующую выполнение некоторой работы несколькими потоками одновременно, при этом потоки случайным образом в каждый момент требуют для своего выполнения несколько единиц ресурса (выбирается случайным образом). Монитор необходим для того, чтобы при возникновении взаимной блокировки при доступе к ресурсу, отобрать необходимое количество ресурса у одного из потоков и передать другому для разрешения конфликтной ситуации.
10. Реализовать пул рабочих потоков. Система должна состоять из процесса-генератора заявок. Серверного процесса получающего заявки и ставящего их в очередь. Пула рабочих потоков. Пул представляет собой некоторый резерв готовых к использованию ресурсов. В данном случае ресурсом является поток. Т.е. имеется несколько инициализированных и готовых к исполнению потоков, ждущих задания. При наличие заданий в очереди выбирается первое задание из очереди и выполняется потоком из пула. По завершению выполнения поток переходит обратно в пул. Под заданием подразумевается некая вычислительная работа. Для простоты можно взять, например, вычисление различных математических функций или обработку строки. Принципиально то, что задания могут быть разные и выбираются случайным образом при генерации.
Пояснение: существует процесс-генератор заявок. Существует сервер, получающий заявки и выбирающий свободный поток из пула. Заявка передается потоку из пула, поток обрабатывает заявку и возвращает результат основному процессу, а сам возвращается в пул свободных потоков. Результат возвращается процессу-генератору.
Общие замечания:
1. Все коды программ должны быть написаны на языке программирования «C» или «С++», при этом использовать следует только механизмы «Win32 API». Использование каких либо иных библиотек (например MFC) запрещено.
2. Приложение должно успешно компилироваться в среде Microsoft Visual Stuidio 5.0 или выше.
3. Все сетевые взаимодействия осуществлять по протоколу TCP/IP (можно использовать как TCP так и UDP). Рекомендуется использовать механизм сокетов(WinSocks).
4. Там, где это не указано явно, интерфейс пользователя реализовать в виде консольного приложения. (Т. е. никаких красивых окон создавать не нужно).
5. При простое и ожидании каких-либо событий программа не должна требовать процессорного времени.
6. Перед началом кодирования необходимо разработать будущую архитектуру системы, оформить в схематическом виде и представить преподавателю на утверждение. Четких указаний по созданию схемы нет, поэтому каждый студент может сделать схему так, как ему удобнее. Однако стоит обратить внимание на то, что схема должна чётко отражать разделение ролей между процессами и с необходимой детализацией описывать структуру сообщений и команд или иных структур и примитивов, участвующих во взаимодействии между процессами.
Рекомендуемая литература:
1. Джеффри Рихтер «Windows для профессионалов», Русская редакция. (Оригинальное название: Jeffrey Richter “Advanced Windows”, Microsoft Press).
Дополнительная литература по курсу:
1. Хелен Кастер «Основы Windows NT и NTFS», Русская редакция. (Оригинальное название: Helen Custer “Inside Windows NT”, Microsoft Press)
2. В. Г. Олифер, Н.А. Олифер «Сетевые операционные системы», Питер.
3. Теренс Чан «Системное программирование на C++ для Unix», bhv. (Оригинальное название: Terrence Chan “UNIX System Programming Using C++”, Printice Hall)
4. Френк Дж. Солтис «Основы AS/400», Русская редакция. (Оригинальное название: Frank G. Soltis “Inside the AS/400”, Duke Communications)
5. М. Бах «Архитектура операционной системы UNIX» (Оригинальное название: THE DESIGN OF THE UNIX OPERATING SYSTEM by Maurice J. Bach)
6. David A. Solomon “Inside Windows 2000” Third Edition, Microsoft Press