공부 학습

게임 서버 공부_멀티스레드 프로그래밍 1

Multitab 2023. 2. 28. 18:03

정보 출처 : 게임 서버 프로그래밍 교과서 (배현직 - 길벗출판사)

프로그램 & 프로세스

  • 프로그램 : 코드와 데이터의 덩어리
  • 프로세스 : 프로그램의 명령어가 실행되는 상태
    • 힙+스택

      스레드

  • 스레드 : 프로게스 내에서 여러개 존재할수 있으며 명령어를 실행하는 단뒤
    • 같은 메모리 공간을 사용할 수 있음
    • 스레드마다 스택을 가짐

      스레드의 필요성

  • 오래걸리는 일을 여럿이 해야할때
  • 긴처리를 진행할 동한 작은 단위의 일을 해야할때
  • CPU를 모두 활용해야할 때

    스레드 운용 훈령

  • Context Switch : CPU가 A스레드에서 B스레드로 작업을 변경하는 과정
  • 스레드 실행 시간보다 컨텍스트 스위치 시간이 길다면 작업이 비효율적임
  • 모든 스레드의 수가 CPU 코어 개수보다 많으면 상관없다
    • Runnable 스레드 구가 CPU 코어 개수보다 많으면 이때부터 문제이다.
  • 경쟁 상태(Data Race) : 복수의 스레드가 동일한 데이터에 접근하는 작업 실행시 스레드의 접근 순서를 보장할수 없음
    • 원자성(Atomicity) : 다수의 스레드가 접근하더라도 접근 순서를 보장하고 한개씩만 접근하능 하도록하는 것
    • 일관성(Consistency) : 데이터 입장에서 스레드에 의해 일관성있는 상태를 유지하는것
    • 동기화(Synchroize) : 원자성과 일관성을 보장하도록 초기하는것

      스레드 동기화 방법론

  • 뮤텍스(Mutex : Mutual Exclusion) or 임계영역(Critical Section) : A스레드가 a데이터를 사용중인데 B스레드가 a데이터에 접근하려면 A가 다 쓸때까지 기다린다.
    std::mutext mx;
    mx.lock(); // 딴놈 오지마!
    read();
    write(y);
    sum(x);
    mx.unlock(); // 일 다봤어~ 문열어 둘게
  • 문제점 : 쓰레드 실행중 unlock()을 매번 호출해야함, 만일 unlock되기전에 오류가 난다면..?
    • 해결법 : lock_guard : 스레드 실행중 데이터가 말소되거나 스레드가 없어질때 unlock 자동 호출
  • C++ 뮤텍스 운용 시나리오
    • 뮤텍스 객체 생성 : std::recursive_mutex
    • 접근시 lock 걸기 : lock()
    • 작업 완료후 unlock 호출 : unlock()
      std::mutex mx;
      {
      std::lock_guard<std::mutex> lock(mx);
      read(x);
      write(y);
      sum(x);
      }
  • 문제점 : 무작정 코어를 많이 사용한다고 좋은 것은 아님
    • 이유 : CPU가 IO에 접근하는 시간이 불가피하기 길어짐 -> 지나진 CPU 동원은 성능에 불리함
  • 문제점 : 무작정 Mutex를 잘게 나누어도 좋은게 아님
    • 이유 : 프로그램 구현이 지나치게 복잡해짐
    • 이유 : 뮤텍스에 접근하는 과정 자체가 복잡해 성능에 불리함

이상적인 Mutex 사용법 : Context Switch를 덜하면서, IO접근을 적게하고, 적당한 크기의 Mutex 뭉탱이를 가진 프로그램

교착상태

  • 스레드 사이에 일을 기다리다보니 서로 기다리면서 일이 끝나지 않는 상태
    • 여러개의 Mutex가 걸려있는 상황이다. A -> B -> C일 때 교착 상태가 일어나지 않으려면..?
      • A -> B (상관없음)
      • B -> C (상관없음)
      • C -> A (교착상태)
    • 잠금순서를 준수하여 뮤텍스 들을 운용해야 한다.
  • 또한 같은 뮤텍스를 여러번 잠글수도 있다. 이에 적절한 장치가 '재귀 뮤텍스'이다.
    • A -> B -> C의 재귀 뮤텍스가 있다. 교착상태가 일어나지 않으려면..?
      • A -> B -> C -> B -> A (상관없음, 여러번 잠길수 있음)
      • A -> C -> B -> B -> A (교착상태, 최초 잠금 순서에 어긋남)
        교착 상태를 예방하려면 최초 잠금 순서를 지켜야 한다.

병렬성과 시리얼 병목

  • 병렬성(concurrency) : CPU가 스레드 연산을 동시에 실행하여 동시처리량을 올리려는 것
  • 시리얼 병목(Serial bottleneck) : 병렬로 연산이 수행되도록 했지만 CPU한개한 수행하는 것처럼 보이는 현상

'공부 학습' 카테고리의 다른 글

게임 서버 공부_네트워크  (0) 2023.02.28
게임 서버 공부_멀티스레드 2  (0) 2023.02.28
Docker 명령어 정리  (0) 2022.12.17
디자인 패턴 - 관계형 패턴  (0) 2022.11.08
디자인 패턴 - 구조 디자인 패턴  (0) 2022.11.08