Чем управляемая куча отличается от неуправляемой C#?

Недавно узнал, что помимо обыкновенной кучи, в C# также есть некая неуправляемая куча. Это значит, что "обыкновенная" в свою очередь называется "управляемой". Так в чём же разница между ними? Вроде бы в C# все типы данных бывают или ссылочными (в куче) или значимыми (в стеке), но зачем C# 2 кучи, и в какой из них тогда хранятся типы данных?

Программа в .NET имеет свой менеджер памяти, который занимается автоматическим выделением памяти под объекты и очисткой памяти после объектов (сборка мусора). Это значит что программист не заботится о выделении памяти и ее очистке. Такой тип памяти называется управляемой памятью. И все объекты, которые вы создаете в .NET располагаются в управляемой памяти. Это все встроенные типы: int, string, double, Array, List<> и т.п. Все они - управляемые объекты и располагаются в управляемой памяти.

Однако, программа работает не только с управляемыми объектами. Часть объектов связана с операционной и файловой системами, с WinAPI, с драйверами, с видеокартой, с сетью и т.д. Понятно, что все эти внешние ресурсы никак не связаны с менеджером памяти .NET и потому на них не распространяется автоматическое распределение памяти. Такая память и такие объекты называются неуправляемыми.

По сути ничем, только в управляемой куче сборка мусора осуществляется автоматически, а в неуправляемой - нужно вручную вызывать срабатывание GC (garbage collector)