Подтвердить что ты не робот

Что такое неуправляемые ресурсы?

Я хочу знать о неуправляемых ресурсах. Может кто-нибудь, пожалуйста, дать мне базовую идею?

4b9b3361

Ответ 1

Управляемые ресурсы в основном означают "управляемую память", управляемую сборщиком мусора. Когда у вас больше нет ссылок на управляемый объект (который использует управляемую память), сборщик мусора (в конце концов) освободит эту память для вас.

Неуправляемые ресурсы - это все, о чем не знает сборщик мусора. Например:

  • Открыть файлы
  • Открыть сетевые подключения
  • Неуправляемая память
  • В XNA: буферы вершин, буферы индексов, текстуры и т.д.

Обычно вы хотите освободить эти неуправляемые ресурсы, прежде чем потерять все ссылки, которые у вас есть, на объект, управляющий ими. Вы делаете это, вызывая Dispose на этом объекте или (в С#) с помощью инструкции using, которая будет обрабатывать вызов Dispose для вас.

Если вы пренебрегаете Dispose ваших неуправляемых ресурсов правильно, сборщик мусора в конечном итоге обработает его для вас, когда объект, содержащий этот ресурс, будет собран мусором (это "финализация" ). Но поскольку сборщик мусора не знает о неуправляемых ресурсах, он не может сказать, как сильно его нужно освободить, поэтому ваша программа может работать плохо или исчерпать ресурсы целиком.

Если вы реализуете сам класс, который обрабатывает неуправляемые ресурсы, вам нужно правильно реализовать Dispose и Finalize.

Ответ 2

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

Я считаю, что ответ более сложный: при открытии файла в .NET вы, вероятно, используете встроенный .NET-класс System.IO.File, FileStream или что-то еще. Поскольку это обычный класс .NET, он управляется. Но это оболочка, внутри которой "грязная работа" (общается с операционной системой с использованием DLL Win32, вызывая функции низкого уровня или даже инструкции ассемблера), которые действительно открывают файл. И это то, о чем .NET не знает, неуправляемый. Но вы, возможно, можете открыть файл самостоятельно, используя инструкции ассемблера и обходить функции файла .NET. Тогда дескриптор и открытый файл являются неуправляемыми ресурсами.

То же самое с БД: если вы используете некоторую сборку БД, у вас есть такие классы, как DbConnection и т.д., они известны .NET и управляются. Но они завершают "грязную работу", которая неуправляема (распределяет память на сервере, устанавливает соединение с ней,...). Если вы не используете этот класс-оболочку и не открываете какой-либо сетевой сокет самостоятельно и обмениваетесь своей собственной странной базой данных с помощью некоторых команд, он неуправляем.

Эти классы-оболочки (File, DbConnection и т.д.) управляются, но они внутри используют неуправляемые ресурсы так же, как вы, если вы не используете обертки и не выполняете "грязную работу" самостоятельно. И поэтому эти обертки DO реализуют шаблоны Dispose/Finalize. Их ответственность заключается в том, чтобы позволить программисту выпускать неуправляемые ресурсы, когда оболочка больше не нужна, и освободить их, когда обертка собрана мусором. Обертка будет правильно мусором, собранным сборщиком мусора, но неуправляемые ресурсы внутри будут собраны с использованием шаблона Dispose/Finalize.

Если вы не используете встроенные классы оболочки .NET или сторонней оболочки и не открываете файлы с помощью некоторых инструкций ассемблера и т.д. в своем классе, эти открытые файлы неуправляемы, и вы ДОЛЖНЫ реализовать шаблон dispose/finalize. Если вы этого не сделаете, произойдет утечка памяти, навсегда заблокированный ресурс и т.д., Даже если вы больше не используете его (завершение работы с файлом) или даже после завершения приложения.

Но ваша ответственность также при использовании этих оберток. Для тех, кто реализует dispose/finalize (вы их узнаете, что они реализуют IDisposable), реализуйте также свой шаблон dispose/finalize и Dispose даже эти обертки или дайте им сигнал освободить их неуправляемые ресурсы. Если вы этого не сделаете, ресурсы будут выпущены после некоторого неопределенного времени, но очистить его немедленно (немедленно закрыть файл и не оставлять его открытым и заблокировать случайным образом несколько минут/часов). Поэтому в вашем методе Dispose класса вы вызываете методы Dispose всех используемых вами оберток.

Ответ 3

Неуправляемые ресурсы - это те, которые работают за пределами среды выполнения .NET(CLR) (например, не .NET-код). Например, вызов DLL в Win32 API или вызов .dll, написанного на С++.

Ответ 4

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

Украденный здесь, не стесняйтесь читать весь пост.

Ответ 5

"Неуправляемый ресурс" - это не вещь, а ответственность. Если объекту принадлежит неуправляемый ресурс, это означает, что (1) какой-либо объект вне его был обработан таким образом, который может вызвать проблемы, если он не очищен, и (2) объект имеет информацию, необходимую для выполнения такой очистки и несет ответственность для этого.

Несмотря на то, что многие типы неуправляемых ресурсов очень сильно связаны с различными типами сущностей операционной системы (файлы, дескрипторы GDI, выделенные блоки памяти и т.д.), нет единого типа сущности, который разделяется всеми, кроме ответственность за очистку. Как правило, если объект либо несет ответственность за выполнение очистки, он будет иметь метод Dispose, который поручает ему выполнить всю очистку, за которую он несет ответственность.

В некоторых случаях объекты будут учитывать возможность того, что они могут быть оставлены без того, чтобы кто-либо сначала вызывал Dispose. GC позволяет объектам запрашивать уведомление о том, что они были оставлены (путем вызова подпрограммы Finalize), и объекты могут использовать это уведомление для выполнения самой очистки.

Термины, такие как "управляемый ресурс" и "неуправляемый ресурс", к сожалению, используются разными людьми для обозначения разных вещей; откровенно считают, что более полезно думать с точки зрения объектов, либо не имея никакой ответственности за очистку, имея ответственность за очистку, которая будет заботиться только о том, будет ли Dispose вызвана, или иметь ответственность за очистку, которую следует позаботиться через Dispose, но которая может также позаботиться о завершении.

Ответ 6

Любой ресурс, для которого выделена память в управляемой платформе .NET, является управляемым ресурсом. CLR полностью осознает эту память и сделает все, чтобы убедиться, что она не потеряет сирот. Все остальное неуправляемо. Например, взаимодействие с COM может создавать объекты в пространстве памяти процессов, но CLR не позаботится об этом. В этом случае управляемый объект, который вызывает вызовы через управляемую границу, должен нести ответственность за что-либо за ее пределами.

Ответ 7

Давайте сначала поймем, как используются программы VB6 или C++ (приложения Non Dotnet). Мы знаем, что компьютеры понимают только код уровня машины. Код уровня машины также называется родным или двоичным кодом. Таким образом, когда мы выполняем программу VB6 или C++, соответствующий компилятор языка компилирует соответствующий исходный код языка в собственный код, который затем может быть понят базовой операционной системой и оборудованием.

Исходный код (неуправляемый код) является специфическим (родным) для операционной системы, на которой он сгенерирован. Если вы возьмете этот скомпилированный собственный код и попытаетесь запустить его в другой операционной системе, он потерпит неудачу. Таким образом, проблема с этим стилем выполнения программы заключается в том, что она не переносима с одной платформы на другую.

Давайте теперь поймем, как выполняется программа.Net. Используя dotnet, мы можем создавать различные типы приложений. Некоторые из распространенных типов приложений.NET включают в себя Web, Windows, консоль и мобильные приложения. Независимо от типа приложения, когда вы выполняете какое-либо приложение.NET, происходит следующее:

  1. Приложение.NET скомпилировано в Intermediate language (IL). IL также упоминается как Common Intermediate language (CIL) и Microsoft Intermediate language (MSIL). Как.NET, так и не.NET-приложения генерируют сборку. Ассембли имеют расширение.DLL или.EXE. Например, если вы скомпилируете приложение Windows или Console, вы получите.EXE, где, как когда мы скомпилируем проект библиотеки или библиотеки классов, мы получаем.DLL. Разница между сборкой.NET и NON.NET заключается в том, что DOTNET Assembly находится в формате промежуточного языка, где сборка NON DOTNET находится в формате собственного кода.

  2. Приложения NON DOTNET могут запускаться непосредственно поверх операционной системы, где приложения DOTNET работают поверх виртуальной среды, называемой Common Language Runtime (CLR). CLR содержит компонент, называемый Just In-Time Compiler (JIT), который преобразует промежуточный язык в собственный код, который может понять базовая операционная система.

Таким образом, в.NET выполнение приложения состоит из двух шагов: 1. Компилятор языка, компилирует исходный код в промежуточный язык (IL) 2. JIT-компилятор в CLR-конвертирует IL-код в собственный код, который затем может быть запущен в базовой операционной системе,

Поскольку сборка.NET находится в формате Intermedaite Language, а не в качестве собственного кода, сборки.NET переносятся на любую платформу, если целевая платформа имеет Common Language Runtime (CLR). Платформа целевой платформы CLR преобразует Intermedaite Language в собственный код, который может понять базовая операционная система. Промежуточный Ланг также называется управляемым кодом. Это связано с тем, что CLR управляет кодом, который работает внутри него. Например, в программе VB6 разработчик отвечает за де-распределение памяти, потребляемой объектом. Если программист забывает де-выделить память, мы можем столкнуться с трудностями, чтобы выявить исключения из памяти. С другой стороны,.NET-программисту не нужно беспокоиться о том, чтобы отделить память, потребляемую объектом. CLR обеспечивает автоматическое управление памятью, также известное как сбор средств сбора. Кроме того, из коллекции мусора есть несколько других преимуществ, предоставляемых CLR, которые мы обсудим на более поздней сессии. Поскольку CLR управляет и выполняет промежуточный язык, он (IL) также называется управляемым кодом.

.NET поддерживает различные языки программирования, такие как С#, VB, J # и C++. С#, VB и J # могут генерировать только управляемый код (IL), где C++ может генерировать как управляемый код (IL), так и не управляемый код (собственный код).

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

Программа.NET похожа на выполнение программы Java. В java мы имеем байтовые коды и JVM (Java Virtual Machine), где, как и в.NET, мы являемся промежуточным языком и CLR (Common Language Runtime)

Это предусмотрено по этой ссылке - он отличный учитель. http://csharp-video-tutorials.blogspot.in/2012/07/net-program-execution-part-1.html