C# lock의 내부 구현

C# 프로그래밍을 하다보면 자연스레 멀티쓰레딩 환경에서 자원 획득 제한이 필요한 경우 lock을 사용했었다. 이 lock 키워드 및 블럭을 사용했을 때 내부적으로 어떻게 동작되는지 궁금해서 알아보았다. lock 문 lock statement(lock 문) Microsoft Docs lock은 공식 문서에 문이라고 한다. Language Reference Statement Keywords lock Statement 위와 같은 구조로 Document에 구성되어 있다. 이 것의 동작 방식을 까보려면 역시 Decompile. private void DoAdd(int value) { lock (_collection) { _collection.Add(value); } } 위 코드를 Decompile시 아래의 il로 해석된다....

October 10, 2020 · 2 min · 424 words · penspanic

개발중인 프로젝트 구성안 - 4

근래엔 Code 생성을 적극적으로 활용하고 있다. 반복 작업 최소화, 실수 방지 측면에서 효율적이라 생각한다. 그 부분들에 대해 소개하려 한다. MessagePack Code Generation MessagePack은 AOT Code Generation을 지원한다. Unity에서 MessagePack을 사용하기 때문에 AOT로 직접 생성된 Formatter를 사용한 결과가 더 좋기 때문에 AOT Code Generation을 사용한다. (mobile platform에선 il emit을 허용하지 않음 Unity documentation) 측정 결과가 다른 것을 경험하고 server에도 AOT 생성된 Formatter를 사용하는데.. 정확한 결과 비교는 해봐야 알 듯. 기억에 남는건 기본 MessagePack 의 Serialize 결과와 AOT Generated Formatter를 사용했을 때 결과가 달랐다....

October 5, 2020 · 3 min · 528 words · penspanic

개발중인 프로젝트 구성안 - 3

세번째 포스트는 프로젝트에서 사용중인 Library와 Package들에 대해 소개하려 한다. MessagePack GitHub 프로젝트 시작시 Serialization Library를 어떤 것을 사용할지 꽤 고민했었다. 이전 프로젝트에선 client <-> server 통신시 Protobuf를 사용했었는데, 이게 꽤나 불편했었다. -_- IDL을 수정하고, Compile하고, Compile된 결과물을 각각 project에 복사하고. (자동화 스크립트가 있다고 하더라도 꽤나 귀찮았다.) 이번 프로젝트에선 모든 Language를 C#으로 통일했기에, IDL을 사용할 필요가 없어져서 Protobuf은 후보 선상에서 제외. 또한 output에 meta-data 없이 payload 만 필요하기 때문에, 그 면에서도 MessagePack이 적합하다고 판단했다....

October 4, 2020 · 3 min · 484 words · penspanic

개발중인 프로젝트 구성안 - 2

먼저, Repository에 대해. Repository client-dash 유니티 클라이언트 프로젝트 Unity 2019.4x, .Net 4.x data-dash, lib-dash server-dash 로비서버, 매치서버, 인게임 서버등 서비스에 필요한 서버들의 모음 .Net Core 3.x data-dash, lib-dash admin-dash 관리자툴, 유저 및 게임 서비스에 대한 제어 .Net Core 3.x data-dash, lib-dash dummyclient-dash 더미 클라이언트. 인게임 전투, API 요청, 특수한 시나리오등을 수행하는 클라이언트 .Net Core 3.x data-dash, lib-dash etc AWS Lambda 에서 실행되는 MicroService 등 눈치 채신 분들도 있겠지만, data-dash, lib-dash는 Submodule 이다....

October 2, 2020 · 2 min · 281 words · penspanic

C# Unmanaged Memory

Managed Memory CLR(Common Language Runtime)이 관리하는 메모리. Garbage Collection의 대상이 된다. Unmanaged Memory Managed Memory가 아닌 것. C# 에서도 C++ 에서처럼 직접 메모리를 할당 할 수 있다. IntPtr memory = Marshal.AllocHGlobal(100); for (int i = 0; i < 100; ++i) { ((byte*) memory)[i] = (byte)(i + 1); } Marshal.FreeHGlobal(memory); stackalloc 표현식 Stack 에 메모리가 할당됨. 그 Stack을 벗어날 때 자동으로 메모리 해제. 일시적인 계산을 위한 메모리를 사용할 때, stackalloc을 사용함으로써 Managed Heap에 할당되지 않게 하여 최적화 가능....

September 28, 2020 · 1 min · 179 words · penspanic