Что это
В 2019 году я вёл курс ОС в НГУ. Это шпаргалка с примерными темами для разговора со студентами. Задачки здесь.
К сожалению, у меня не было времени написать шпаргалку для всех лаб, но до десятой добралось мало студентов. К тому времени они уже представляли, что я могу от них захотеть, поэтому делать домашние заготовки не было особого смысла.
Правила
- Cпрашиваю рандомные вопросы, поэтому лучше знать все ответы знать заранее.
- Курсивом выделено то, что я гарантированно спрошу у каждого.
- Список вопросов не полный. Как минимум, я могу попросить рассказать про любую функцию, переменную или тип в программе.
Задачи 1-4
- В заголовке заданий написано “SVR4”. Что это такое? Кто и когда это сделал? Почему это настолько знаменитая аббревиатура, что мы её изучаем в этом курсе?
- Что такое процесс? Более специфичный вопрос: если бы мне нужно было реализовать процессы, какая структура данных мне понадобилась бы? Какие у нее поля? Что такое контекст процесса? Рекомендую прочитать Anatomy of a Program in Memory.
- Что такое системный вызов?
- Что такое системный и пользовательский режим процессора? Как происходит переключение между ними? Более специфичный вопрос: что лежит на стеке и в регистрах в момент переключения между режимами?
- Где на файловой системе лежат исходники (Solaris или Linux), в которых перечислены все номера системных вызовов? Как можно вызвать системный вызов, если он реализован в ядре, а в библиотеке C обёртки его (ещё) нет?
- Что такое прерывание? Какие прерывания бывают? Зачем нужны приоритеты прерываний?
- Что такое errno, откуда берется её значение?
- Что такое реальный и эффективный идентификатор пользователя и группы? Зачем они нужны? Где они хранятся в памяти?
- Зачем процессу становиться лидером группы?
- Какие PID’ы бывают (какой смысл и значения у pid_t)? Зачем они нужны?
- Зачем нужно понятие “рабочей директории”?
- Какие лимиты в ulimit есть? Как их посмотреть в консоли? Как их поменять? И зачем их менять?
- Почему core-файл называется core? Что в нём? Почему он небольшой, ведь по логике он должен быть размером со всю виртуальную память? Как его использовать для отладки?
- Где в памяти лежат переменные среды? Откуда они берутся?
- Какая точность у time и localtime? Откуда ОС узнает о таймзонах? Где файлы с таймзонами на файловой системе? Кто их обновляет?
- Как работает sticky bit? Зачем он нужен? Какие ошибки бывают у setuid и как их вызвать? Как реализована программа chmod?
- Что такое виртуальная память? Как сделан malloc? Откуда берутся страницы для стека? Как сделан free? Что такое TLB? В кэшах процессора хранятся виртуальные или физические адреса? Что такое size_t?
- gets можно использовать?
Задачи 5-7
- Что такое файл? Что такое каталог?
- Какие атрибуты есть у файлов? Как файл хранится на диске? Что такое inode?
- Как примерно выглядит структура, описывающая файл в ядре? Что такое vnode?
- Что значит off_t?
- Что делает open()? Зачем нужен O_APPEND?
- Как примерно реализованы внутри read(), write()? Там внутри буферы какие-то, можно их отключить или настроить их размер? Зачем они нужны?
- Что делает close()? Меня интересуют шаги, которые эта функция делает. Что происходит, если мы не вызываем close(), а программа завершается?
- Как реализовать задачу №5 на бесконечном файле? Такие файлы вообще бывают?
- Можно ли реализовать read() и write() через mmap()? Зачем нужны анонимные маппинги? Какие флаги есть у mmap, что они все значат?
Задача 8
- В чём разница между допустимым и обязательным захватыванием?
- В чём разница между flock, lockf и fcntl для блокировки файлов?
- Придумайте пример, зачем в реальной жизни нужны блокировки файлов. Как насчёт того, чтобы не писать в своей программе код с flock(), а просто использовать уже готовую программу flock (man -s 1 flock)?
Задачи 9-11
- Какие шаги делает fork()? Какие данные у родителя и потомка общие, а какие свои? Как можно избежать полного копирования всей виртуальной памяти родителя при fork()?
- Какие шаги внутри делает exec()?
- Зачем нужен wait? В каком состоянии может быть процесс в любой момент своей жизни? Какую информацию может получить родитель о завершившемся потомке?
- Как процесс-потомок может передать код своего завершения родителю? Зачем нужны разные коды завершения?