VisualStudio/C#서버 26

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

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

[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..

[C#서버][기초] Thread & ThreadPool & Task

Thread※아래와 같은 방법으로 Thread를 직접 만들어 사용할 경우 만든 개발자가 끝까지 책임져야하는 스레드이다. (어떤 일을 할 때 마다 정직원을 고용하는 개념) 성능에 많은 부하가 갈 수 있다. IsBackground - True를 선택할 경우 메인스레드가 종료되면 함께 종료된다. (선택해줘야함)Join - 현재 새로 만든 스레드가 종료될 때까지 아래 메인스레드는 실행 할 수 없다. static void MainThread() { for (int i = 0; i ThreadPool※이미 만들어진 스레드를 잠깐 사용하는 용도로 부하가 적다.(새롭게 고용하는 직원이아닌 고용된 직원을 유동적으로 사용하는 개념, Unity의 오브젝트 풀과 같은 개념이다.)  ※스레드 ..

[C#서버][기초] Thread 테스트 방법

스레드 검색 방법 일시정지 - 스레드 창에서 스레드 선택 Thread ※아래와 같은 방법으로 Thread를 직접 만들어 사용할 경우 만든 개발자가 끝까지 책임져야하는 스레드이다. (어떤 일을 할 때 마다 정직원을 고용하는 개념) 성능에 많은 부하가 갈 수 있다. IsBackground - True를 선택할 경우 메인스레드가 종료되면 함께 종료된다. (선택해줘야함) Join - 현재 새로 만든 스레드가 종료될 때까지 아래 메인스레드는 실행 할 수 없다. ThreadPool ※이미 만들어진 스레드를 잠깐 사용하는 용도로 부하가 적다.(새롭게 고용하는 직원이아닌 고용된 직원을 유동적으로 사용하는 개념, Unity의 오브젝트 풀과 같은 개념이다.) ※스레드 풀을 사용할 때는 짧게 사용하는 곳에서 사용해야 용의하..