Что такое процесс и как с ним работать в Go?

Ответ

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

Ключевые характеристики процесса:

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

В Unix-подобных системах процессы традиционно создаются через системные вызовы fork() (создание точной копии родительского процесса) и exec() (замена выполняемой программы в текущем процессе на новую).

Работа с процессами в Go

В Go для управления внешними процессами используется пакет os/exec. Он предоставляет удобную абстракцию для запуска команд.

package main

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

func main() {
    // Создание команды для выполнения `ls -la`
    cmd := exec.Command("ls", "-la")

    // Запуск команды и получение её вывода (stdout)
    // Output = Start + Wait
    output, err := cmd.Output()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(output))
}

Процесс vs Поток (Thread) vs Горутина

  • Процесс: Тяжеловесный, изолированная память. Сбой одного процесса обычно не влияет на другие. Взаимодействие между процессами (IPC) сложное (пайпы, сокеты, общая память).
  • Поток: Легковеснее процесса, потоки одного процесса разделяют общее адресное пространство. Сбой одного потока может обрушить весь процесс. Взаимодействие простое (через общую память).
  • Горутина (в Go): Сверхлегковесный "поток", управляемый рантаймом Go, а не напрямую ОС. Горутины работают поверх потоков ОС. Их создание очень дешево, а для взаимодействия используются каналы, что делает конкурентный код более безопасным.