Де закінчується програма й починається машина
ВТФК · Системне програмування · 2026
Фокус: одна ідея — межа середовища виконання
Мотивація: чому це важливо саме зараз
Ілюзію «я сам на машині» підтримує ядро: планувальник і MMU
Усе це видно через каталог /proc/<pid>/
sleep 300 &
PID=$! # напр. 3101
cat /proc/$PID/status | head -5
cat /proc/$PID/maps | head -5
ls /proc/$PID/fd/proc — файлова проекція внутрішнього стану ядра для кожного процесу
| Файл | Що показує | Частина task_struct |
|---|---|---|
status | стан, PPID, пам'ять, UID/GID | стан, батько, облікові дані |
maps | регіони адресного простору і права | таблиця сторінок (mm) |
fd/ | відкриті дескриптори як символьні посилання | таблиця файлів |
cmdline | аргументи запуску | образ програми |
ns/ | простори імен процесу | → Лекція 2 |
cgroup | група керування ресурсами | → Лекція 2 |
Файли генеруються ядром «на льоту» при читанні — це не диск
cat /proc/$PID/maps
# приклад рядка:
# 55f2a1000000-55f2a1001000 r--p 00000000 08:01 123 /bin/sleep
# 7f9c4b000000-7f9c4b028000 r-xp 00000000 08:01 456 /lib/x86_64-linux-gnu/libc.so.6Кожен рядок — один регіон адресного простору: адреси, права rwx, файл-джерело
Так shell запускає кожну команду: ls, cat, docker
На демо покажіть: PID дитини той самий до і після execve — змінився лише вміст пам'яті
Два незалежні кроки замість одного «запустити програму» — дизайн Unix
strace -f -e trace=fork,vfork,clone,execve,wait4 bash -c "ls > /dev/null"Видно послідовність clone() (нова дитина) → execve() (заміна образу) → wait4() (батько чекає)
libc ховає syscalls за printf, malloc, fopen — але знизу завжди вони
strace -c ls > /dev/null
# short summary: скільки викликів read/write/openat/execve...strace показує реальний діалог програми з ядром
Очікувано: Студенти бачать: процес у ps — це рядок, а в /proc — цілий каталог зі структурою пам'яті й дескрипторів
| Сегмент | Вміст | Права | Росте |
|---|---|---|---|
| text | машинний код програми | r-x | — |
| data / bss | глобальні змінні | rw- | — |
| heap | malloc / new; brk, mmap | rw- | ↑ вгору |
| shared libs | libc.so та інші, через mmap | r-x | — |
| stack | локальні змінні, адреси повернення | rw- | ↓ вниз |
Ті самі регіони — рядки у /proc/<pid>/maps; права видно в другій колонці
Мета абстракції — не бути розпливчастим, а створити новий семантичний рівень, на якому можна бути абсолютно точним.
— Едсгер Дейкстра, «The Humble Programmer» (1972)
docker run --rm -it ubuntu:24.04 ps aux
# у контейнері PID 1 — це наш процес, а не системний init хостаАнонс Л2: той самий процес, інший PID-простір
🥚 У прикладах /proc фоновий процес має PID 3101 — шістнадцятково 0xC1D. Це не випадковість: таке число трапиться в курсі ще не раз.