Что такое процесс
Процесс - это выполняющийся экземпляр программы. У него есть:
- PID (Process ID) - уникальный числовой идентификатор
- PPID (Parent PID) - кто его породил
- UID/GID - от чьего имени работает (см. file-permissions)
- Виртуальное адресное пространство - heap, stack, mmap'ы, общие библиотеки
- Открытые файловые дескрипторы (
/proc/<pid>/fd/*) - Текущий рабочий каталог (cwd)
- Контроллер группы (cgroups) и набор namespaces - что он видит
fork + exec
Новый процесс в Linux всегда создаётся одной из этих пар системных вызовов:
fork()- клонировать текущий процесс. Получаем дочерний с тем же кодом и состоянием, но новым PIDexec*()- заменить в текущем процессе код+данные на содержимое бинаря; PID сохраняется
Так шелл запускает команду: fork() → дочерний процесс делает exec("/bin/ls").
Родитель ждёт через wait().
Дерево процессов
Все процессы - потомки одного: PID 1 (init, на современных системах это
systemd). Если родитель умрёт раньше потомка, потомок «усыновляется» PID 1.
systemd
├─ sshd
│ └─ sshd: alice@pts/0
│ └─ bash
│ └─ vim
├─ docker
└─ ...
/proc/<pid> - анатомия процесса
В Linux каждый живой процесс - это директория /proc/<pid>/:
cmdline- что было в argvexe→ symlink на бинарьcwd→ symlink на CWDfd/- все открытые файловые дескрипторы (как symbolic-link на цели)status- карточка с метаданными (UID, threads, memory)cgroup- в каком cgroup'е находится процессns/- какие namespaces видит
Состояния процесса
- R (Running/Runnable) - на CPU или в очереди ожидания CPU
- S (Sleeping) - ждёт события (interruptible: можно прервать сигналом)
- D (Uninterruptible Sleep) - ждёт I/O в kernel-mode, нельзя прервать. Высокая доля D обычно значит проблемы с диском/NFS, и она тянет load-average вверх
- Z (Zombie) - завершился, но родитель ещё не сделал
wait()- занимает PID но не RAM - T (Stopped) - приостановлен сигналом SIGSTOP или Ctrl+Z