ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 멀티스레딩
    책/게임서버 프로그래머 책 2024. 5. 26. 16:16

    1. 교착상태 디버그 ( CRITICAL_SECTION )

    • 윈도에서 제공 임계영역 체크
    • DEBUG -> Windows -> Threads
    • Threads의 정보를 통해 Thread ID 값과  Location을 통해 호출 스택 확인 가능

    2. 병렬성 확인 ( CPU가 병렬적으로 처리되고 있는지 확인 )

    • Tools -> Concurrency Visualizer 설치

    3. 싱글스레드 게임 서버

    • CPU 개수 별로 프로세스를 만들어서 구동
    • 이것도 한가지 방법이지만 메모리 공유가 안되고, 컨텍스트 스위칭에서 많은 자원이 소모됨
    • 해결책) 코루틴 / 비동기 함수를 사용하여 자원을 최대한 사용함

    4. 멀티스레드 게임서버

    • 동시접속자를 위해 메모리를 공유할 수 있는 스레드를 활용
    • 스레드의 평균적인 개수
      • 스레드 == 코어 수
      • 단, device time이 존재할 경우 access 하는동안 cpu는 놀으니 그 시간을 다른 스레드에게 할당
      • ex) 1/4 cpu + 3/4 device time  => 스레드개수 * 3 가능
      • ( device time : disk, database, file 접근 )

    5. 세마포어의 역할

    • 세마포어는 뮤텍스 처럼 lock 의 효능처럼 사용 가능
    • 세마포어를 이벤트 발생기 처럼 사용 가능
      • mutex는 event 발생기를 이용하여 스레드 관리 가능
      • 세마포어는 access 수를 지정하여 해당 만큼 access를 허용하고 이외의 값은 대기 시킴 ( 이벤트 발생기의 역할로도 사용 가능 )

    6. 멀티스레드에서 흔히 하는 실수 

    Check) CPU 사용율 확인 (CPU 연산 활용도가 높은지)
    • 읽기와 쓰기 모두에 잠금을 하지 않은 경우
    • 잠금 순서가 꼬였을 때 (A->B->C // A->C->B (x))
    • 너무 좁은 잠금 범위 
    • Device Time이 포함되는 잠금 ( device time동안에 잠금되어있어 CPU이용률이 많이 하락한다 )
      • 콘솔(터미널)출력 -> print/cout : 내부적으로 device Time이 발생 하므로 주의가 필요
    • 잠금의 전염성으로 발생한 실수
      • 포인터로 가리키고 있는 로컬변수가 존재 -> 클래스 멤버변수의 잠금을 해제할경우 로컬변수가 접근을하여 값을 변경할 수 있으므로 잠금을 유지해야한다.
    • 잠금된 뮤텍스나 임계영역 삭제
    • 일관성 규칙 깨기
      • 서로 연관성이 있는 두개의 자료가 따로 잠금되어있는 경우 ( 항상 값이 일정하게 유지된다고 보기 힘듬 )
      • 서로 연관성이 있는 것 끼리는 두개를 포함하는 mutex를 지정하여 보호하고 연산처리 하는 것이 더 낫다
    병렬 자료 구조
    1. 뮤텍스나 임계영역이 없이도 크래쉬가 나지 않는 병렬처리가 가능하다 (ex Queue)
    2. 원자 조작의 경우도 항상 안전한 상태를 유지 할 수 있다
    ( 병렬 자료 구조 / 원자 조작.. 더 찾아봐야겠다..)

     

    ' > 게임서버 프로그래머 책' 카테고리의 다른 글

    Socket과 select  (1) 2024.06.02
    Socket 동기 처리  (1) 2024.06.02
    Socket의 기본 정리 ( feat, Blocking / Non-Blocking )  (0) 2024.05.30
    네트워크 간단 요약  (0) 2024.05.30
    네트워크 기본  (0) 2024.05.26
Designed by Tistory.