diff --git a/doc/process.md b/doc/process.md index 3d22f47..94a7b1f 100644 --- a/doc/process.md +++ b/doc/process.md @@ -13,40 +13,48 @@ Выдайте доступ на чтение вашего репозитория преподавателю практики. `Settings -> Collaborators and teams -> Add people`. -## Шаг 2. Ход лабораторной работы +## Шаг 2. Выполнение задания + +Рекомендуется открывать в редакторе кода конкретный каталог с лабораторной +работой **как корневой** (например, `lab/vtsh`), чтобы автоматически использовались +подготовленные конфигурации. 1. Отведите ветку от `main`. Ветка должна называться `lab-N`, где `N` -- номер лабораторной работы, например, `lab-1`. -2. Напишите код. +2. Напишите код, сохраняя детальную историю коммитов. + +3. Выгрузите коммиты в удаленный репозиторий. -3. Сделайте PR из `lab-N` в `main`. В "Приложении А" вы найдете требования к описанию PR. +4. Сделайте Pull Request (PR) из `lab-N` в `main`, согласно требованим к оформлению из "Приложении А". -4. Пройдите автоматические проверки. +5. Пройдите автоматические проверки. -Note. Возможно, вы будете не согласны с некоторыми ошибками линтера. Очевидно странные вы можете отключить, но в комментариях к ПРу аргументировать свое решение. +**Note**. Возможно, вы будете не согласны с некоторыми ошибками линтера. Очевидно странные проверки вы можете отключить, но в комментариях к PR-у необходимо аргументировать свое решение. ## Шаг 3. Прохождение ревью кода -1. Призовите преподавателя практики на ревью. +1. Дайте преподавателю практики право на просмотр и ревью вашего рерпозитория. Когда задание будет выполнено, назначьте его ревьювером и упомяните в обсуждении PR. 2. Исправьте замечания. 3. Получите ОК от преподавателя и дополнительное задание. +4. Выполните дополнительное задание. + ## Шаг 4. Защита лабораторной работы 1. Напишите отчет в соответствии с требованиями в "Приложении Б". -2. Отправьте преподавателю на почту. Тема письма должна совпадать с заголовком PRа. +2. Отправьте отчет преподавателю на почту. Тема письма должна совпадать с заголовком PRа. -3. Приходите на занятие готовыми ответить на вопросы. +3. Приходите на занятие готовыми ответить на вопросы и продемонстрировать выполнение доп. задания. 4. Пройдите защиту. 5. Получите оценку. -## Приложение А. Формат описания MR +## Приложение А. Формат описания Pull Request (PR) Title: `[БП]ЛР[1-4] <Группа> <Фамилия> <Имя>` @@ -89,3 +97,5 @@ P33000 Иванов Иван Иванович 6. ФИО преподавателя практики полностью 7. Год 3. Ссылка в начале секции "Ход работы". +4. Промежуточные результаты выполнения основного и дополнительного задания. +5. Заключение. diff --git a/lab/vtfs/README.md b/lab/vtfs/README.md index 21b260a..8ac9837 100644 --- a/lab/vtfs/README.md +++ b/lab/vtfs/README.md @@ -149,6 +149,8 @@ int vtfs_fill_super(struct super_block *sb, void *data, int silent) { Аргументы `data` и `silent` нам не понадобятся. В этой функции мы используем ещё одну (пока) неизвестную функцию — `vtfs_get_inode`. Она будет создавать новую структуру `inode`, в нашем случае — для корня файловой системы: + + ```c struct inode* vtfs_get_inode( struct super_block* sb, @@ -245,6 +247,8 @@ drwxrwxrwx 1 root root 0 Oct 24 15:52 vt После этого мы сможем перейти в `/mnt/vt`, но не можем вывести содержимое директории. На этот раз нам понадобится не `i_op`, а `i_fop` — структура типа [file_operations][21]. Реализуем в ней первую функцию — `iterate`. + + ```c struct file_operations vtfs_dir_ops = { .iterate = vtfs_iterate, @@ -324,6 +328,8 @@ struct dentry* vtfs_lookup( Теперь научимся создавать и удалять файлы. Добавим ещё два поля в `inode_operations` — `create` и `unlink`: Функция `vtfs_create` вызывается при создании файла и должна возвращать новую `inode` с помощью `d_add`, если создать файл получилось. Рассмотрим простой пример: + + ```c int vtfs_create( struct inode *parent_inode, @@ -503,7 +509,6 @@ int64_t vtfs_http_call( - Готовность запустить тесты по просьбе преподавателя -- За хранилище данных в RAM вы сможете получить не более 10 баллов за ЛР, а за реализацию с сервером до 15 баллов. [1]: https://en.wikipedia.org/wiki/Monolithic_kernel [2]: https://en.wikipedia.org/wiki/Ext4 diff --git a/lab/vtpc/README.md b/lab/vtpc/README.md index 78e4047..a458ba7 100644 --- a/lab/vtpc/README.md +++ b/lab/vtpc/README.md @@ -8,27 +8,44 @@ При выполнении работы необходимо реализовать простой API для работы с файлами, предоставляющий пользователю следующие возможности: -1. Открытие файла по заданному пути файла, доступного для чтения. Процедура возвращает некоторый хэндл на файл. Пример: `int lab2_open(const char *path)`. +1. Открытие файла по заданному пути файла, доступного для чтения. Процедура + возвращает некоторый хэндл на файл. Пример: `int lab2_open(const char *path)`. 2. Закрытие файла по хэндлу. Пример: `int lab2_close(int fd)`. -3. Чтение данных из файла. Пример: `ssize_t lab2_read(int fd, void buf[.count], size_t count)`. +3. Чтение данных из файла. + Пример: `ssize_t lab2_read(int fd, void buf[.count], size_t count)`. -4. Запись данных в файл. Пример: `ssize_t lab2_write(int fd, const void buf[.count], size_t count)`. +4. Запись данных в файл. + Пример: `ssize_t lab2_write(int fd, const void buf[.count], size_t count)`. -5. Перестановка позиции указателя на данные файла. Достаточно поддержать только абсолютные координаты. Пример: `​​​​​​​off_t lab2_lseek(int fd, off_t offset, int whence)`. +5. Перестановка позиции указателя на данные файла. Достаточно поддержать только + абсолютные координаты. + Пример: `​​​​​​​off_t lab2_lseek(int fd, off_t offset, int whence)`. 6. Синхронизация данных из кэша с диском. Пример: `int lab2_fsync(int fd)`. -Операции с диском разработанного блочного кеша должны производиться в обход page cache ОС. +Операции с диском разработанного блочного кеша должны производиться в обход page +cache ОС. -В рамках проверки работоспособности разработанного блочного кэша необходимо адаптировать указанную преподавателем программу-загрузчик из ЛР 1, добавив использование кэша. Запустите программу и убедитесь, что она корректно работает. Сравните производительность до и после. +В рамках проверки работоспособности разработанного блочного кэша необходимо +адаптировать указанную преподавателем программу-загрузчик из ЛР 1, добавив +использование кэша. Запустите программу и убедитесь, что она корректно работает. +Сравните производительность до и после. ## Ограничения 1. Программа (комплекс программ) должна быть реализован на языке C. -2. Если по выданному варианту задана политика вытеснения Optimal, то необходимо предоставить пользователю возможность подсказать page cache, когда будет совершен следующий доступ к данным. Это можно сделать либо добавив параметр в процедуры `read` и `write` (например, `ssize_t lab2_read(int fd, void buf[.count], size_t count, access_hint_t hint)`), либо добавив еще одну функцию в API (например, `int lab2_advice(int fd, off_t offset, access_hint_t hint)`). `access_hint_t` в данном случае – это абсолютное время или временной интервал, по которому разработанное API будет определять время последующего доступа к данным. +2. Если по выданному варианту задана политика вытеснения Optimal, то необходимо + предоставить пользователю возможность подсказать page cache, когда будет + совершен следующий доступ к данным. Это можно сделать либо добавив параметр в + процедуры `read` и `write` (например, + `ssize_t lab2_read(int fd, void buf[.count], size_t count, access_hint_t hint)`), + либо добавив еще одну функцию в API (например, `int lab2_advice(int fd, off_t offset, access_hint_t hint)`). + `access_hint_t` в данном случае – это абсолютное время или временной интервал, + по которому разработанное API будет определять время последующего доступа к + данным. 3. Запрещено использовать высокоуровневые абстракции над системными вызовами. @@ -36,7 +53,8 @@ Отчет должен содержать: -1. титульный лист с указанием номера и названия ЛР, вашего ФИО, ФИО преподавателя практики, номера вашей группы, варианта ЛР; +1. титульный лист с указанием номера и названия ЛР, вашего ФИО, ФИО + преподавателя практики, номера вашей группы, варианта ЛР; 2. текст задания в соответствии с вариантом; diff --git a/lab/vtsh/README.md b/lab/vtsh/README.md index 02e9073..d97e407 100644 --- a/lab/vtsh/README.md +++ b/lab/vtsh/README.md @@ -1,51 +1,116 @@ # Базовый трек. Лабораторная работа 1 +## Введение + +Базовый пользовательский интерфейс операционной системы - это терминал, с его +помощью можно взаимодействовать с ОС, давать ей команды и запускать программы и +наблюдать результат их выполнения. А имея возможность запускать программы можно +расширить возможности данной ОС. В данной лабораторной работе вам предлагается +реализовать простую командную оболочку наподобие Bash вместе с несколькими +вспомогательными утилитами для проверки работоспособности разработанного +приложения и исследования поведения операцонной системы. + ## Часть 1. Запуск программ -Необходимо реализовать собственную оболочку командной строки - shell. Shell должен предоставлять пользователю возможность запускать программы на компьютере с переданными аргументами командной строки и после завершения программы показывать реальное время ее работы (подсчитать самостоятельно как «время завершения» – «время запуска»). +Необходимо реализовать собственную оболочку командной строки - shell. Shell +должен предоставлять пользователю возможность запускать программы на компьютере +с переданными аргументами командной строки и отображать время их выполнения +(расчитать как разность времени завершения и времени запуска). + +## Часть 2. Логические операторы + +В разработанное приложение командной оболочки необходимо добавить поддержку +логических операторов (аналогичных операторам из Bash) согласно выданному варианту: + +1. `&&` - логическое И (AND), +2. `||` - логическое ИЛИ (OR), +3. `;` - последовательное выполнение, +4. `&` - выполнение в фоне. + +## Часть 3. Анализ системы и мониторинг -## Часть 2. Мониторинг и профилирование +Разработайте комплекс программ-нагрузчиков согласно выданному варианту. +Каждый нагрузчик должен, как минимум, принимать параметр, который определяет +количество повторений для алгоритма, указанного в задании. Варианты программ +рассчитаны так, чтобы нагружать вычислительную подсистему (CPU) и подсистему +ввода-вывода (IO) или одновременно - это необходимо учитывать при их реализации. +Разработанные программы еобходимо скомпилировать без дополнительных опций +оптимизации компилятора. -Разработать комплекс программ-нагрузчиков по варианту, заданному преподавателем. Каждый нагрузчик должен, как минимум, принимать параметр, который определяет количество повторений для алгоритма, указанного в задании. Программы должны нагружать вычислительную систему, дисковую подсистему или обе подсистемы сразу. Необходимо скомпилировать их без опций оптимизации компилятора. +Проведите исследование поведения ОС во время исполнения разработанных +программ-нагрузчиков по следующему плану: -Перед запуском нагрузчика, попробуйте оценить время работы вашей программы или ее результаты (если по варианту вам досталось измерение чего либо). Постарайтесь обосновать свои предположения. Предположение можно сделать, основываясь на свой опыт, знания ОС и характеристики используемого аппаратного обеспечения. +1. Перед запуском нагрузчика, попробуйте оценить время работы вашей программы + или ее результаты (если по варианту вам досталось измерение чего либо) и + обоснуйте свои предположения. -1. Запустите программу-нагрузчик и зафиксируйте метрики ее работы с помощью инструментов для профилирования. Сравните полученные результаты с ожидаемыми. Постарайтесь найти объяснение наблюдаемому. +2. Запустите программу-нагрузчик и зафиксируйте метрики ее работы с помощью + инструментов для мониторинга и профилирования (см. лекции). Сравните полученные + результаты с ожидаемыми. Объяснените наблюдаемое поведение. Продолжительность + каждого запуска должна занимать достаточное для прекращения переходных + процессов время, по крайней мере, минуту. -2. Определите количество нагрузчиков, которое эффективно нагружает все ядра процессора на вашей системе. Как распределяются времена USER%, SYS%, WAIT%, а также реальное время выполнения нагрузчика, какое количество переключений контекста (вынужденных и невынужденных) происходит при этом? +3. Определите количество одновременно запущенных процессов с программой-нагрузчиком, + которое эффективно нагружает все ядра процессора в вашей системе. Как + распределяются показатели времени USER%, SYS%, WAIT%, а также полное время + выполнения нагрузчика, какое количество переключений контекста (вынужденных и + невынужденных) происходит при этом? Подумайте над тем, как вы определяете + эффективность. -3. Увеличьте количество нагрузчиков вдвое, втрое, вчетверо. Как изменились времена, указанные на предыдущем шаге? Как ведет себя ваша система? +4. Увеличьте количество нагрузчиков вдвое, втрое, вчетверо. Как изменились + исследуемые показатели? Почему? -4. Объедините программы-нагрузчики в одну, реализованную при помощи потоков выполнения, чтобы один нагрузчик эффективно нагружал все ядра вашей системы. Как изменились времена для того же объема вычислений? Запустите одну, две, три таких программы. +5. Объедините программы-нагрузчики в одну, реализованную при помощи потоков + выполнения, чтобы один нагрузчик эффективно нагружал все ядра вашей системы. Как + изменились показатели времени для того же объема вычислений? Запустите одну, + две, три таких программы. Как изменились исследуемые показатели? Почему? -5. Добавьте опции агрессивной оптимизации для компилятора. Как изменились времена? На сколько сократилось реальное время исполнения программы нагрузчика? +6. Скомпилируйте программу-нугрузчик с опцией агрессивной оптимизации. Как + изменились исследуемые показатели? На сколько сократилось реальное время + исполнения программы нагрузчика? Почему? ## Требования к реализации 1. Программа (комплекс программ) должна быть реализован на языке C. -2. Дочерние процессы должны быть созданы через заданные системные вызовы операционной системы, с обеспечением корректного запуска и и завершения процессов. Запрещено использовать высокоуровневые абстракции над системными вызовами. Необходимо использовать, процедуры libc. +2. Дочерние процессы должны быть созданы через указанные в варианте системные + вызовы операционной системы, с обеспечением корректного запуска и завершения + процессов. Запрещено использовать высокоуровневые абстракции над системными + вызовами. Необходимо использовать, процедуры libc. ## Требования к отчету и защите -1. Отчет должен содержать титульный лист с указанием номера и названия ЛР, вашего ФИО, ФИО преподавателя практики, номера вашей группы, варианта ЛР. +Отчет должен содержать: -2. Отчет должен содержать текст задания в соответствии с вариантом. +1. Титульный лист с указанием номера и названия ЛР, вашего ФИО, ФИО + преподавателя практики, номера вашей группы, варианта ЛР. -3. Отчет должен содержать листинг исходного кода всех программ, написанных в рамках данной ЛР. +2. Текст задания в соответствии с вариантом. -4. Отчет должен содержать предположения о свойствах программ-нагрузчиков +3. Листинг исходного кода всех программ, написанных в рамках данной ЛР. -5. Отчет должен содержать результаты измерений и метрик программ-нагрузчиков, полученных инструментами мониторинга. Должно быть описано, какие утилиты запускались, с какими параметрами и выводом. +4. Предположения о свойствах программ-нагрузчиков -6. Отчет должен содержать сравнительный анализ ожидаемых и фактических значений. +5. Результаты измерений и метрик программ-нагрузчиков, полученных инструментами + мониторинга. Должно быть описано, какие утилиты запускались, с какими + параметрами и их вывод. -7. Отчет должен содержать вывод. +6. Сравнительный анализ ожидаемых и фактических значений исследованных показателей. -8. Студент должен быть готов продемонстрировать работоспособность Shell и предоставить исходный код. +7. Заключение. + +Студент должен быть готов: + +1. Продемонстрировать работоспособность Shell и предоставить исходный код. + +2. Воспроизвести ход работы по исследованию поведения ОС и продемонстрировать схожие + результаты работы программ-нагрузчиков. + +3. Ответить на вопросы по реализации программ и контрольные вопросы. -9. Студент должен быть готов воспроизвести ход работы в рамках части 2 и продемонстрировать схожие результаты работы программ-нагрузчиков. ## Источники -- Тесты взяты из репозитория [sergey-v-galtsev/shad-os](https://gitlab.com/sergey-v-galtsev/shad-os/-/blob/master/bsh/test.py) +- Тесты взяты из репозитория [sergey-v-galtsev/shad-os][shad-os-tests] + +[shad-os-tests]: https://gitlab.com/sergey-v-galtsev/shad-os/-/blob/master/bsh/test.py \ No newline at end of file