Что такое куча и стек?

Изучаю C# и встретил два понятия стек и куча. Говорится, что ссылочные типы хранятся на куче, а значимые в стеке, но я так и не понял где именно они находятся (физически), кокой у них размер и как работают. Буду рад получить объяснение.

Почитайте ответ к этому вопросу: Жизненный цикл переменной value типа в памяти
Если кратко, то:

  • куча и стек находятся в оперативной памяти
  • размер стека равен количеству выделенных страниц памяти под него (размер 1 страницы = 1Мб), по умолчанию под стек выделяется 1 страница, но очень редко может быть больше (в ОС Windows стек всегда равен 1 Мб)
  • для каждого потока создаётся отдельный стек (если в процессе два потока, то существует два отдельных стека)
  • размер кучи ограничен количеством доступной памяти
  • в куче хранятся ссылочные типы, а в стеке - адреса возврата и локальные переменные (если переменная ссылочного типа, то храниться адрес на неё в куче; если значимого, то значение)
  • за удаление объектов на куче отвечает сборщик мусора, в стеке все данные определённого метода удаляется после завершения его работы

Спасибо за объяснение!