Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое процесс?
Процесс — это экземпляр программы, находящийся в состоянии выполнения в операционной системе. Это не просто код программы, а активный субъект, который имеет собственное адресное пространство, системные ресурсы и состояние.
Основные компоненты процесса
Процесс включает:
- Адресное пространство памяти (код, данные, стек, куча)
- Идентификатор процесса (PID) — уникальный номер в системе
- Таблицу открытых файлов (файловые дескрипторы)
- Переменные окружения и аргументы командной строки
- Регистры процессора и счётчик команд
- Приоритет и расписание выполнения
- Информацию о владельце (UID, GID)
Жизненный цикл процесса
Процесс может находиться в состояниях:
- Ready — готов к выполнению, ждёт CPU
- Running — выполняется на процессоре
- Waiting — ожидает события (I/O, сигнал)
- Zombie — завершился, но родитель не прочитал статус
- Terminated — полностью удалён из системы
Различие между процессом и программой
- Программа — пассивный объект (файл на диске с инструкциями)
- Процесс — активный объект (программа, запущённая в памяти)
- Одна программа может породить множество процессов
Создание процессов в C++
#include <unistd.h>
#include <sys/wait.h>
#include <iostream>
int main() {
pid_t pid = fork();
if (pid < 0) {
std::cerr << "fork() failed" << std::endl;
return 1;
}
else if (pid == 0) {
// Дочерний процесс
std::cout << "Child: PID = " << getpid()
<< ", Parent PID = " << getppid() << std::endl;
execvp("ls", (char *[]{"ls", "-la", nullptr}));
}
else {
// Родительский процесс
std::cout << "Parent: PID = " << getpid()
<< ", Child PID = " << pid << std::endl;
int status;
waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
std::cout << "Child exited: " << WEXITSTATUS(status) << std::endl;
}
}
return 0;
}
Демон-процесс (Daemon)
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
void daemonize() {
pid_t pid = fork();
if (pid < 0) exit(1);
if (pid > 0) exit(0);
setsid(); // Новая сессия
chdir("/"); // Сменить директорию
int fd = open("/dev/null", O_RDWR);
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
close(fd);
signal(SIGHUP, SIG_IGN);
}
Отличие от многопоточности
| Аспект | Процесс | Поток |
|---|---|---|
| Адресное пространство | Отдельное | Общее |
| Создание | Медленное | Быстрое |
| Обмен данными | IPC | Общая память |
| Безопасность | Изолированы | Требует синхро |
| Контекст | Тяжелое переключение | Легче |
Управление ресурсами процесса
#include <sys/resource.h>
struct rlimit limit;
getrlimit(RLIMIT_NOFILE, &limit);
std::cout << "Max files: " << limit.rlim_max << std::endl;
getrlimit(RLIMIT_AS, &limit);
std::cout << "Max memory: " << limit.rlim_max << std::endl;
Иерархия процессов
Процессы в системе образуют дерево: процесс может запустить дочерние процессы, которые становятся его потомками. Корневой процесс — init (PID 1). Каждый процесс знает своего родителя (PPID).
Процессы — фундаментальная абстракция ОС для изоляции и управления выполняемым кодом.