Ответ
Процесс — это изолированный экземпляр выполняющейся программы, которому операционная система выделяет ресурсы.
Ключевые характеристики процесса:
- Изолированная память: Каждый процесс имеет собственное адресное пространство. Один процесс не может напрямую получить доступ к памяти другого.
- Ресурсы: ОС выделяет процессу память, файловые дескрипторы, процессорное время и т.д.
- Состояние: Процесс всегда находится в определенном состоянии (выполняется, ожидает, завершен).
В 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, а не напрямую ОС. Горутины работают поверх потоков ОС. Их создание очень дешево, а для взаимодействия используются каналы, что делает конкурентный код более безопасным.