inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Server Service

IocpObject가 없어질 수 있는 이유에 대한 질문입니다.

14

한천

작성한 질문수 3

0

강의에서 여러차례 강조 주신 'IO 작업을 걸어놨을 때 IocpObject가 사라지면 안된다'에서 IocpObject가 사라질 수 있는 상황에 대해 생각해봤습니다.

shared_ptr을 사용하면 refcounting이 되니까 안전하다고 생각을 했는데, "WSARecv나 WSASend 같은 함수들이 비동기/논블로킹 함수라 바로 결과를 반환해버려서 더 이상 해당 함수들이 IocpObject에 대한 refcounting을 유지하지 못한다"가 맞을까요?


항상 강의 영상 잘 보고 있습니다. 좋은 강의 감사드려요!

네트워크 MMORPG windows-server

답변 2

1

Rookiss

네 맞습니다.
커널 레벨에서는 여전히 해당 메모리를 참조하는데,
우리가 관리하는 유저레벨에서는 불필요하다 생각해서 메모리를 밀어버리면 대참사가 일어납니다.

0

한천

답변 감사합니다!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 한천님.

질문하신 내용처럼 WSARecvWSASend는 비동기로 작업을 등록한 뒤 즉시 반환할 수 있습니다. 이때 함수 자체가 IocpObject에 대한 shared_ptr 참조를 계속 유지해 주는 것은 아닙니다.

따라서 비동기 IO가 완료되기 전에 IocpObject를 관리하던 외부 shared_ptr가 모두 해제되면 객체가 소멸할 수 있습니다. 이를 방지하려면 비동기 작업을 나타내는 이벤트 객체나 별도의 ownershared_ptr<IocpObject>를 보유하여, IO 완료 통지가 처리될 때까지 객체의 생명주기를 유지해야 합니다. IO 완료 후 해당 참조가 해제되면서 객체가 안전하게 소멸할 수 있습니다.

관련하여 비동기 IO 중 Session 객체의 생명주기를 유지하기 위해 이벤트 객체에 owner를 두는 이유를 설명한 답변을 참고해 주세요.

Session #1에서 owner를 이용한 레퍼런스 관련한 부분 질문입니다.

추가로 shared_ptr 기반의 참조 카운팅이 필요한 상황과 비동기 송신 중 객체 및 버퍼의 생명주기 관리에 대해서는 다음 답변도 관련이 있습니다.

SendBufferRef에 대하여 질문 있습니다.

핵심은 WSARecvWSASend가 반환되었다고 해서 IO 작업이 끝난 것이 아니며, 완료 통지가 올 때까지 IocpObjectOVERLAPPED 기반 이벤트 객체가 유효해야 한다는 점입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

CS 기초 지식이 필요없는 세상이 오지 않을까요?

0

127

2

DeadLock 탐지에서 재귀 Lock 상황에 대해 궁금합니다.

0

89

2

LockFreeStack #2에서 ABA 문제

0

62

1

RefCounting 강의 질문있습니다.

0

85

2

writeLock을 잡을때 꼭 empty 상태여야하는 이유?

0

101

2

Memory Pool에서 오버플로우 질문입니다.

0

117

2

포토폴리오 및 진로 관련하여 고민입니다.

0

225

1

포토폴리오 관련 고민입니다.

0

128

1

실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.

0

136

2

성능 테스트 결과

0

136

2

게임 서버 Stateful, Stateless 진로 고민

0

177

1

WaitOnAddress와 Sleep의 차이 질문

0

130

1

궁금한거 있습니다.

0

117

2

JobTimer 구동 스레드

0

146

2

TryPop() 동작 관련 질문

0

109

1

로드맵 C#서버 C++서버 방향성 질문

0

200

2

스레드 id를 출력할떄 메인스레드 id도 출력되나요?

0

96

1

생명주기를 위한 의도적 복사

0

120

2

락프리의 실무에서 사용 질문

0

189

2

32bit threadID와 16비트 상위 WriteFlag에 대해

0

131

2

mutex와 sleep 차이점

0

152

1

실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다

0

195

2

Stomp Allocator의 Release함수에 대한 질문입니다.

0

123

1

공부법 관련해서

0

213

2