만 접속이상의 프로그램 구현에 관한 Thread pool에 관하여
우선 전의 질문들에 관심가져주시고 답변 주심분들께 다시한번 감사하단 말씀
드리구요.. 답변 주신내용을 토대로 어떤 방법으로 구현할지를 정하고
진행하던중에 막히는 부분이 있어서 다시 질문을 올립니다.
답변 주셨던 내용을 토대로 epoll과 thread pool을 사용하려 합니다.
15개정도의 쓰레드 풀을 만들고 접속이 들어오면 각 쓰레드에 접속된소켓을
넘기려구 하는데요.. 조인시나 이런사이트에 올라와있는 예제들을 보면
놀구있는 쓰레드 (pthread_cond_wait하는 쓰레드)깨워서 전역변수로부터
접속된 소켓을 읽게 했더군요 헌제 저같은경우는 쓰레드마다. 1000개정도의
접속된 소켓을 처리하려 하다보니 쓰레드가 pthread_cond_wait할수가
없습니다. 쓰레드는 몇개의 접속된 소켓을 처리하다. 또다른 접속이오면
그걸 알고 다시 접속된 소켓을 받아야 한다는것이지요.. 이부분은 어떻게 구현
하면 좋을지 몰겠군요..
정리하자면 쓰레드는 epoll을 통해 접속된 소켓을 처리하고 있어
야하는 상황이면서 새로운 접속이 들어오면 그걸 다시 받아야 하는데요..
(그냥 라운드 로빈방식으로) 기존 접속된 소켓을 처리하면서 새로 접속된
소켓을 받을수 있는 (새로접속이 됐는지 알수있는) 방법이 무얼까 입니다.
최초 클라이언트의 접속은 쓰레드가 pthread_cond_wait하고 있으면
pthread_cond_signal해서 알려주면 되지만 이미 클라이언트를 처리하고
있는 상황에서 어떻게 새로운 접속을 알수 있을까요(혹은 메인에서 알려줄수)
워낙 글치라 제 질문이 제대로 전달 됐을지 모르겠군요
다시한번 고수님들의 따뜻한손길 기다리겠습니다.
PS : 좀 다른 질문인데요.. 지금은 그냥. 연결된 소켓디스크립션을 전역으로
두어서 만들고 있는데요. (메인에 전역배열로 선언) 이렇게 말고 접속된 소
켓을 메인에서는 닫고 작업을 처리해주는 쓰레드에서만 알고 있게 할수
있을 까요..? 아.. 질문이 넘 알아듣지 못하게 된거 같네요..
쓰레드는 프로세스에 종속적이어서 메인에서 소켓을 닫으면 완전히 닫힐
려나요..?
비슷한 예를 저는 이렇게 처리 한적 있습니다.접속된 클라이언트를
비슷한 예를 저는 이렇게 처리 한적 있습니다.
접속된 클라이언트를 소켓 pool에 넣는 스레드 n 개 -- listen 스레드
소켓 pool에서 소켓을 가져와서 실제 서비스를 하는 스레드 m 개 -- service 스레드
소켓 pool용으로 사용할 queue k 개 -- socket pool queue
listen 스레드는 클라이언트의 접속을 기다린다. 서비스 스레드는 pool 큐를 감시한다. pool queue의 갯수와 크기는 적당히 정한다(이부분은 실제 상화에 따라 조정가능한 방향으로 해야 할듯. runtime 혹은 환경 파일로)
서비스 스레드는 각자 적당히 쉬면서 queue를 감시한다. 큐 감시시 lock 메카니즘을 써서 충돌을 방지한다. 여러 스레드가 동시에 같은 큐를 감시하지 않게
작성하고 리슨 스레드는 같은 큐에 넣지 않도록 작성한다.
스레드들의 대기는 select를 이용하면 됩니다.
도움이 되시길.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
.
accept하는 쓰레드 따로 돌리고,
epoll로 read/write 처리하는 쓰레드 pool 따로 준비하고,
round robin 방식이라면 모든 쓰레드 살아있어야 하니까 조건변수 필요없을것이고,
그게 아니라면 한 쓰레드가 처리하는 fd가 full될때까지 다른 쓰레드는 재워야 하니깐 condition variable이 필요하겠지요.
이상 저의 생각입니다...
위 답변주신 두분께 우선 감사하단 말씀드리구요
산하님께서 답변 주신대로 구현을 하려고 하구요. accept만 당당하는 쓰레드가
read/write를 담당하는 쓰레드에게 접속된 소켓디스크립션을 어떻게
넘겨줄까에 관한 질문이었습니다. (넘겨준다기보단 새접속이 있다라는걸 알리
는 방법이죠 쓰레드는 항시 돌고 있기때문에 pthread_cond_signal은 사용
하기 힘들듯하구요) 역시 제가 글솜씨가 영아닌가보군요 T_T
죄송합니다.질문을좀 조리있게 잘해야 답변도 기대할수 있을터인데..
어쨋든 새로운 대안으로 메인쓰레드에서 소켓을 리슨까지 해놓구.
각각의 read/write쓰레드에서 accept까지 처리하게 하는 방법을
생각중입니다. 물론 뮤텍스 처리를 해서 엉키는 일은 방지해야 겠구요
PS : 쓰레드에서 뮤텍스를 많이 쓰면 속도에 저하가 있을까요.?
지금 한 5개정도 사용하고 있네요..(접속처리시에만.)
댓글 달기