Что происходит, когда приложение запускается?
Когда приложение запускается, распределитель инициализирует себя. Вы можете сделать это при первом обращении к своему распределителю, если хотите.
А как allocator обнаруживает, что кучи уже созданы?
Я не уверен, что следую за вопросом. Если вы говорите о кучах, которые управляются кодом, который использует этот самый распределитель, то он узнает, потому что он создает записи отслеживания при создании куч. Если вы говорите о кучах в других процессах или созданы другими распределителями, это не волнует, так как они все равно не могут использовать эти кучи.
Как allocator создает, хранит и уничтожает (при закрытии приложения) кучи?
Как правило, у вас есть низкоуровневый и высокоуровневый распределитель. Низкоуровневый распределитель просто получает необработанные фрагменты памяти от операционной системы. Точный механизм зависит от платформы. Распределитель верхнего уровня управляет кучами, и он получает память для хранения структур кучи от распределителя низкого уровня.
Когда вызывается функция, как узнать, в каком потоке (или на каком процессоре) она работает?
Вы можете узнать, в каком потоке есть данные, специфичные для потока, или вызвав специфичную для платформы функцию «получить идентификатор потока». Что касается того, какой процессор, это очень зависит от платформы, и информация может устареть к тому времени, когда вы получаете его. У большинства платформ такая функция есть - просто помните, что вы можете использовать ее только в качестве оптимизации (для уменьшения конкуренции за блокировку или для повышения частоты попаданий в кэш). Важно, что вы не можете использовать его для обхода блокировки, потому что поток может перемещаться с одного процессора на другой в любое время.
Честно говоря, распределение памяти, которое обеспечивает хорошую производительность и является переносимым на разные платформы, на самом деле представляет собой сложную задачу. Если вы не являетесь экспертом в этой области, очень маловероятно, что вы сможете разработать распределитель, обеспечивающий производительность и стабильность, необходимые для производственного приложения.