미디어 서버의 처리를 single thread로 구현하는 것에 대해 질문이 있습니다.
특정 미디어 데이타가 입력되면 그걸 프레임단위로 인디코딩을 거쳐 RTP 패킷으로 만들어
소켓을 이용하여 패킷망에 뿌리는 처리를 하는 daemon을 만들어야 하는데요.
multi thread 방식으로 요청이 올때마다 위의 처리를 해주는 thread를 생성하는 방법으로
하는 것은 알겠는데 이것을 single thread로 바꿔야 됩니다.
===============================================================================
multi thred 상에서는 다음과 같은 과정을 거칩니다.
1. daemon에게 해당 연결을 위한 요청메시지를 보내 key값을 얻어옵니다.
2. 얻어온 key를 이용하여 해당 연결에 대해 play 메시지를 보내면 daemon은 play를 처리할 thread를 생성합니다.
3. 이후에 pause, resume , stop과 같은 메시지를 key 이용하여 daemon에게 보내면 해당 key에 해당하는 연결의 play를
제어합니다.
play thread는 nomalizing -> decoding -> encoding -> framing -> send 의 순으로 처리를 하고 flag를 이용하여
pause, resume, stop과 같은 제어를 합니다.
이런 상황은 연결요청마다 play thread를 생성해주는 방법인데 이걸 single thread로 바꿔야 합니다.
=================================================================================================
요청이 올때마다 thread를 생성하는것이 아니라 하나의 play thread에서 모든 요청에 대한 처리를 수행해야합니다.
sigle thread에서 모든 요청을 다 수행해야 되는데 어떤 식으로 설계가 되야 되는지 감이
잡히지를 않습니다.
어떤 식으로 설계를 해야 하는지 도움 부탁드려요.
아는게 거의 없는지라 어떤 조언이라도 감사히 받을게요.
수고하세요.
리눅스라면 epoll을
리눅스라면 epoll을 사용하셔서, 이벤트 기반의 소켓처리 방식으로 하시면 싱글쓰레드로도 원하시는 것 만큼의 효과를 보실 수 있을것입니다.
윈도우라면 당연히 IOCP를 사용하여햐 할 것이구요. IOCP의 특성상 온전한 싱글쓰레드는 힘들겠지만, 비슷하게는 구현이 가능할 겁니다.
epoll에 대한 설명은 joinc wiki등에 잘 나와 있으므로 참고하시면 될듯합니다.
時日也放聲大哭
댓글 달기