TITLE | Desc |
---|---|
Cluster Index | 인덱스 테이블당 한개망 생성 행데이터를 인덱스로 지정한 열에 맞춰서 자동 정렬물리적으로 테이블의 데이터를 재배열데이터가 테이블에 삽입되는 순서에 상관없이 인덱스로 생성되어 있는 컬럼 |
비클러스터 인덱스 | 테이블당 여러개를 생성 물리적으로 데이터를 배열하지 앟은 상태로 데이터 페이지가 구성된다. 인덱스 페이지는 키값 과 RID 로 구성된다. |
넌 클러스터드 인덱스는? | 일반적으로 조회문 성능 향상을 위해서 넌 클러스터드 인덱스를 생성하여 사용하곤 한다.허나, 이 인덱스는 클러스터드인덱스와는 다르게 물리적으로 데이터가 정렬되어 저장되지 않는다. |
TITLE | Desc |
---|---|
Garbage Collection | 가비지 컬렉터는 힙영역의 임계치에 다다르게 되면모든 객체가 쓰레기라고 가정합니다.( 루트 목록 내의 어떤 루트도 메모리를 가리키지 않는다고 가정) 루트 목록을 순회하면서 참조하고 있는 힙 객체와의 관계 여부를 조사합니다. 즉 어떤 루트와도 관계가 없는 힙의 객체들 은 쓰레기로 간주됩니다.쓰레기가 차지하고 있던 메모리가 회수되면, 인접 객체들을 이동시켜 차곡차곡 채워서 정리합니다.객체를 너무 많이 할당하지 마세요.너무 큰 객체 할당을 피하세요.너무 복잡한 참조 관계는 만들지 마세요.루트를 너무 많이 만들지 마세요.힙영역에 할당된 메모리들은 0세대, 1세대, 2세대 세가지로 구분된다.가장 처음 할당되는 메모리들은 0세대이며 가비지 컬렉션이 한번이 이루어 질때마다 한세대씩 증가한다.가비지 컬렉션은 0세대 가비지 컬렉션 부터 발생하며 0세대 가비지 컬렉션은 0세대 메모리들만을 메모리해제 한다. 남은 메모리들은 1세대씩 증가한다.0세대 가비지 컬렉션이 이루어 졌는데도 메모리가 부족하다 판단되면 1세대 가비지 컬렉션이 발생한다.그러면 0세대 메모리와 1세대 메모리 모두 사용하지 않는 메모리는 해제된다. 그리고 한세대씩 증가하게 된다.0세대와 1세대 가비지 컬렉션이 발생하였는데도 메모리가 부족하면 2세대 가비지 컬렉션이 발생한다.첫번째로 작업을 시작하기 전에 가비지 컬렉터는 모든 객체가 쓰레기라고 가정합니다. 즉, 루트 목록내의 어떤 루트도 메모리를 가리키지 않는다고 가정하지요.그리고 나서 루트 목록을 순회하면서 각 루트가 참조하고 있는 힙 객체와의 관계 여부를 조사합니다. 루트가 참조하고 있는 힙의 객체가 또 다른 힙 객체를 참조하고 있다면 이 또한 해당 루트와 관계가 있는 것으로 판단합니다. 이 때 어떤 루트와도 관계가 없는 힙의 객체들은 쓰레기로 간주됩니다.0, 1, 2의 3개 세대로 나누고 0세대에는 빨리 사라질 것으로 예상되는 객체들을, 2세대에는 오랫동안 남아있을 객체들을 위치시킵니다. CLR이 객체의 수명을 예측하는 방법은, 객체가 가비지 컬렉션을 겪은 횟수에 따라 나뉘는데요 횟수가 높을수록 메모리에서 오랫동안 남아있는 객체로 간주되고, 횟수가 낮을 경우 빨리 사라질것이라고 간주됩니다. ~ |
이미 존재하는 쓰레드풀에서 사용가능한 작업 쓰레드를 할당 받아 사용하는 방식이 있는데, 이는 다수의 쓰레드를 계속 만들어 사용하는 것보다 효율적이다. 이렇게 시스템에 존재하는 쓰레드풀에 있는 쓰레드를 사용하기 위해서는 (1) ThreadPool 클래스, (2) 비동기 델리게이트(Asynchronous delegate), (3) .NET 4 Task 클래스, (4) .NET 4 Task 클래스, (5) BackgroundWorker 클래스 등을 사용할 수 있다. 이 중 ThreadPool 클래스의 경우, ThreadPool.QueueUserWorkItem() 를 사용하여 실행하고자 하는 메서드 델리게이트를 지정하면 시스템풀에서 쓰레드를 할당하여 실행하게 된다
리턴값을 돌려받을 필요가 없는곳에 주로 사용된다. 리턴값이 필요한 경우는 비동기 델리게이트 를 사용한다.
// 쓰레드풀에 있는 쓰레드를 이용하여
// Calc() 메서드 실행.
// 리턴값 없을 경우 사용.
ThreadPool.QueueUserWorkItem(Calc); // radius=null
ThreadPool.QueueUserWorkItem(Calc, 10.0); // radius=10
ThreadPool.QueueUserWorkItem(Calc, 20.0);
Console.ReadLine();
Thread Pool 에서 쓰레드 생성과정
.NET의 쓰레드풀은 기본적으로(by default) CPU 코어당 최소 1개의 쓰레드에서 최대 N 개의 작업쓰레드를 생성
.NET의 버전에 따라 다른데, .NET 2.0 까지는 CPU 코어 당 25개, .NET 3.5(CLR 2.0 SP1+)에서는 CPU 코어 당 250개, .NET 4.0의 32bit에서 1023개, .NET 4.0의 64bit 환경에서는 32768개