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

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

1.2 Junior🔥 61 комментариев
#Другое#Основы Java

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

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

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

Процесс: основная единица выполнения операционной системы

Процесс (Process) — это независимо выполняющаяся программа с собственным адресным пространством памяти, ресурсами и состоянием. Это основная единица управления в операционной системе (ОС).

Определение и основные характеристики

Каждый процесс имеет:

1. Собственное адресное пространство памяти

Процесс A          Процесс B          Процесс C
┌──────────┐      ┌──────────┐      ┌──────────┐
│ Stack    │      │ Stack    │      │ Stack    │
├──────────┤      ├──────────┤      ├──────────┤
│ Heap     │      │ Heap     │      │ Heap     │
├──────────┤      ├──────────┤      ├──────────┤
│ Data     │      │ Data     │      │ Data     │
├──────────┤      ├──────────┤      ├──────────┤
│ Code     │      │ Code     │      │ Code     │
└──────────┘      └──────────┘      └──────────┘

Каждый процесс полностью изолирован от других процессов
Один процесс НЕ может доступиться к памяти другого процесса напрямую

2. Process ID (PID) — уникальный идентификатор

# Linux/macOS
ps aux  # Показать все процессы и их PID

# Java
long pid = ProcessHandle.current().pid();
System.out.println("Current process ID: " + pid);

3. Состояние процесса

┌──────────────────────────────────────────────┐
│  RUNNING                                     │
│  (процесс активно выполняется)              │
└────────┬────────────────────────────┬────────┘
         │                            │
    Блокирует                    Переключение
    на I/O                       контекста
         │                            │
         v                            v
┌──────────────────┐        ┌──────────────────┐
│   WAITING        │        │   READY          │
│   (ждёт данных)  │        │ (ждёт CPU)       │
└──────────────────┘        └──────────────────┘
         │                           ^
         └───────────────────────────┘
         I/O завершён / CPU доступен

Процесс vs Поток (Thread)

┌─────────────────────────────────────────────────────────────┐
│                    Процесс (Process)                        │
├──────────────────────────┬──────────────────────────────────┤
│   Thread 1               │   Thread 2                       │
│ ┌────────────────────┐   │ ┌────────────────────┐           │
│ │ Stack              │   │ │ Stack              │           │
│ │ Program Counter    │   │ │ Program Counter    │           │
│ │ Registers          │   │ │ Registers          │           │
│ └────────────────────┘   │ └────────────────────┘           │
├──────────────────────────┼──────────────────────────────────┤
│  Общие ресурсы процесса                                     │
│  ┌─────────────────────────────────────────┐                │
│  │ Heap (общая память)                     │                │
│  │ File Descriptors                        │                │
│  │ Environment Variables                   │                │
│  │ Signal Handlers                         │                │
│  └─────────────────────────────────────────┘                │
└─────────────────────────────────────────────────────────────┘

Разница:

Процесс                          | Поток
---------------------------------+--------------------------------
Независимое адресное пространство| Общее адресное пространство
Тяжёлый (дорого создавать)      | Лёгкий (быстро создавать)
Полная изоляция                  | Общие ресурсы (риск race conditions)
Переключение контекста медленно  | Переключение контекста быстро

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

// Создание подпроцесса из Java
public class ProcessExample {
    public static void main(String[] args) throws IOException {
        // Создание процесса (например, запуск команды ОС)
        Process process = new ProcessBuilder("/bin/sh", "-c", "echo Hello World")
            .start();
        
        // Получение вывода
        try (InputStream input = process.getInputStream()) {
            String output = new String(input.readAllBytes());
            System.out.println("Output: " + output);
        }
        
        // Ожидание завершения процесса
        int exitCode = process.waitFor();
        System.out.println("Exit code: " + exitCode);
        // 0 = успешно
        // 1+ = ошибка
    }
}

// Жизненный цикл:
// 1. CREATED (создан, но не запущен)
// 2. RUNNING (выполняется)
// 3. TERMINATED (завершён с кодом выхода)

Управление процессами ОС

# Linux/macOS команды

# Показать все процессы
ps aux
ps -ef

# Показать процессы Java
jps          # JVM Process Status
jps -l       # С полными названиями классов
jps -m       # С аргументами

# Мониторинг процесса
top          # Real-time процессы и ресурсы

# Убить процесс
kill -9 <PID>

# Показать процесс по названию
pgrep java

# Мониторинг памяти процесса
/usr/bin/time -v java -jar app.jar

Ресурсы процесса

// Информация о текущем процессе
public class ProcessInfoExample {
    public static void main(String[] args) {
        ProcessHandle currentProcess = ProcessHandle.current();
        
        // ID процесса
        System.out.println("PID: " + currentProcess.pid());
        
        // Информация о процессе
        ProcessHandle.Info info = currentProcess.info();
        System.out.println("Command: " + info.command());
        System.out.println("User: " + info.user());
        System.out.println("Total CPU time: " + info.totalCpuDuration());
        System.out.println("Start time: " + info.startInstant());
        
        // Runtime информация (неточная, но быстрая)
        Runtime runtime = Runtime.getRuntime();
        long usedMemory = runtime.totalMemory() - runtime.freeMemory();
        System.out.println("Used memory: " + (usedMemory / 1024 / 1024) + " MB");
        System.out.println("Available processors: " + runtime.availableProcessors());
    }
}

Контекст переключения (Context Switching)

Время →
┌─────────────────┬─────────────────┬─────────────────┐
│  Процесс A      │  Процесс B      │  Процесс A      │
│  работает       │  работает       │  работает       │
├─────────────────┼─────────────────┼─────────────────┤
    Переключение     Переключение
    контекста        контекста
    
    ОС сохраняет:                ОС восстанавливает:
    - Stack pointer              - Stack pointer
    - Registers                  - Registers
    - PC (Program Counter)       - PC
    - Memory management          - Memory management

Inter-Process Communication (IPC)

// Процессы могут общаться через:

// 1. Pipes (конвейеры)
// command1 | command2

// 2. Sockets
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();

// 3. Message Queues (RabbitMQ, Kafka)
publisher.sendMessage("topic", "message");

// 4. Shared Memory (осторожно!)
// Обычно через управляемые механизмы (Redis, Database)

// 5. Files
FileWriter writer = new FileWriter("/tmp/process_communication.txt");
writer.write("message");

Типы процессов в Java приложении

// JVM — это один процесс
// JVM может запустить другие процессы

public class MultiProcessExample {
    public static void main(String[] args) throws Exception {
        // Запуск другого Java процесса
        ProcessBuilder pb = new ProcessBuilder(
            "java",
            "-cp", "./lib/*",
            "com.example.Worker"
        );
        
        Process worker1 = pb.start();
        Process worker2 = pb.start();
        Process worker3 = pb.start();
        
        // Три независимых процесса
        // Каждый имеет собственную JVM, Heap, GC
    }
}

Когда использовать процессы

✅ Запуск внешних программ (shell commands, python scripts) ✅ Разделение нагрузки между машинами ✅ Полная изоляция (например, sandbox) ✅ Разные версии runtime (разные JVM версии) ✅ Микросервисная архитектура

❌ Обмен данными между части одной программы → используй потоки ❌ Частая синхронизация → используй потоки ❌ Лёгкие, быстрые операции → используй потоки

Понимание процессов критично для архитектуры масштабируемых систем и правильного использования системных ресурсов.

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