Что такое процесс в Unix-подобных операционных системах?

Ответ

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

Каждый процесс обладает:

  • Изолированным адресным пространством: Память одного процесса недоступна для другого. Включает в себя:
    • Сегмент кода (Text): Исполняемый код программы.
    • Сегмент данных (Data): Глобальные и статические переменные.
    • Куча (Heap): Динамически выделяемая память.
    • Стек (Stack): Локальные переменные, параметры функций и адреса возврата.
  • Системными ресурсами: Набор открытых файлов, сетевых соединений (сокетов).
  • Контекстом выполнения: Состояние регистров процессора, счетчик команд и другая информация, необходимая для выполнения.
  • Уникальным идентификатором (PID) и идентификатором родительского процесса (PPID).

Процессы создаются системным вызовом fork(), который создает точную копию родительского процесса, и exec(), который заменяет образ процесса на новую программу. В Go это абстрагировано в пакете os/exec.

package main

import (
    "fmt"
    "os/exec"
    "time"
)

func main() {
    // Создаем новый процесс, который выполнит команду 'ls -l'
    cmd := exec.Command("ls", "-l")

    // Запускаем процесс и ждем его завершения
    output, err := cmd.Output()
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    fmt.Printf("Process with PID %d finished.nOutput:n%s", cmd.Process.Pid, string(output))
}

Ключевое отличие от потока (thread): Потоки выполняются в рамках одного процесса и разделяют его адресное пространство, что делает коммуникацию между ними быстрее, но менее безопасной. Процессы полностью изолированы.