select 를 thread 로 분리....
글쓴이: notunix / 작성시간: 목, 2004/03/11 - 4:40오후
안녕하세요
제가 select를 thread 로 분리해놓고
accept 되면 메인 loop에서 FD_SET 을 하고
select는 변화가 있는 소켓에서 recv 를 해서
데이터를 받도록 했는데요
일반적인 데이터는 잘 받는데
client 가 소켓을 끊을 경우 close 신호를 두번 받더군요
그래서 같은 소켓을 두번 close 하게 되던데
이런 저런 방법을 써도 해결이 잘 안됩니다
잘아시는 분의 조언을 부탁드립니다
그리고 select 로 받을 수 있는 소켓이 1024 이하인데
이를 커널 컴파일 할때 옵션을 줘서 더 늘릴 수 있다고 하던데요
늘리게 되면 발생할 수 있는 문제점이 있나요 ?
(뭐 유머처럼 소켓을 두번 죽이는 일이 ^.^;; )
Forums:
정확한 문제는 딱 찝어서 얘기하기에는 자료가 부족하니제가 문제가
정확한 문제는 딱 찝어서 얘기하기에는 자료가 부족하니
제가 문제가 예상되는 부분을 이야기해보도록 하겠습니다..
select 에서 소켓이 끈어질경우 이벤트를 받고 처리를 바로 해주지
않는다면.. 다음 select가 콜될때 다시 이벤트를 받습니다..
제가보기엔 Thread 환경에서 적당한 동기화가 필요하지 않나 싶습니다.
select와 recv하는 부분이 쓰레드로 분리되있다면.. 역시 비동기화
되기때문에 select와 recv 하는 부분에서 이벤트가 중복될경우가 있을것같습니다.
해당 file descriptor가 select에서 recv하는 Thread로 전환될때..
명시적으로 select 그룹에서 예외시켰다가 Thread에서 처리후 다시
select 그룹으로 포함을 시키던가 아니면.. Thread recv 처리후
접속이 종료되는것이라면 그상태로 해당 Thread가 close하면 되겠지요
모 결론적으로 select 하는 Thread와 recv하는 쓰레드가 분리되어서
서로 해당 fd로 동기화없이 작동한다면 그런 문제가 발생할수 있습니다..
참고하시길 바랍니다..
' 형식이 내용을 규정한다. '
답변 감사합니다...
답변 감사합니다
제가 테스트 해보니까
client 연결후 접속을 끊으니까
result = select(fd+1, fdRead, 0,0, timeout);
select thread에서 감지하고 close 처리를 한번 하고
그 이후에 fd 의 변화는 없지만 block 되던 selec가
timeout 에 의해 처리되어 질때 select의 return 값이
-1 이면 에러 0이면 timeout 으로 인식하게
분기를 했는데 fd에 변화가 있는것으로 처리가 되어서
close 처리를 한번 더 하게 되더군요
답변해주신 내용을 참고해서 더 테스트를 해봐야 겠습니다
작은 행복
쓰레드를 생성하고 그 쓰레드 안에서 select 를 하는건가요?만약
쓰레드를 생성하고 그 쓰레드 안에서 select 를 하는건가요?
만약 그렇다면 그렇게 하시지 않는 편이 좋습니다.
물론, 프로그램은 작동하지만 쓰레드를 사용하는 이유가 반응시간을 줄이자는 취지에서 사용하는 걸텐데요.
thread 생성이나 fork 후 동일한 소켓을 select 하는 프로세스나 쓰레드가 복수개 이면 thundering herd problem 이 발생합니다.
http://www.faqs.org/docs/jargon/T/thundering-herd-problem.html
댓글 달기