clr 28

스레드 동기화 - 기타 (이중 확인 락, 조건 변수, 컬렉션)

2022.05.29 - [언어/C#] - 복합 스레드 동기화 요소 복합 스레드 동기화 요소 2022.05.09 - [언어/C#] - 단순동기화3 - 커널 모드 동기화 단순동기화3 - 커널 모드 동기화 2022.05.06 - [언어/C#] - 단순동기화2 (유저 모드 동기화 요소) 커널 모드 동기화 요소 커널 모드 동기화 요소는 tsyang.tistory.com 이중 확인 락 기법 늦은 초기화(Lazy initialization)를 이용해 싱글톤 객체를 생성할 때, 다수의 스레드가 동시에 싱글톤 객체를 요청한다면 싱글톤 객체가 여러 번 생성될 수 있다. 따라서 스레드 동기화를 통해 싱글톤 객체가 단 한 번만 생성되도록 해줘야 하는데 이때 자주 사용되는 기법이 이중 확인 락(double-check locki..

언어/C# 2022.06.05

단순동기화3 - 커널 모드 동기화

2022.05.06 - [언어/C#] - 단순동기화2 (유저 모드 동기화 요소) 커널 모드 동기화 요소 커널 모드 동기화 요소는 유저 모드 동기화 요소에 비해서 상당히 느리다. 왜냐? 커널 모드 동기화 요소가 운영체제에게 스레드 간의 동기화를 요청해서 그렇다. 또한 각각의 메서드들은 커널 객체를 이용하게 되고 이로 인해 스레드가 관리 코드 -> 네이티브 유저 모드 -> 네이티브 커널 모드 (돌아올 때도 역순으로 반복함) 위와 같은 전환을 일으켜 CPU 시간을 엄청나게 소비하기 때문이기도 하다. 그래도 커널 모드 동기화 요소를 쓰는 이유가 있다. 리소스에 대한 경쟁 상태를 확인할 수 있다. 스레드가 CPU를 낭비하지 않도록 한다. 네이티브 스레드와 관리 스레드 사이에서도 동기화를 할 수 있다. 동일 컴퓨터..

언어/C# 2022.05.09

단순동기화2 - 유저 모드 동기화

2022.05.01 - [언어/C#] - CLR 단순 동기화1 CLR 단순 동기화1 스레드 동기화 스레드 동기화는 일반적으로 다수의 스레드가 공유 데이터에 '동시에' 접근하는 경우에도 데이터가 손상되는 것을 막기 위해서 사용된다. 그러나 스레드 동기화는 많은 문제를 tsyang.tistory.com 유저 모드 동기화 요소 CLR은 bool, byte, short, int, float, 참조 타입의 변수에 대해서는 원자적(atomic)으로 값을 읽고 쓸 수 있음을 보장한다. 이게 뭔말이냐면 int x = 0; x = 0x01234567; x 변수가 0x00000000에서 0x01234567로 한 번에 번경된다는 말이다. 즉, 변경 중인 상태의 값을 얻어올 가능성이 없다는 말이다. 엥.. 그럼 아닌 경우도 ..

언어/C# 2022.05.06

CLR 스레딩3 - 태스크(Task)

2022.04.17 - [언어/C#] - CLR 스레드 단순 계산 작업 태스크 앞선 글에서 계산 중심의 비동기 작업을 주행하기 위해 ThreadPool 의 QueueUserWorkItem을 호출하는 방식을 소개헀다. 그러나 이 방법은 작업 완료 시점과 작업 수행의 결과를 얻을 수 있는 방법을 제공하지 않고 있다는 한계가 있다. 그래서 생긴게 태스크(tasks) 라는 개념이다. //ThreadPool을 이용한 방식 ThreadPool.QueueUserWorkItem(obj => Sum(1000)); //Task를 이용한 방식1 var task = new Task(() => Sum(1000)); task.Start(); //Task를 이용한 방식2 Task.Run(() => Sum(1000)); 태스크의 결..

언어/C# 2022.04.24

CLR 스레딩2 단순 계산 작업

2022.04.10 - [언어/C#] - CLR 스레드 기본 CLR 스레드 기본 윈도우 스레드 도입 응용 프로그램의 인스턴스는 '프로세스' 라고 부르는 공간 내에서 수행된다. 개별 프로세스는 자신만의 가상 주소 공간을 가지고 있어서 다른 프로세스가 자신의 코드나 데 tsyang.tistory.com CLR의 스레드에 대해 깊게 판다기 보다는 설계 아이디어에 초점을 맞춤 스레드 풀 이전 글에서 언급하였듯, 스레드를 생성하고 파괴하는 일은 상당한 시간을 소비한다. 또한 스레드를 과도하게 생성하면 잦은 컨텍스트 스위칭이 발생하여 성능에 악영향을 미친다. (+ 메모리 차지는 덤) 이런 상황을 위해 CLR은 고유의 스레드 풀을 관리하는 코드를 가지고 있다. 스레드풀은 CLR별로 하나씩 생성된다. CLR이 초기화 ..

언어/C# 2022.04.17

C# - 리플렉션 (Reflection)

리플렉션 리플렉션은 컴파일 시에 알 수 없었던 타입이나 멤버들을 찾아내고 사용할 수 있게 해주는 메커니즘이다. 그러나 다음의 주요한 단점이 존재한다. 리플렉션을 사용하면 컴파일 시에 타입 안정성을 해친다. 리플렉션은 전반적으로 느리다. 어셈블리에서 정의하는 메타데이터를 살필 때 항상 문자열 검색이 수행되어야 한다. 리플렉션을 이용하여 멤버를 호출하면 성능에 좋지 않은 영향을 미친다. 따라서 먼저 매개변수들을 배열로 포장해야 한다. 내부적으로는 이렇게 포장된 내용을 다시 꺼내어 스레드의 스택에 옮긴다. 추가적으로 CLR이 메서드 호출 전에 각각의 매개변수들이 올바른 타입을 가지고 있는지 확인하고 호출자가 호출하려는 멤버에 접근할 보한 권한이 있는지 확인해야 한다. 상기의 이유로, 타입의 필드나 메서드 혹은..

언어/C# 2021.07.04

C# - 관리 힙과 GC (2)

네이티브 리소스의 처리 네이티브 리소스 네이티브 리소스란 파일이나 커널 객체 같은 걸 말한다. 대부분의 타입들은 메모리만을 이용하지만 네이티브 리소스를 사용하는 애들(파일 핸들, 소켓) 같은 애들은 그렇지 않다. 이런 경우에 GC가 네이티브 리소스를 감싸고 있는 타입을 수거해 간다면 네이티브 리소스에 대한 누수가 발생하게 된다!! GC는 네이티브 리소스에 대해 알지 못하기 때문에 이에 대한 처리가 필요해 보인다. Finalization 파일, 네트워크 연결, 소켓, 뮤텍스 같은 네이티브 리소스를 감싸고 있는 타입은 finalization이란걸 지원한다. CLR은 GC가 이런 객체를 가비지 수집하는 과정에서 Finalize 라는 메서드를 호출하여 객체가 감싸는 네이티브 리소스를 정리할 기회를 준다. pub..

언어/C# 2021.04.03

C# - 관리 힙과 GC (1)

관리 힙 C#은 왜 관리 힙을 쓰나? 메모리 관리를 수동으로 해줘야 하는 C++의 경우 메모리 해제를 까먹어 메모리 누수가 발생하거나, 이미 해제한 메모리에 접근하여 메모리 손상이 발생하는 경우가 많고 이는 결국 버그나 보안 취약점으로 연결된다. 리소스 할당 CLR환경 하에서는 모든 객체가 관리 힙에 할당된다. 프로세스가 초기화되면, CLR은 관리 힙으로 쓸 주소 공간을 할당하고 다음 객체를 할당할 위치를 가리키는 포인터(이하 NextObjPtr)을 시작 주소를 가리키게 한다. 이 주소 영역이 가득 차면 CLR은 프로세스의 주소 공간이 사용될 때 까지 영역을 확대한다. new연산자 CLR에서 new연산자는, 필요한 용량을 계산한다. (특정 타입의 필드, 상속한 타입의 필드까지) - 여기에는 type ob..

언어/C# 2021.03.28

C# Nullable, Null 결합 연산자

Nullable CLR의 값 타입은 null을 가질 수 없다. 그러나 여러 이유로 값 타입이 null을 가져야 할 때가 있다. 이에 대비하기 위해 CLR은 null을 허용하는 값 타입을 지원한다. FCL에는 System.Nullable 구조체가 정의되어 있다. (여러 이유 : 데이터베이스에서는 32비트 정수 값이 null을 가질 수 있음, Java의 Date클래스는 참조 타입이어서 null을 가질 수 있음 그러나 C#은 그렇지 않음... 등) Nullable에서 T는 구조체여야 하며 Nullable에는 여기에 현재 값을 가지고 있는지에대한 Boolean필드 정도만 추가한 값 타입이다. int? 는 Nullable와 같은 의미이다. Nullable의 박싱/ 언박싱 Nullable 타입은 값 타입이기에 박싱..

언어/C# 2021.03.06

C# 사용자 정의 특성

이전 글 tsyang.tistory.com/3 Attribute 0. 개요 애트리뷰트(attribute)는 다양한 요소(클래스, 메서드, 필드... 등)에 메타데이터를 추가할 수 있게 해 준다. 1. 필요성 두 가지 팝업 창이 존재한다. 한 가지는 자주 팝업 되고(ex. 이벤트 창) tsyang.tistory.com 이 글에서는 좀더 자세히 작성 사용자 정의 특성의 사용 일반 사용자 정의 특성은 단순히 특정 대상에 대해 추가적인 정보를 부가한다. 구체적으로도 컴파일러가 관리 모듈의 메타데이터상에 추가 정보를 기입하는 것에 불과하다. 또한 사용자 정의 특성은 단순히 특정 타입의 인스턴스이다. 모든 사용자 정의 특성은 직 간접적으로 모두 public 추상 클래스인 System.Attribute 클래스로부터 ..

언어/C# 2021.02.28