관리되지 않는 리소스 란 정확히 무엇입니까?
관리되지 않는 리소스에 대해 알고 싶습니다. 누구든지 기본 아이디어를 줄 수 있습니까?
관리 자원은 기본적으로 가비지 콜렉터가 관리하는 "관리 메모리"를 의미합니다. 더 이상 관리 대상 메모리를 사용하는 관리 대상 객체에 대한 참조가 없으면 가비지 수집기가 해당 메모리를 (해당) 해제합니다.
관리되지 않는 리소스는 가비지 수집기에서 알 수없는 모든 것입니다. 예를 들면 다음과 같습니다.
- 파일 열기
- 개방형 네트워크 연결
- 관리되지 않는 메모리
- XNA에서 : 정점 버퍼, 인덱스 버퍼, 텍스처 등
일반적으로 관리 대상 자원 에 대한 모든 참조를 잃기 전에 관리되지 않는 자원을 해제하려고 합니다. Dispose
해당 개체 를 호출 하거나 C #에서 using
호출 Dispose
을 처리하는 문을 사용 하여이 작업을 수행 합니다.
Dispose
관리되지 않는 리소스를 올바르게 무시하면 해당 리소스가 포함 된 객체가 가비지 수집 될 때 가비지 수집기에서 리소스를 처리합니다 ( "최종화"). 그러나 가비지 수집기는 관리되지 않는 리소스에 대해 알지 못하기 때문에 리소스를 얼마나 많이 해제해야하는지 알 수 없으므로 프로그램의 성능이 저하되거나 리소스가 부족할 수 있습니다.
당신이 핸들 자원을 관리되지 않는하는 클래스를 직접 구현하는 경우, 그것을 구현하는 당신에게 달려 Dispose
과 Finalize
올바르게.
일부 사용자는 열린 파일, DB 연결, 할당 된 메모리, 비트 맵, 파일 스트림 등을 관리되는 리소스 중에서 순위를 매기고 다른 사용자는 관리되지 않는 리소스 중에서 순위를 매 깁니다. 그래서 그들은 관리되거나 관리되지 않습니까?
내 의견은 응답이 더 복잡하다는 것입니다. .NET에서 파일을 열 때 내장 .NET 클래스 System.IO.File, FileStream 또는 다른 것을 사용할 수 있습니다. 일반적인 .NET 클래스이므로 관리됩니다. 그러나 실제로는 파일을 여는 "더러운 작업"(Win32 dll을 사용하여 운영 체제와 통신하거나 하위 수준 함수를 호출하거나 어셈블러 명령을 호출)과 같은 래퍼입니다. 그리고 이것은 .NET이 알지 못하는 관리되지 않는 것입니다. 그러나 어셈블러 지침을 사용하고 .NET 파일 기능을 무시하여 파일을 직접 열 수 있습니다. 그런 다음 핸들과 열린 파일은 관리되지 않는 리소스입니다.
DB와 동일 : 일부 DB 어셈블리를 사용하는 경우 DbConnection 등과 같은 클래스가 있으며 .NET에 알려지고 관리됩니다. 그러나 관리되지 않는 "더러운 작업"을 래핑합니다 (서버의 메모리 할당, 연결 설정 등). 이 랩퍼 클래스를 사용하지 않고 직접 네트워크 소켓을 열고 일부 명령을 사용하여 이상한 데이터베이스와 통신하는 경우 관리되지 않습니다.
이 래퍼 클래스 (File, DbConnection 등)는 관리되지만 래퍼를 사용하지 않고 직접 "더러운 작업"을 수행하는 경우 내부와 동일한 방식으로 관리되지 않는 리소스를 사용합니다. 따라서 이러한 래퍼는 Dispose / Finalize 패턴을 구현합니다. 랩퍼가 더 이상 필요하지 않은 경우 프로그래머가 관리되지 않는 자원을 해제하고 랩퍼가 가비지 수집 될 때 해제하는 것은 그들의 책임입니다. 래퍼는 가비지 수집기에서 올바르게 가비지 수집하지만 내부의 관리되지 않는 리소스는 Dispose / Finalize 패턴을 사용하여 수집합니다.
내장 .NET 또는 타사 래퍼 클래스를 사용하지 않고 클래스에서 어셈블러 명령 등으로 파일을 열면 이러한 열린 파일이 관리되지 않으므로 처리 / 완료 패턴을 구현해야합니다. 사용하지 않으면 더 이상 사용하지 않거나 (파일 작업이 완료된 경우) 또는 응용 프로그램이 종료 된 후에도 메모리 누수, 영구 잠금 리소스 등이 발생합니다.
그러나 이러한 랩퍼를 사용할 때는 사용자의 책임도 있습니다. 처리 / 완료를 구현하는 사용자 (자신이 IDisposable을 구현한다는 것을 인식)의 경우 처리 / 완료 패턴도 구현하고 이러한 래퍼도 처리하거나 관리되지 않는 리소스를 해제하라는 신호를 보냅니다. 그렇지 않은 경우 리소스가 무한정 릴리스 된 후 자원이 해제되지만 즉시 해제하는 것이 좋습니다 (파일을 즉시 닫고 열어 두지 않고 무작위로 몇 분 / 시간 동안 차단하지 마십시오). 따라서 클래스의 Dispose 메서드에서 사용 된 모든 래퍼의 Dispose 메서드를 호출합니다.
관리되지 않는 리소스는 .NET 런타임 (CLR) 외부 (일명 비 .NET 코드) 외부에서 실행되는 리소스입니다. 예를 들어 Win32 API의 DLL 호출 또는 C ++로 작성된 .dll 호출입니다.
관리 자원과 관리되지 않는 자원의 기본 차이점은 가비지 수집기가 모든 관리 자원에 대해 알고 있다는 점입니다. GC가 특정 시점에 관리 대상 객체와 관련된 모든 메모리와 자원을 정리합니다. GC는 파일, 스트림 및 핸들과 같은 관리되지 않는 리소스에 대해 알지 못하므로 코드에서 명시 적으로 정리하지 않으면 메모리 누수가 발생하고 리소스가 잠 깁니다.
여기 에서 도난당한 경우 전체 게시물을 읽으십시오.
"관리되지 않는 리소스"는 문제가 아니라 책임입니다. 개체가 관리되지 않는 리소스를 소유 한 경우 (1) 정리되지 않은 경우 문제를 일으킬 수있는 방식으로 개체 외부의 일부 개체가 조작되었으며, (2) 개체는 이러한 정리를 수행하는 데 필요한 정보를 가지고 있으며 책임이 있음을 의미합니다. 해줘서
많은 유형의 관리되지 않는 리소스는 다양한 유형의 운영 체제 엔터티 (파일, GDI 핸들, 할당 된 메모리 블록 등)와 매우 밀접하게 관련되어 있지만 단일 책임 유형 이외의 다른 유형의 엔터티는 없습니다. 대청소. 일반적으로 개체가 정리를 수행해야 할 책임이있는 경우 Dispose 메서드를 사용하여 책임이있는 모든 정리를 수행하도록 지시합니다.
경우에 따라 객체는 먼저 Dispose를 호출 한 사람이 없어도 버릴 수있는 가능성을 허용합니다. GC를 사용하면 객체가 종료 된 루틴 (Finalize라는 루틴을 호출하여)에 대한 알림을 요청할 수 있으며, 객체는이 알림을 사용하여 정리를 수행 할 수 있습니다.
"관리 자원"및 "관리되지 않는 자원"과 같은 용어는 불행히도 다른 사람들이 다른 것을 의미하기 위해 사용합니다. 솔직히 정리할 책임이 없거나 Dispose가 호출 된 경우에만 처리 할 정리 책임이 있거나 Dispose를 통해 처리해야하는 정리 책임이 있다고 생각하는 것이 개체 측면에서 더 유용하다고 생각하지만 또한 Finalize에 의해 처리됩니다.
.NET 관리되는 힙에 메모리가 할당 된 모든 리소스는 관리되는 리소스입니다. CLR은 이러한 종류의 메모리를 완전히 인식하고 있으며 고아가되지 않도록 모든 작업을 수행합니다. 다른 것은 관리되지 않습니다. 예를 들어 COM과의 상호 운용은 프로세스 메모리 공간에 객체를 생성 할 수 있지만 CLR은이를 처리하지 않습니다. 이 경우 관리되는 경계를 넘어 호출하는 관리되는 개체는 그 이외의 모든 것에 대한 책임을 가져야합니다.
먼저 VB6 또는 C ++ 프로그램 (Non Dotnet 응용 프로그램)이 어떻게 실행되었는지 이해하겠습니다. 우리는 컴퓨터가 기계 수준 코드 만 이해한다는 것을 알고 있습니다. 기계 수준 코드는 기본 또는 이진 코드라고도합니다. 따라서 VB6 또는 C ++ 프로그램을 실행할 때 해당 언어 컴파일러는 해당 언어 소스 코드를 기본 코드로 컴파일 한 다음 기본 운영 체제 및 하드웨어에서 이해할 수 있습니다.
기본 코드 (관리되지 않는 코드)는 생성 된 운영 체제에 따라 다릅니다 (기본). 이 컴파일 된 네이티브 코드를 가져 와서 다른 운영 체제에서 실행하려고하면 실패합니다. 따라서이 스타일의 프로그램 실행의 문제점은 한 플랫폼에서 다른 플랫폼으로 이식 할 수 없다는 것입니다.
이제 .Net 프로그램이 어떻게 실행되는지 이해하겠습니다. 닷넷을 사용하여 다양한 유형의 애플리케이션을 만들 수 있습니다. 몇 가지 일반적인 .NET 응용 프로그램 유형에는 웹, Windows, 콘솔 및 모바일 응용 프로그램이 있습니다. 응용 프로그램 유형에 관계없이 .NET 응용 프로그램을 실행할 때 다음이 발생합니다.
The .NET application gets compiled into Intermediate language (IL). IL is also referred as Common Intermediate language (CIL) and Microsoft Intermediate language (MSIL). Both .NET and non .NET applications generate an assembly. Assemblies have an extension of .DLL or .EXE. For example if you compile a windows or Console application, you get a .EXE, where as when we compile a web or Class library project we get a .DLL. The difference between a .NET and NON .NET assembly is that, DOTNET Assembly is in intermediate language format where as NON DOTNET assembly is in native code format.
NON DOTNET applications can run directly on top of the operating system, where as DOTNET applications run on top of a virtual environment called as Common Language Runtime (CLR). CLR contains a component called Just In-Time Compiler (JIT), which will convert the Intermediate language into native code which the underlying operating system can understand.
So, in .NET the application execution consists of 2 steps 1. Language compiler, compiles the Source Code into Intermediate Language (IL) 2. JIT compiler in CLR converts, the IL into native code which can then be run on the underlying operating system.
Since, a .NET assembly is in Intermedaite Language format and not native code, .NET assemblies are portable to any platform, as long as the target platform has the Common Language Runtime (CLR). The target platform's CLR converts the Intermedaite Language into native code that the underlying operating system can understand. Intermediate Languge is also called as managed code. This is because CLR manages the code that runs inside it. For example, in a VB6 program, the developer is responsible for de-allocating the memory consumed by an object. If a programmer forgets to de-allocate memory, we may run into hard to detecct out of memory exceptions. On the other hand a .NET programmer need not worry about de-allocating the memory consumed by an object. Automatic memory management, also known as grabage collection is provided by CLR. Apart, from garbage collection, there are several other benefits provided by the CLR, which we will discuss in a later session. Since, CLR is managing and executing the Intermediate Language, it (IL) is also called as managed code.
.NET supports different programming languages like C#, VB, J#, and C++. C#, VB, and J# can only generate managed code (IL), where as C++ can generate both managed code (IL) and un-managed code (Native code).
The native code is not stored permanently anywhere, after we close the program the native code is thrown awaya. When we execute the program again, the native code gets generated again.
.NET program is similar to java program execution. In java we have byte codes and JVM (Java Virtual Machine), where as in .NET we Intermediate Language and CLR (Common Language Runtime)
This is provided from this link - He is a great tutor. http://csharp-video-tutorials.blogspot.in/2012/07/net-program-execution-part-1.html
참고URL : https://stackoverflow.com/questions/3433197/what-exactly-are-unmanaged-resources
'IT story' 카테고리의 다른 글
공공 서비스로 Google OTP를 사용할 수 있습니까? (0) | 2020.06.15 |
---|---|
RPM 파일을 만들려면 어떻게해야합니까? (0) | 2020.06.15 |
업그레이드 가능한 홈 브루 수식을 어떻게 알 수 있습니까? (0) | 2020.06.15 |
Node.js의 약속 이해 (0) | 2020.06.15 |
#defining WIN32_LEAN_AND_MEAN에서 정확히 제외하는 것은 무엇입니까? (0) | 2020.06.15 |