Когда используется операционная система защищенного режима (например, Windows или Linux), каждый процесс имеет целую кучу страниц памяти, доступных для данного процесса. Если требуется больше памяти, больше страниц может быть выгружено.
Как правило, процесс разделяет предоставленную ему память на две части. Один - это куча, а другой - стек. Нижняя часть стека обозначается указателем стека r13 на руке и esp на x86. Когда кто-либо создает переменную в стеке, указатель стека перемещается, чтобы учесть необходимое дополнительное пространство. Это делается инструкцией ассемблера PUSH. Точно так же, когда переменная выходит из области видимости, она выводится из стека.
Обычно PUSH приводит к уменьшению указателя стека, оставляя значение выше значения указателей стека "в стеке".
Другая часть памяти может использоваться для кучи. Это тогда доступно для распределения с использованием malloc или new. Каждый поток должен иметь свой собственный стек, но может совместно использовать кучу с другими потоками в процессе.
Когда ядро перепланирует поток, оно сохраняет регистр стека и изменяет регистр стека на новый стек. если может или не нужно хранить счетчик программы в зависимости от того, как это планирование.
Кеш не имеет ничего общего ни со стеком, ни с кучей. Он управляется процессором и обеспечивает способ гарантировать, что данные, необходимые для ЦП, находятся под рукой, так что ему не нужно ждать, пока шина его извлечет. Это полностью зависит от процессора, чтобы гарантировать, что то, что находится в основной памяти, совпадает с тем, что хранится в кэше. Единственное время, когда действительно нужно беспокоиться о кеше - это использование DMA. Один из них должен будет вручную очистить или синхронизировать кеш, чтобы процессор не доверял кешу и фактически извлекал данные из основной памяти.