@ 17. 1 ~ 18/C# 멀티스레드
-
메모리 락과 락없는 프로그래밍@ 17. 1 ~ 18/C# 멀티스레드 2018. 7. 3. 00:02
임계영역같은 스타일의 동기화가 아닌 형태로 수행할 수 있는 스레드 간의 읽기, 쓰기를 락 없는 프로그래밍이라고 불린다.(특히 읽기와 쓰기에 대해 만들어지는 원자성과 순서 보장을 잘 알아야한다) 제대로 구현했다면 임계영역은 다른 스레드에서 동시적으로 실행하는 영역의 원자성과 직렬성을 보장한다.이런보장은 근본적인 정확성의 속성이다. 메모리 동작은 규칙적으로 프로그램을 실행할 책임이 있는 소프트웨어와 하드웨어에 의해 재배치 된다. 1. 컴파일러는 소스를 컴파일된 프로그램 명령어로 변환하는 과정에서 종종 최적화를 수행한다.(읽기와 쓰기가 옮겨지거나 제거 또는 더해진다) 2. 프로세서는 명령어 파이프라인을 통해서 다른위치인 a와 b인 메모리 읽기쌍을 동시에 실행한다.예를들어 문자 그대로 a가 원래 소스코드의 b에..
-
스레드 풀 스레드 관리@ 17. 1 ~ 18/C# 멀티스레드 2018. 6. 30. 16:15
CLR 스레드 풀이 스레드 풀에서 스레드를 언제 생성하고 파괴하는지 어떻게 결정하고어떻게 개발자가 이런 프로세스에 영향을 미칠 수 있는지 보자 * 스레드 인젝션과 은퇴 알고리즘 세부사항윈도우 스레드 풀과 동일하게 CLR 풀은 일부 정교한 휴리스틱을 사용해 스레드의 관리를 추상화한다.그러나 채용된 구체적인 휴리스틱은 다르다. 대부분의 사람들은 구체적인 알고리즘을 몰라도 된다.하지만 내부 세부구현 내용을 이해하는것이 프로그램의 성능과 확장성을 이해하는데 도움이 된다.실질적으로 CLR 스레드 풀은 두가지 세트의 스레드를 관리한다하나는 일반적인 작업 아이템을 처리하고(QueueUserWorkItem, 콜백 등..) 다른하나는 모든 I/O완성을 다룬다.특성이 달라도 두 가지의 스레드 관리는 거의 동일하다. 주요 ..
-
읽기 / 쓰기 락@ 17. 1 ~ 18/C# 멀티스레드 2018. 6. 27. 23:01
읽기 / 쓰기 락일반적으로 여러 읽기는 쓰기보다 빠르다.병렬적으로 발생하는 이런 읽기를 허용하는 것은 엄청나게 코드의 확장성을 개선한다.(읽기 쓰기 모두 락을 걸면 읽기도 쓰기도 모두 느려진다) RWL은 다음과 같은 기본적 사항을 요구한다.1. 스레드가 락을 획득할때 읽기인지 쓰기인지 명시해야한다.2. 최대 하나의 쓰기가 일정 시간에 락을 소유할 수 있다.(배제모드)3. 쓰기가 있는 한 어떤 읽기도 락을 소유할 수 없다.4. 어떤 수의 읽기도 주어진 시간에 락을 소유할 수 있다.(공유모드) 예를 들어 32개의 CPU를 완벽히 장착한 서버를 갖고 있다고 하고 각 CPU는 항상 동시적으로 하나의 요청을 수행한다는 것을 가정한다.높은 성능으로 장착된 서버에서 주어진 시간에 수행할 수 있는 것보다 더 많은 일을..
-
스레드 로컬 저장소@ 17. 1 ~ 18/C# 멀티스레드 2018. 6. 21. 00:49
스레드 로컬 저장소 TLS (Thread local Storage)를 이용하면 스레드마다 고유한 메모리 영역에 정보를 저장할 수 있다이 정보는 스레드별로 따로 관리되며 한 스레드내에서는 마치 전역 변수처럼 사용할 수 있다. 예를들어 C++과 C#에서 정적변수는 프로세스 내의 모든 스레드에서 접근 가능한 메모리 영역에 저장된다.모든 스레드가 공유해 사용하는 정적 변수나 전역 변수는 동기화 없이 사용하면 문제가 생길 수 있다. 스레드마다 데이터를 따로 관리해 동기화 없이 처리하려는 경우나 프로그램 특성상 스레드마다 필요한 정보를 따로 관리해야하는 경우도 흔히 볼 수 있다.바로 이때 TLS를 사용한다. TLS를 사용하면 시스템 내에서 논리적으로는 동일한 변수를 스레드마다 별도의 메모리 공간에 저장할 수 있다.
-
스레드 동기화란?@ 17. 1 ~ 18/C# 멀티스레드 2018. 3. 5. 00:36
윈도우는 스레드가 스케줄링의 단위가 되는 선점형 멀티스레딩 시스템이다.그러므로 여러 개의 스레드가 동시에 돌아가는 솔루션에서 아무런 대책없이 스레드 사이에서 데이터를 공유할 경우 문제가 발생한다. 두개의 스레드가 있다면 하나의 스레드 작업이 끝날때까지 다른 스레드는 기다리게 해줘야한다.기다리게 한다는 것은 2가지의 의미1. 상호배제, 즉 작원에 대한 독점적 점유를 목적으로 하나의 스레드가 해당자원을 사용하는 동안 다른 스레드들이 접근하지 못하도록 막는다는 측면2. 일반적 의미로는 작업의 성격상 각 스레드들의 순차적 실행을 보장해주는 측면결국은 막는다는 의미로 통일된다. 동기화의 필요성다중 cpu가 되면서 더 중요해짐. 사실 단일 cpu일때도 엄청 중요했던건 사실임. 왜냐면 스레드 스케줄링에 의거해 스레드..
-
동시성 컬렉션 사용@ 17. 1 ~ 18/C# 멀티스레드 2017. 8. 20. 04:27
동시성 계산의 경우 적절한 데이터 구조가 필요함.이 데이터 구조는 확장성이 있으며 최대한 잠금을 피하는 동시에 스레드에 안정한 접근을 제공해야한다.닷넷 프레임워크 버전 4에는 여러 데이터 구조를 포함한 System.Collections.Concurrent네임스페이스가 있다. ConcurrentQueue비교하고 둘을 바꾸는 CAS 원자 연산과 SpinWait를 사용하며 스레드에 안전함을 보장한다.당연히 선입 선출. ConcurrentStack 어떠한 잠금을 사용하지 않은 채 CAS 연산만으로도 구현된다.당연히 후입 선출 ConcurrentDictionary스레드에 안전한 딕셔너리 컬렉션읽기 연산에는 잠금이 필요 없지만 쓰기 연산에는 잠금이 필요하다. 쓰기 연산에서는 잠금을 이용한 일반 딕셔너리에 비해 상당..
-
async, await에 대한 설명@ 17. 1 ~ 18/C# 멀티스레드 2017. 8. 19. 13:22
출처 : http://blog.stephencleary.com/2012/02/async-and-await.html 키워드 소개비동기 메서드는 다음과 같다.public async Task DoSomethingAsync() { // In the Real World, we would actually do something... // For this example, we're just going to (asynchronously) wait 100ms. await Task.Delay(100); }async키워드는 해당 메소드에서 await키워드를 사용가능하게 메소드 결과 처리 방법을 변경한다.비동기 메소드의 시작은 다른 메소드와 마찬가지로 실행된다. 즉 , await이 될떄까지 동기적으로 실행한다.await 키워..
-
데드락 걸리는 async 코드@ 17. 1 ~ 18/C# 멀티스레드 2017. 8. 19. 10:14
내용에 대한 출처http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html UI Example아래 예제를 고려하십시오. 버튼을 클릭하면 REST 호출이 시작되고 텍스트 상자에 결과가 표시됩니다 (이 샘플은 Windows Forms 용이지만 모든 UI 응용 프로그램에도 동일한 원칙이 적용됩니다).// My "library" method. public static async Task GetJsonAsync(Uri uri) { using (var client = new HttpClient()) { var jsonString = await client.GetStringAsync(uri); return JObject.Parse(jsonString); ..