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