서버/서버 이론 8

Lock 구현

Spin Lock변수를 점유할 때 까지 쉬지않고 계속 점유를 시도하는 방법 ex) 화장실에서 사람이 나올때 까지 대기  Spin Lock 구현1. 만약 Lock을 다른 쓰레드가 소유하고 있으면, 해당 Lock이 풀릴때 까지, 무한루프를 돈다.2. 만약 Lock을 소유하고 있는 쓰레드가 없다면, 해당 Lock을 얻고, 이제는 소유중이라고 Lock의 상태를 변경한다. 이 두가지 조건을 만족하는 코드를 작성해보자.  using System;using System.Threading;using System.Threading.Tasks;namespace CSharp{ class SpinLock { // 상태 volatile bool _locked = false; //..

데드락 (DeadLock)

데드락 (DeadLock) 데드락(Deadlock)은 컴퓨터 과학에서 여러 프로세스나 스레드가 서로를 무한히 기다리는 상태를 말한다. 이 상태에서는 모든 관련 프로세스나 스레드가 정지 상태에 빠져, 작업을 계속할 수 없게 된다. ex) 화장실에는 두개의 자물쇠가 있다고 가정. 서로 다른 사람이 각각 하나의 자물쇠를 가지면 둘다 잠글 수 없는 데드락 상태가 발생한다. 그래서 1번 자물쇠부터 가지고, 2번 자물쇠를 가지도록 약속을 해야한다.   namespace ServerCore{ class SessionManager { static object _lock = new object(); public static void TestSession() { ..

Lock

Lock멀티쓰레드 환경에서 공유 자원의 동기화를 위해 사용. 즉, 여러 개의 쓰레드가 동시에 하나의 공유 자원을 접근할 때 데이터 충돌을 방지하기 위한 기능  Interlocked의 아쉬운점앞서 설명한 Interlocked은 정수형 밖에 사용하지 못한다거나, 코드가 여러줄일 경우에는 굉장히 비효율적이다 라는 단점들이 발생한다. 단순히 정수를 더하거나, 빼는 것이 아닌 코드의 길이가 길 때, Lock을 사용할 수 있다.  static object _obj = new object();static void Thread_1(){ for (int i = 0; i  위와 같이 사용할 수 있다. Monitor.Enter과 Monitor.Exit 사이에 실행되는 코드는 다른 쓰레드의 간섭을 받지 않고, 싱글 쓰레..

InterLocked

InterLocked멀티 쓰레드에서 공유하는 변수에 대한 원자 단윈 연산을 제공하는 클래스  class Program{ static int number = 0; static void Thread_1() { for (int i = 0; i   위와 같이 두 개의 쓰레드가 실행된다면 당연히 0이 출력 될 것이다.  class Program{ static int number = 0; static void Thread_1() { for (int i = 0; i    Race Condition(경쟁 상태)하지만 이렇게 반복문의 크기가 더 커진다면 이렇게 의도와 다른 값이 출력 된다. 그 이유는 두 개 이상의 쓰레드가 공유 자원에 대해 읽거나 쓸 때 데이터에..

메모리 배리어

메모리 배리어멀티스레드 환경에서 메모리순서가 강제로 변경되는데, 이때 메모리 순서 변경을 막기위한 방법  코드 재배치 억제1) Full Memory Barrier(어셈블리 MFENCE, C# Thread.MemoryBarrier) - Store/Load 둘다 막는다.2) Store Memory Barrier(어셈블리 SFENCE - Store 막는다)3) Load Memory Barrier(어셈블리 LFENCE - Load 막는다) * 일단은 Full Memory Barrier만 알아 둘 것!  static int x = 0;static int y = 0;static int r1 = 0;static int r2 = 0;static void Thread_1(){ y = 1; //Thread.Me..

캐시 이론

캐시란?데이터 또는 계산 결과를 임시로 저장하는 기술로, 미래에 해당 데이터에 대한 요청이 있을 때, 더 빠르게 응답할 수 있도록 한다. ex) 식당에서 점원이 주문을 받고, 바로 주문현황에 업데이트하지 않고, 잠시 기억했다가 다른 주문도 받고 함께 주문현황에 업데이트를 함. 이때, 기억하는 방법은 단순 기억, 메모장, 큰 메모장 등이 있다. CPU는 여러개의 코어 (멀티 코어)로 이루어져 있음코어는 각각 ALU라는 연산장치와 기억을 하는 캐시장치로 이루어져 있음매번 RAM에 데이터를 갱신하는 것은 부담이 많이 됨캐시는 레지스터, L1 캐시, L2 캐시 처럼 다양한 기억 장치들이 있음 (레지스터 -> L1 캐시 -> L2 캐시 순으로 많은 기억을 함)  캐시 철학Temporal Locality : 시간적..

프로세스와 쓰레드

1. 프로세스(Process)실행 중인 프로그램의 인스턴스각각 독립적인 메모리 공간(Code, Data, Heap, Stack)을 가짐하나의 프로세스는 여러 개의 쓰레드를 포함할 수 있음프로세스 간의 통신은 상대적으로 어렵고 많은 비용이 듦하나의 프로세스가 종료되면 그 안의 모든 쓰레드도 종료  2. 쓰레드(Thread)프로세스 내에서 실행되는 작은 실행 단위프로그램을 실행하는 핵심 역할같은 프로세스 내에서 메모리(Heap, Data 영역)를 공유독립적인 Stack과 레지스터를 가짐프로세스보다 생성 및 종료 속도가 빠르고, 자원을 공유하기 때문에 통신 비용이 적음  3. 동작 방식프로세스는 식당, 쓰레드는 영혼이 없는 직원, CPU 코어는 영혼에 비유프로세스는 하나의 껍질 프로그램 (메모장, 롤, 그림판..