VisualStudio 93

[C#서버] TLS(Thread Local Storage) - 쓰레드로컬(ThreadLocal)

만약 멀티스레드 환경에서 수 많은 멀티스레드가 어떤 하나의 자원을 점유하고자 할 때 락이 잡혀 있다면 하나의 쓰레드 하나가 처리하는 속도 보다 못 할 수 있다. 이 때 쓰레드 각각 전용 공간에서 힙영역을 참조하면 효과적일 수 있다. 이러한 공간을 TLS라고 한다. (TLS의 하나의 예시일 뿐) ThreadLocal 만약 아래와 같이 static으로 선언된다면 프로젝트 내에 여러 곳 에서 사용될 수 있어 쓰레드에게 영향을 미치지만 ThreadLocal 키워드를 사용하면 각각 쓰레드마다 전용공간이 생긴 것 이기 때문에 다른 쓰레드에서 이름을 변경하여도 영향을 주지 않는다. 즉 공용 메모리를 사용하지 않는다. static ThreadLocal ThreadName = new ThreadLocal(); inter..

[C#서버][개념] 임계영역 특수락 - ReaderWriterLockSlim 특수상황 Lock 처리 방법

ReaderWriterLockSlim 이 클래스는 읽기 작업과 쓰기 작업 간의 동시성을 최적화하기 위해 설계되었습니다. ReaderWriterLockSlim은 일반적으로 읽기 작업이 많이 발생하고 쓰기 작업이 적은 상황에서 사용됩니다. 이 클래스를 사용하면 여러 스레드가 동시에 읽기 작업을 수행할 수 있지만, 쓰기 작업은 배타적으로 수행됩니다. 다시 말해, 한 스레드가 쓰기 작업을 수행하는 동안에는 다른 스레드는 읽기나 쓰기 작업을 할 수 없습니다. 평상시에는 Read락을 사용하다 특수한경우 어떤 쓰레드가 WriteLock을 사용하면 ReadLock을 사용하는 다른 모든 쓰레드는 자원을 사용하지 못하게 된다. class Reward { } static ReaderWriterLockSlim _lock = ..

[C#서버][개념] 임계영역와 Evnet락 (AutoResetEvent & ManualResetEvent)

AutoResetEvent 스레드가 AutoResetEvent를 기다리고 있는 동안 다른 스레드가 이 이벤트를 발생시키면, 대기 중인 하나의 스레드만 깨어납니다. 그 후, AutoResetEvent는 자동으로 리셋됩니다. Set 메서드를 호출하면 한 번만 대기 중인 스레드 중 하나가 깨어나고, 이벤트는 자동으로 리셋됩니다. 커널 동기화, 톨게이트느낌, _available.WaitOne(); 아래에 _available.Reset();사용하지 않아도 자동으로 락을 닫아준다. class Lock { //bool

[C#서버]임계영역과 SleepLock(컨텍스트스위칭)

Context Switching 컨텍스트 스위칭(Context Switching)은 운영 체제에서 실행 중인 여러 프로세스나 스레드 간에 실행을 전환하는 작업을 말합니다. 이러한 전환은 CPU가 한 작업에서 다른 작업으로 전환되는 과정을 포함합니다. 프로세스나 스레드는 실행을 위해 CPU를 사용하며, 한 프로세스나 스레드가 실행되고 있는 동안에도 다른 프로세스나 스레드로 전환될 수 있습니다. 이러한 전환은 여러 이유로 발생할 수 있습니다. 시분할(Time Slicing): 운영 체제는 CPU 시간을 여러 프로세스나 스레드에게 나누어 주어 각각에게 일정 시간 동안 실행할 기회를 부여합니다. 이 시간이 지나면 다른 프로세스나 스레드로 컨텍스트 스위칭이 발생합니다. 인터럽트(Interrupt): 하드웨어 인터..

[C#서버][개념] Thread.sleep 종류

Thread.Sleep(1) 무조건 1ms 쉰다. Thread.Sleep(0) 조건부 양보 나보다 우선순위가 낮은 애들한테는 양보 불가 => 우선순위가 나보다 같거나 높은 쓰레드가 없으면 다시 자기자신 실행우선순위낮은 쓰레드는 기아현상 발생가능 Thread.Yield() 관대한 양보 => 관대하게 양보할테니 지금 실행이 가능한 쓰레드가 있으면 실행해라 => 실행 가능한 쓰레드가 없으면 남은 시간 자신에게 소진

[C#서버][개념] 임계영역 Spin락(스핀락(SpinLock))

SpinLock- 무작정 기다리는 방법 (단점 cpu점유율이 많이올라감) Context Switching - 소유권 포기후 다시접근하는 방법 AutoResetEvent - 운영체제 예약시스템으로 이벤트 사용하여 비어있으면 호출하여 접근 SpinLock SpinLock은 C#에서 제공되는 스레딩 동기화를 위한 클래스 중 하나입니다. SpinLock은 다른 스레딩 동기화 메커니즘과 달리 스레드가 잠금 해제될 때까지 계속해서 "스핀"하면서 대기하는 방식으로 동작합니다. 스핀은 프로세서가 일정한 시간 동안 루프를 실행하면서 아무 일도 하지 않는 것을 말합니다. SpinLock은 기본적으로 레커시브하지 않으며, 스핀을 사용하여 잠금을 획득하려고 시도합니다. 스핀락은 단일 프로세서 시스템에서는 효율적일 수 있지만,..

[C#서버][개념] 임계영역(크리티컬섹션)상호배제 - Moniter, lock

Moniter, lock중 lock사용 추천 Moniter(잘사용안함) static int number = 0; static object _obj = new object(); static void Thread_1() { for (int i = 0; i < 100000; i++) { try { Monitor.Enter(_obj); number++; } finally // 데드락 예방 { Monitor.Exit(_obj); } } } static void Thread_2() { for (int i = 0; i < 100000; i++) { try { Monitor.Enter(_obj); number--; } finally // 데드락 예방 { Monitor.Exit(_obj); } } } static voi..

VisualStudio/C# 2022.10.26

[C#서버][개념] 임계영역(크리티컬섹션)원자성 - 레이스컨디션(Race Condition)과 Interlocked

Rock처리와 함께사용 레이스컨디션 아래와 같은 소스코드를 실행할 경우 결과값은 0이아닌 다른 다양한 수로 출력된다. 이를 레이스 컨디션이라고 한다. number ++를 할경우 보여지기에는 한 단계로 진행될 것 같지만 사실 어셈블리상으로는 아래 소스와 같이 3단계로 나뉘어 지기 때문에 0이아닌 결과가 나타나게된다. static int number =0; static void Thread_1() { for (int i = 0; i < 100000; i++) { //number++;를 어셈블리어로 풀어서 본다면 아래 소스와 같다. int temp = number; temp += 1; number = temp; } } static void Thread_2() { for (int i = 0; i < 100000..

[C#서버][개념] 메모리 베리어( Memory Barrier)

※개념만 알아둘것 메모리 베리어 (Rock처리안할 경우) 멀티스레드 환경에서 메모리순서가 강제로 변경된다. 이때 메모리 순서 변경을 막기위한 방법 1. 코드 재배치 억제 1) Full Memory Barrier(어셈블리 MFENCE, C# Thread.MemoryBarrier) - Store/Load 둘다 막는다. 2) Store Memory Barrier(어셈블리 SFENCE - Store 막는다) 3) Load Memory Barrier(어셈블리 LFENCE - Load 막는다) 2. 가시성 static int x = 0; static int y = 0; static int r1 = 0; static int r2 = 0; static void Thread_1() { y = 1; //Thread.Mem..