정보 출처 : 게임 서버 프로그래밍 교과서 (배현직 - 길벗출판사)
프로그램 & 프로세스
- 프로그램 : 코드와 데이터의 덩어리
- 프로세스 : 프로그램의 명령어가 실행되는 상태
- 힙+스택
스레드
- 힙+스택
- 스레드 : 프로게스 내에서 여러개 존재할수 있으며 명령어를 실행하는 단뒤
- 같은 메모리 공간을 사용할 수 있음
- 스레드마다 스택을 가짐
스레드의 필요성
- 오래걸리는 일을 여럿이 해야할때
- 긴처리를 진행할 동한 작은 단위의 일을 해야할때
- 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 (교착상태)
- 잠금순서를 준수하여 뮤텍스 들을 운용해야 한다.
- 여러개의 Mutex가 걸려있는 상황이다. A -> B -> C일 때 교착 상태가 일어나지 않으려면..?
- 또한 같은 뮤텍스를 여러번 잠글수도 있다. 이에 적절한 장치가 '재귀 뮤텍스'이다.
- A -> B -> C의 재귀 뮤텍스가 있다. 교착상태가 일어나지 않으려면..?
- A -> B -> C -> B -> A (상관없음, 여러번 잠길수 있음)
- A -> C -> B -> B -> A (교착상태, 최초 잠금 순서에 어긋남)
교착 상태를 예방하려면 최초 잠금 순서를 지켜야 한다.
- A -> B -> C의 재귀 뮤텍스가 있다. 교착상태가 일어나지 않으려면..?
병렬성과 시리얼 병목
- 병렬성(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 |