Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Процесс: основная единица выполнения операционной системы
Процесс (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 версии) ✅ Микросервисная архитектура
❌ Обмен данными между части одной программы → используй потоки ❌ Частая синхронизация → используй потоки ❌ Лёгкие, быстрые операции → используй потоки
Понимание процессов критично для архитектуры масштабируемых систем и правильного использования системных ресурсов.