Вообще говоря, ОС выделяет задаче (процессу) память при запуске этой задачи. В дальнейшем некоторые ОС могут выделять дополнительную память по запросам задачи (как правило, это возможно лишь в системах с виртуальной памятью, хотя есть и исключения). Однако постоянное использование функций ОС для получения-освобождения блоков памяти для нужд задачи нецелесообразно из-за больших накладных расходов, особенно на более-менее современных процессорах. Поэтому подпрограмма инициализации задачи (которая получает управление сразу после запуска задачи) в числе прочих действий обычно создаёт для задачи свою собственную кучу, и к ОС обращается лишь при её исчерпании (естественно, в системах, где ОС может выделить дополнительную память -- например, в Винде).
Естественно, чтобы куча могла быть инициализирована самой задачей (её стартовым кодом), ОС должна передать тем или иным способом необходимую для этого информацию. Одним из вариантов является создание кучи в виде программной секции прямо в загрузочном модуле (в ELF, например; причём сама секция может быть пустой -- скажем, иметь атрибут, указывающий, что память для неё должна быть зарезервирована, но не заполнена каким-то значением или же заполнена нулями); тогда загрузчик ОС выделит память в т.ч. и под эту секцию, а внутри своего кода задача может ссылаться на имя этой секции, чтобы получить её адрес. Но, понятно, это не единственная возможная в теории схема.
Системная куча используется для выделения блоков для нужд системы, даже если эти блоки необходимы системе для обслуживания запросов задачи. Скажем, если задача запускает операцию ввода-вывода, надо создать некий блок, в котором ОС сохранит всю информацию для этой операции (адреса и размеры буферов, код функции ввода-вывода, ссылка на задачу, которая запросила операцию, и др.). Поскольку память не резиновая, система должна как-то ограничивать аппетиты задач на такие блоки памяти -- т.е. иметь некие квоты, при превышении которых запросы задачи перестают выполняться.
ADD. А защита памяти обеспечивается просто: новая память выделяется лишь для адресного пространства запросившей её задачи. В частности, если используется виртуальная память, то выделенные страницы будут доступны только через таблицы переадресации для данной задачи, но не для других задач.
|