Пробный экзамен
Как проходить
Это контрольная на новых данных: те же типы вопросов, что на экзамене, но с другими сигналами, параметрами и кодом. Так видно, поняли вы метод или запомнили ответы.
- Поставьте таймер на 60 минут. На настоящем экзамене задач 8, рассчитывайте примерно 10 минут на задачу.
- Решайте задания по порядку без возврата к урокам. Черновик для задач 7 и 8 — на бумаге.
- После проверки откройте пояснения и найдите урок, где разбирается тема ошибки.
Чек-лист перед экзаменом
- 1. Сигналы: A — исключения процессора; B — Stop; C — посылают явно; D — только KILL и STOP; E — Ign; F — только RT. Спорное поясняйте.
- 2. Уровни: кто выполняет (железо / ядро / процесс) и с чем работает. По две фразы на пункт.
- 3. fork и потоки: task_struct, PID, копия дескрипторов, COW, 0 и PID. Потоки — clone с общими ресурсами. init — setsid, kill(-pgid), utmp.
- 4. VFS: единый интерфейс, монтирование, таблицы операций. Поля inode — атрибуты, связи, состояние. Жёсткая ссылка — EXDEV.
- 5. A/D: ставит MMU, читает и сбрасывает ядро. A — страничный демон (часы), D — нужно ли писать на диск.
- 6. Пакеты: pre/post-install — то, что не описать файлами. Reinstall — восстановить файлы и перезапустить скрипты; изменённые конфиги сохраняются.
- 7. TLB: обращения итерации → страницы (min/max) → помещаются ли в TLB → промахи × уровни + чтения указателей.
- 8. fork + shm: нарисуйте дерево, посчитайте counter и писателей, найдите гонки и что ждёт wait. Исправление: семафоры в Mem с pshared = 1, очередь писателей, без взаимоблокировки с wait.
Разборы задач экзамена
Если в каком-то задании ошибка — откройте соответствующий урок этого модуля: «Разбор задачи 1» (сигналы), «Разбор задачи 2» (уровни), «Разбор задач 3 и 4», «Разбор задач 5 и 6», «Разбор задачи 7» (TLB) и «Разбор задачи 8» (fork и разделяемая память).
Последний совет
На экзамене почти в каждой задаче написано «ответ поясните». Короткое правильное объяснение с названными предположениями ценится выше голого числа или знака — особенно в задачах 1, 2 и 7, где в спорных местах верных ответов несколько.
Удачи на экзамене!
Практика решено 0 из 11
1. Заполните таблицу для других сигналов.
| Связан с аппаратным событием | Останавливает процесс | Выставляется по инициативе программиста | Нельзя запретить доставку | По умолчанию игнорируется | Не «слипается» | |
|---|---|---|---|---|---|---|
| SIGSEGV | ||||||
| SIGTSTP | ||||||
| SIGURG | ||||||
| SIGRTMAX | ||||||
| SIGILL | ||||||
| SIGQUIT | ||||||
| SIGTTOU | ||||||
| SIGWINCH | ||||||
| SIGUSR1 |
2. Отнесите компоненты к уровням вычислительной системы.
| Аппаратура | Упр. физическими ресурсами | Упр. логическими ресурсами | Системы программирования | Прикладные системы | |
|---|---|---|---|---|---|
| MMU | |||||
| Планировщик процессов ядра | |||||
| Компоновщик ld | |||||
| Файл /proc/self/maps | |||||
| Обработчик страничного отказа | |||||
| Почтовый сервер postfix |
3. Что верно про fork и потоки?
4. ln /mnt/usb/file.txt ~/file.txt при флешке, смонтированной в /mnt/usb, выдаёт «Invalid cross-device link». Почему?
5. У страницы A = 0, D = 1. Что сделает страничный демон, выбрав её жертвой?
6. Администратор случайно удалил /etc/ssh/sshd_config и сделал apt install --reinstall openssh-server. Восстановится ли файл?
7. Таблицы страниц 3-уровневые, страница 256 байт, TLB на 2 записи (LRU, вначале пуст).
extern int *a; (указатель лежит не на страницах массива), int — 4 байта, register int i, sum;
for (i = 0; i < 100; i++) sum += a[i];
Каково минимальное число служебных обращений (обращения к таблицам страниц + чтения указателя)? (число)
7 (продолжение). А максимальное? (число)
8. Сколько процессов (включая исходный) создаст программа, если все fork успешны?
for (int i = 0; i < 3; i++)
if (fork() == 0)
mem->counter++; /* mem — MAP_SHARED */
8 (продолжение). Какое значение counter может оказаться в конце (начальное 0)?
| Возможно | Невозможно | |
|---|---|---|
| 7 | ||
| 5 | ||
| 8 |
8 (исправление). Какие средства исправят гонку на mem->counter в этой программе?
| Исправит | Не исправит | |
|---|---|---|
sem_t в Mem, sem_init(&mem->s, 1, 1), wait/post вокруг counter++ |
||
Глобальная переменная sem_t s с sem_init(&s, 0, 1) |
||
__atomic_fetch_add(&mem->counter, 1, __ATOMIC_SEQ_CST) |
||
Объявить поле volatile unsigned int counter |
||
| Мьютекс в Mem с атрибутом PTHREAD_PROCESS_SHARED |
Войдите, чтобы отмечать пройденные уроки.