Где распределяются неуправляемые ресурсы - PullRequest
5 голосов
/ 18 мая 2010

Я не специалист по компьютерным наукам. Управляемые ресурсы выделяются в куче. Но я хотел бы знать, где выделяются неуправляемые ресурсы. Если неуправляемые ресурсы также выделяются в куче, это та же куча, которая используется управляемыми ресурсами, или другая?

Заранее спасибо.

Harsha

Ответы [ 5 ]

10 голосов
/ 18 мая 2010

По сути, куча такая же, если смотреть с точки зрения операционной системы: пространство памяти, выделенное процессу ОС.

Разница в том, что когда CLR (.net VM) загружается внутри процесса Windows, он берет часть этой кучи и превращает ее в управляемую кучу . Это пространство памяти становится местом, где все управляемые ресурсы выделены и известны сборщику мусора.

Например, вы можете столкнуться с ошибкой «Недостаточно памяти», если выделите большой кусок неуправляемой памяти и не хватит места для управляемой кучи. Или наоборот.

Джеффри Рихтер - парень, который лучше объясняет это. Я настоятельно рекомендую прочитать его объяснение:

Вы можете использовать службы пространства имен System.InteropServices, в частности, класса Marshal , для копирования данных между неуправляемой частью кучи и управляемой.

1 голос
/ 08 февраля 2013

Для работы с неуправляемой кучей используйте класс Marshal, описанный в MSDN

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal(v=vs.71).aspx

Неуправляемая куча не контролируется GC, поэтому вся ответственность за использование памяти лежит на вас. По существу, чтобы освободить память, выделенную для неуправляемых ресурсов, используйте интерфейс IDisposable и освободите все выделенные ресурсы самостоятельно. Все неуправляемые ресурсы, такие как соединения SQL и различные операции ввода-вывода, используют этот подход.

0 голосов
/ 19 июня 2012

Если позаимствовать несколько фраз из журнальной статьи, в которой сравниваются линейные и нелинейные фильтры, сравнение управляемых ресурсов и неуправляемых ресурсов похоже на сравнение между биологией кенгуру и биологией не кенгуру.

В .net управляемые ресурсы - это объекты классов в управляемой куче. Всегда. Типы значений могут содержать ссылки на управляемые ресурсы, но экземпляр типа значения сам по себе не может быть "управляемым" ресурсом.

В отличие от этого, неуправляемый ресурс может быть чем угодно и может храниться где угодно. Он не обязательно должен быть на том же компьютере или даже на той же планете, что и программа, которой он принадлежит (я не знаю, что какой-либо из зондов, отправленных на Марс, предоставляет какой-либо интерфейс сокетов связи, который будет вести себя как неуправляемый ресурс, но его можно, конечно, спроектировать).

Объект содержит неуправляемый ресурс, если какая-то внешняя сущность делает что-то от имени этого объекта в ущерб другим, и будет продолжать делать это до тех пор, пока ему не будет приказано остановиться (или, возможно, до истечения времени ожидания). Существует много видов неуправляемых ресурсов, и они могут жить где угодно. Некоторые из них (например, блокировки и подписки на события) могут полностью находиться в управляемом мире .net. Некоторые из них (например, соединения с сервером) могут существовать вне компьютера, который «владеет» ими в любой момент. Некоторые типы неуправляемых ресурсов могут инкапсулировать блоки памяти из ОС, отдельно от неуправляемой кучи, но нет общего места, где неуправляемые ресурсы «хранятся». Скорее, как уже отмечалось, неуправляемые ресурсы могут быть практически чем угодно и могут храниться где угодно.

0 голосов
/ 18 мая 2010

CLR поддерживает свои кучи. Первоначально создаются два: один просто называется управляемая куча (или куча небольших объектов), а другой - куча больших объектов (см. Также здесь ) , Эти управляемые кучи физически отделены от собственных куч, выделенных CRT для использования с new и malloc.

Вы можете использовать VMMap для проверки различных куч, выделенных процессом.

0 голосов
/ 18 мая 2010

в памяти. Как и для любого неуправляемого процесса. Управляемая куча, очевидно, отличается от управляемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...