본문 바로가기

프로그래밍257

[TypeORM] DataSource API https://orkhan.gitbook.io/typeorm/docs/data-source-api dataSource.isInitialized 데이터소스 초기화와 데이터베이스 연결, 커넥션 풀 여부 dataSource.driver 데이터 소스에서 사용된 기본 DB 드라이버 dataSource.manager 엔티티 매니저 dataSource.mongoManager 몽고DB 매니저 await dataSource.initialize() 데이터소스 초기화, DB 커넥션 풀을 연다. await dataSource.destroy() 데이터 소스 종료 및 모든 DB커넥션을 종료한다. 주로 어플리케이션 종료시 사용 await dataSource.synchronize() 데이터베이스 스키마를 동기화한다. 데이터소스 옵션.. 2023. 8. 30.
[C#] Thread Local Storage 쓰레드는 힙 영역과 데이터 영역을 공유한다. Thread마다 가질 수 있는 공유한 영역을 만드려면 Thread Local Storage(TLS) 를 사용하면 된다. 다음 예제는 TLS로 생성한 영역에 이름을 넣고 출력하는 예제이다. Sleep을 걸어서 다른 쓰레드가 값을 건드리는지 확실하게 체크한다. class ThreadProgram { static ThreadLocal ThreadName = new ThreadLocal(); //static string ThreadName; static void WhoAmI() { ThreadName.Value = $"My name is {Thread.CurrentThread.ManagedThreadId}"; Thread.Sleep(1000); Console.Writ.. 2023. 8. 28.
[C#] AutoResetEvent AutoResetEvent는 키를 얻고 문을 닫는(다른 스레드 접근 불가) 처리를 자동으로 진행해준다. class Lock { // 문을 닫는 행위를 자동으로 해준다. 커널 단위의 실행. SpinLock은 커널에 요청하지 않음 AutoResetEvent _available = new AutoResetEvent(true); public void Acquire() { _available.WaitOne(); // 입장 시도 } public void Release() { _available.Set(); // flag = true } } class ThreadProgram { static int _num = 0; static Lock _lock = new Lock(); static void Thread_1() {.. 2023. 8. 26.
[C#] SpinLock 키를 가진 사람은 하나이고 화장실에 들어가서 문을 잠근다. 볼일을 보고 나가면서 키를 두고 나간다. 다음 코드는 SpinLock이 제대로 동작하지 않는 코드이다. class SpinLock { volatile bool _locked = false; public void Acquire() { while (_locked) { // 잠김이 풀릴 때까지 기다린다. } _locked = true; } public void Release() { _locked = false; } } class ThreadProgram { static int _num = 0; static SpinLock _lock = new SpinLock(); static void Thread_1() { for (int i = 0; i 우선순위가 .. 2023. 8. 26.
[C#] Interlocked 원자성이란? 어떠한 동작이 한번에 일어나야 하는 것을 의미한다. 예시) 돈을 송금하는 상황 1. 돈을 내 계좌에서 줄인다. 2. 상대 계좌에 돈을 늘린다. 만약 1번까지만 성공하고, 2번에서 문제가 생겼다면? 원자성을 보장하지 않는 것이다. 이를 막기 위해 Interlocked 함수를 이용한다. 다음 코드는 쓰레드를 실행시켜 공유 변수인 number에 접근하는 예제이다. 0이 나오지 않는다. class ThreadProgram { static int number = 0; static void Thread_1() { for (int i = 0; i 2023. 8. 26.
[C#] MessagePack MessagePack https://github.com/MessagePack-CSharp/MessagePack-CSharp Serializer for C# 퍼포먼스가 중요한 게임, 분산 컴퓨팅, 마이크로 서비스, 데이타 캐시 목적으로 사용된다. 사용 방법 Serialize 하길 원하는 class 또는 struct에 [MessagePackObject]를 붙인다. 처리되어야 하는 필드에 [Key] 속성을 붙인다. 처리하길 원하지 않는 필드에 [IgnoreMember] 속성을 붙인다 [MessagePackObject] public class MyClass { // Key attributes take a serialization index (or string name) // The values must be u.. 2023. 8. 26.
[C#] 메모리 베리어 하드웨어는 최적화를 위해 연관성이 없는 연산의 순서를 바꿀 수 있다. 이러한 최적화를 막기 위해 메모리 베리어를 사용한다. 메모리 베리어의 기능 1. 코드 재배치 억제 2. 가시성 재배치 억제는 하드웨어의 연산 최적화를 허용하지 않는 것이다. 가시성은 데이터를 메모리에 올리고, 다시 받아오는 개념이다. 메모리 베리어의 종류 1. Full Memory Barrier: Store/Load 둘 다 막는다. 2. Store Memory Barrier: Store만 막는다. 3. Load Memmory Barrier: Load만 막는다. 다음 프로그램에서 r1과 r2에는 0이 들어가지 않을 것처럼 보이지만, 실제로는 0이 들어가 loop를 빠져나온다. 이는 컴파일러에서 최적화를 위해 연산 순서를 재배치하기 때문이.. 2023. 8. 26.
[C#] 캐시 메모리 철학 캐시의 철학 1. 방금 주문한 테이블에서 추가 주문이 나올 확률이 높다. (Temporal Locality) 2. 방금 주문한 사람 근처에 있던 사람이 추가 주문할 확률이 높다. (Spacial Locality) (Spacial Locality) int[,] arr = new int[10000, 10000]; { long now = DateTime.Now.Ticks; for (int y = 0; y 2023. 8. 26.
[C#] 쓰레드 생성 오브젝트 풀링이란? 미리 생성한 오브젝트를 필요한 순간에 가져다가 사용하는 개념이다. 프로그램 중간에 할당하지 않아 성능상 이점이 있다. C# 환경에서는 ThreadPool과 Task를 지원하고 있다. ThreadPool은 인력소 같은 느낌이고, Thread는 고용되서 일하는 Worker라고 볼 수 있다. Task는 작업해야 하는 업무의 개념이다. // 쓰레드 생성 기본 코드 static void ThreadBasic() { Thread t = new Thread(MainThread); t.Name = "TestThread"; t.IsBackground = true; // MainThread 종료시 같이 종료된다. t.Start(); Console.WriteLine("Waiting for thread").. 2023. 8. 26.
Redis란 무엇인가? Redis 레디스는 사용되는 인메모리 데이타 구조 스토어이다. 캐시, 메시지 브로커, 스트리밍 엔진, 데이터베이스로 사용된다. strings, hashs, lists, sets, sorted sets with range queries appending to string, incrementing the value in hash pushing en element to a list, computing set intersection getting the member with higher ranking in a sorted set. 인메모리 데이터셋 일시적으로 데이터셋을 덤핑하든 디스크에 저장하는 방식, 커맨드를 디스크 기반 로그에 추가하여 영속성을 제공한다. 인메모리 캐시, 네트워크, 기능을 위해 영속성을 제거.. 2023. 8. 24.