-
멀티스레딩책/게임서버 프로그래머 책 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