← Назад к вопросам

Что такое процесс?

1.0 Junior🔥 252 комментариев
#Linux и операционные системы

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое процесс?

Процесс — это экземпляр программы, находящийся в состоянии выполнения в операционной системе. Это не просто код программы, а активный субъект, который имеет собственное адресное пространство, системные ресурсы и состояние.

Основные компоненты процесса

Процесс включает:

  • Адресное пространство памяти (код, данные, стек, куча)
  • Идентификатор процесса (PID) — уникальный номер в системе
  • Таблицу открытых файлов (файловые дескрипторы)
  • Переменные окружения и аргументы командной строки
  • Регистры процессора и счётчик команд
  • Приоритет и расписание выполнения
  • Информацию о владельце (UID, GID)

Жизненный цикл процесса

Процесс может находиться в состояниях:

  1. Ready — готов к выполнению, ждёт CPU
  2. Running — выполняется на процессоре
  3. Waiting — ожидает события (I/O, сигнал)
  4. Zombie — завершился, но родитель не прочитал статус
  5. 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).

Процессы — фундаментальная абстракция ОС для изоляции и управления выполняемым кодом.