1
0
Jelajahi Sumber

Добавить 'Лекции/Go/Попков'

u20kovalev_den 1 Minggu lalu
induk
melakukan
457cc4cd25
1 mengubah file dengan 20 tambahan dan 0 penghapusan
  1. 20 0
      Лекции/Go/Попков

+ 20 - 0
Лекции/Go/Попков

@@ -0,0 +1,20 @@
+# Лекция 1: Управление памятью в Go: архитектура, эвакуация и влияние на latency
+
+Управление памятью в компилируемых языках программирования традиционно требовало либо ручного контроля (malloc/free), либо значительных накладных расходов на сборку мусора (GC). Язык **Go** (Golang) предлагает компромиссное решение: автоматическое управление памятью с **неблокирующим конкурентным сборщиком мусора**, спроектированным для минимизации задержек (latency) в высоконагруженных системах.
+
+Ключевая архитектурная особенность — это разделение кучи (heap) на области, управляемые потокобезопасными кэшами (mcache). Каждый поток выполнения (P в терминах планировщика Go) имеет свой локальный кэш мелких объектов. Это реализует принцип **безлоковой аллокации**: выделение памяти под микрообъекты происходит простым увеличением указателя в пределах локальной страницы, без захвата глобальных блокировок мьютексов.
+
+![Изображение: схема иерархии памяти Go (mcache, mcentral, mheap). Ключевые слова для поиска: "Go memory allocation diagram mcache mheap"]()
+
+### Таблица 1. Уровни аллокации памяти в Go
+| Компонент | Уровень | Область видимости | Механизм синхронизации |
+| -------- | -------- | -------- | -------- |
+| **mcache** | Поток (P) | Локальный кэш | Без блокировок (lock-free) |
+| **mcentral** | Глобальный | Список для размера класса | Мьютексы (при балансировке) |
+| **mheap** | Глобальный | Вся куча (arena) | Мьютексы (при запросе у ОС) |
+
+Сборщик мусора реализует **трехцветный алгоритм пометки и заметания (mark-and-sweep)** и работает конкурентно с основным кодом. Однако ключевая фаза — **фаза остановки мира (Stop The World)** — сведена к минимуму и происходит только для начала цикла и для завершающей пометки. Инженеру важно понимать концепцию **эвакуации (evacuation)** — хотя в стандартном GC Go нет явной эвакуции объектов как в поколенческих сборщиках, есть процесс **фрагментации кучи**. Чтобы избежать деградации производительности, Go периодически выполняет дефрагментацию, перемещая или подчищая страницы, что может вызвать микро-паузы.
+
+Для снижения нагрузки на GC разработчики применяют **пулы объектов (sync.Pool)**. Использование sync.Pool позволяет переиспользовать уже выделенные структуры, снимая нагрузку со сборщика мусора и уменьшая количество аллокаций в куче. Это критически важно для приложений реального времени (например, прокси-серверов или API Gateway), где каждая миллисекунда задержки на счету.
+
+Таким образом, эффективная работа с памятью в Go требует не только понимания синтаксиса, но и осознанного управления аллокациями: предпочтение стека перед кучей (благодаря анализу побега — escape analysis), переиспользование временных буферов и учет поведения конкурентного GC.