← На главную

Как в ранних версиях Unix управляли памятью

04.11.2026 07:37 · hackernews

Автор изучил исходный код ранних версий Unix и проследил, как менялись способы выделения памяти на C. Начальной точкой стала четвёртая версия системы 1973 года, где большая часть ядра уже была написана на C. Лента с её исходниками, долго считавшаяся утраченной, была обнаружена в 2025 году.

В компиляторе V4 использовался простой линейный аллокатор. Он выравнивал размер запроса, при необходимости расширял кучу через sbrk() и возвращал прежний указатель на свободную область. При нехватке памяти программа завершалась, поэтому вызывающему коду не требовалось проверять результат на NULL. Освобождать отдельные объекты не было нужды: память существовала до конца работы процесса, а sbrk() не делал прежние указатели недействительными.

Отдельный malloc.c из каталога Денниса Ритчи содержал функции malloc() и mfree() с интерфейсом, отличным от современного. Первым аргументом они получали карту ресурса: coremap для оперативной памяти или swapmap для области подкачки. При освобождении также передавался размер блока. По комментарию Джона Лайонса к V6, карты хранили упорядоченные по адресу свободные участки, использовали стратегию first-fit и объединяли соседние блоки. Автор отмечает, что явные области позволяли разделять ресурсы и ограничивать потребление стороннего кода, хотя исходной причиной такого устройства, вероятно, были ограничения оборудования.

В ранней реализации diff из V6 встретился другой приём: после временного выделения памяти указатель области откатывался назад, фактически освобождая сразу весь хвост арены. В V7 появились макрос ALLOC, скрывающий sizeof, и galloc() со сборкой мусора. В V8 использовались макросы new(), похожие на современный синтаксический сахар, а Cfront уже связывал оператор new с C++ и Simula.

Поздние программы всё же преимущественно вернулись к прямым вызовам malloc() с ручным вычислением размеров и проверками. Автор осторожно объясняет это простыми временами жизни объектов, нехваткой памяти без виртуальной памяти и желанием упростить интерфейс. Он подчёркивает, что это предположения, а не установленная история. В завершение приводится совет П. Дж. Плогера группировать данные с похожим временем жизни и освобождать их вместе, уменьшая фрагментацию кучи.

Читать оригинал →