Ответ
Процесс — это экземпляр выполняемой программы, которому операционная система выделяет и управляет ресурсами. Это больше, чем просто код: это активная сущность со своим состоянием, включающая исполняемый код, данные, стек, регистры процессора, информацию об открытых файлах и другие ресурсы ОС.
Ключевые атрибуты процесса в Linux/Unix:
- PID (Process ID): Уникальный числовой идентификатор.
- Изолированное адресное пространство: Память одного процесса защищена от доступа другого процесса (если не используется разделяемая память).
- Контекст выполнения: Состояние регистров CPU, указатель стека, состояние программы (выполняется, ожидает и т.д.).
- Ресурсы: Открытые файловые дескрипторы, переменные окружения, права доступа (UID/GID).
Создание процесса в C/C++ (системный вызов fork()):
#include <unistd.h> // для fork()
#include <sys/wait.h> // для wait()
#include <iostream>
int main() {
pid_t pid = fork(); // Создаёт почти полную копию родительского процесса
if (pid == -1) {
std::cerr << "Fork failed!" << std::endl;
return 1;
} else if (pid == 0) {
// Код выполняется в ДОЧЕРНЕМ процессе
std::cout << "Child process. My PID: " << getpid() << ", Parent PID: " << getppid() << std::endl;
// Дочерний процесс может выполнить другую программу с помощью exec()
// execlp("ls", "ls", "-l", nullptr);
} else {
// Код выполняется в РОДИТЕЛЬСКОМ процессе
std::cout << "Parent process. My PID: " << getpid() << ", Child PID: " << pid << std::endl;
int status;
wait(&status); // Ожидание завершения дочернего процесса
std::cout << "Child process finished." << std::endl;
}
return 0;
}
Процесс vs. Поток (Thread):
- Процесс — тяжёлая, изолированная единица выполнения с собственной памятью. Создание и переключение контекста дорого.
- Поток — лёгкая единица выполнения внутри процесса. Потоки одного процесса разделяют адресное пространство и ресурсы, что упрощает обмен данными, но требует синхронизации (мьютексы, семафоры).