Для оптимизации работы с блочными устройствами в ОС существует кэш страниц с данными, которыми мы производим операции чтения и записи на диск. Такой кэш позволяет избежать высоких задержек при повторном доступе к данным, так как операция будет выполнена с данными в RAM, а не на диске (вспомним пирамиду памяти на 35 слайде и всё-всё).
В данной лабораторной работе необходимо реализовать блочный кэш в пространстве пользователя в виде динамической библиотеки. Политику вытеснения страниц и другие элементы задания необходимо получить у преподавателя.
При выполнении работы необходимо реализовать простой API для работы с файлами, предоставляющий пользователю следующие возможности (по аналогии с системным API):
-
Открытие файла по заданному пути файла, доступного для чтения. Процедура возвращает некоторый хэндл на файл. Пример:
int vtpc_open(const char *path). -
Закрытие файла по хэндлу. Пример:
int vtpc_close(int fd). -
Чтение данных из файла. Пример:
ssize_t vtpc_read(int fd, void buf[.count], size_t count). -
Запись данных в файл. Пример:
ssize_t vtpc_write(int fd, const void buf[.count], size_t count). -
Перестановка позиции указателя на данные файла. Достаточно поддержать только абсолютные координаты. Пример:
off_t vtpc_lseek(int fd, off_t offset, int whence). -
Синхронизация данных из кэша с диском. Пример:
int vtpc_fsync(int fd).
Операции с диском разработанного блочного кеша должны производиться в обход страничного кеша операционной системы.
В рамках проверки работоспособности разработанного блочного кэша необходимо адаптировать указанную преподавателем программу-загрузчик из ЛР 1, добавив использование кэша. Запустите программу и убедитесь, что она корректно работает. Сравните производительность до и после.
Точкой входа в ваш модуль являются файлы vtpc.h и vtpc.c. Именно этот API
вызывается тестовым фреймворком, сравнивающим поведения вашего vtpc и libc.
-
Программа (комплекс программ) должна быть реализован на языке C.
-
Если по выданному варианту задана политика вытеснения Optimal, то необходимо предоставить пользователю возможность подсказать page cache, когда будет совершен следующий доступ к данным. Это можно сделать либо добавив параметр в процедуры
readиwrite(например,ssize_t vtpc_read(int fd, void buf[.count], size_t count, access_hint_t hint)), либо добавив еще одну функцию в API (например,int vtpc_advice(int fd, off_t offset, access_hint_t hint)).access_hint_tв данном случае – это абсолютное время или временной интервал, по которому разработанное API будет определять время последующего доступа к данным. -
Запрещено использовать высокоуровневые абстракции над системными вызовами.
Отчет должен содержать:
-
титульный лист с указанием номера и названия ЛР, вашего ФИО, ФИО преподавателя практики, номера вашей группы, варианта ЛР;
-
текст задания в соответствии с вариантом;
-
краткий обзор кода;
-
данные о работе программы-нагрузчика до и после внедрения своего page cache;
-
заключение с анализом результатов и выводом.
Вариант задания представляет собой название алгоритма вытеснения страниц из кеша, который изучается на лекции (часть 3, 22 слайд), либо иной на усмотрение преподавателя. Например,
- LRU -- Least Recently Used,
- LFU -- Least Frequantly Used,
- MRU -- Most Recently Used,
- FIFO -- First In First Out,
- NRU -- Not Recently Used,
- Clock -- Часовой алгоритм,
- Optimal (с подсказкой),
- Random,
- Second chance,
- ARC,
- 2Q,
- LRU-K.
Note
Это перечислены алгоритмы вытеснения страниц, но ведь страницы нужно ещё правильно загружать -- подумайте над тем, какую страницу следует взять в использование следующей и в какой момент.