Самый простой вариант управления памятью — отсутствие диспетчера памяти и возможность загружать в системе только один процесс. Именно так работают СР/М и RT-11 SJ (Single-Job, однозадачная). В этих системах программы загружаются с фиксированного адреса prog_start. В СР/М это 0x100; в RT-11— 01000. По адресам от 0 до начала программы находятся векторы прерываний, а в RT-11— также и стек программы. Операционная система размещается в старших адресах памяти. Адрес sys_start, с которого она начинается, зависит от количества памяти у машины и от конфигурации ОС.
В этом случае управление памятью со стороны системы состоит в том, что загрузчик проверяет, поместится ли загружаемый модуль в пространство от prog_start до sys_start. Если объем памяти, который использует программа, не будет меняться во время ее исполнения, то на этом все управление и заканчивается.
Однако программа может использовать динамическое управление памятью, например функцию malloc о или что-то в этом роде. В этом случае уже код malloc должен следить за тем, чтобы не залезть в системные адреса. Как правило, динамическая память начинает размещаться с адреса prog_end = prog_start + prog_size. prog_size в данном случае обозначает полный размер программы, т. е. размер ее кода, статических данных и области, выделенной под стек.
Функция malloc поддерживает некоторую структуру данных, следящую за тем, какие блоки памяти из уже выделенных были освобождены. При каждом новом запросе она сначала ищет блок подходящего размера в своей структуре данных и, только когда этот поиск завершится неудачей, просит новый участок памяти у системы. Для этого используется переменная, которая в библиотеке языка С называется brk_addr.