select 를 thread 로 분리....

notunix의 이미지

안녕하세요

제가 select를 thread 로 분리해놓고

accept 되면 메인 loop에서 FD_SET 을 하고

select는 변화가 있는 소켓에서 recv 를 해서
데이터를 받도록 했는데요
일반적인 데이터는 잘 받는데
client 가 소켓을 끊을 경우 close 신호를 두번 받더군요
그래서 같은 소켓을 두번 close 하게 되던데
이런 저런 방법을 써도 해결이 잘 안됩니다
잘아시는 분의 조언을 부탁드립니다

그리고 select 로 받을 수 있는 소켓이 1024 이하인데
이를 커널 컴파일 할때 옵션을 줘서 더 늘릴 수 있다고 하던데요
늘리게 되면 발생할 수 있는 문제점이 있나요 ?

(뭐 유머처럼 소켓을 두번 죽이는 일이 ^.^;; )

liongo의 이미지

정확한 문제는 딱 찝어서 얘기하기에는 자료가 부족하니

제가 문제가 예상되는 부분을 이야기해보도록 하겠습니다..

select 에서 소켓이 끈어질경우 이벤트를 받고 처리를 바로 해주지

않는다면.. 다음 select가 콜될때 다시 이벤트를 받습니다..

제가보기엔 Thread 환경에서 적당한 동기화가 필요하지 않나 싶습니다.

select와 recv하는 부분이 쓰레드로 분리되있다면.. 역시 비동기화

되기때문에 select와 recv 하는 부분에서 이벤트가 중복될경우가 있을것같습니다.

해당 file descriptor가 select에서 recv하는 Thread로 전환될때..

명시적으로 select 그룹에서 예외시켰다가 Thread에서 처리후 다시

select 그룹으로 포함을 시키던가 아니면.. Thread recv 처리후

접속이 종료되는것이라면 그상태로 해당 Thread가 close하면 되겠지요

모 결론적으로 select 하는 Thread와 recv하는 쓰레드가 분리되어서

서로 해당 fd로 동기화없이 작동한다면 그런 문제가 발생할수 있습니다..

참고하시길 바랍니다..

' 형식이 내용을 규정한다. '

notunix의 이미지

답변 감사합니다

제가 테스트 해보니까
client 연결후 접속을 끊으니까

result = select(fd+1, fdRead, 0,0, timeout);

select thread에서 감지하고 close 처리를 한번 하고
그 이후에 fd 의 변화는 없지만 block 되던 selec가
timeout 에 의해 처리되어 질때 select의 return 값이
-1 이면 에러 0이면 timeout 으로 인식하게
분기를 했는데 fd에 변화가 있는것으로 처리가 되어서
close 처리를 한번 더 하게 되더군요

답변해주신 내용을 참고해서 더 테스트를 해봐야 겠습니다

작은 행복

ssehoony의 이미지

쓰레드를 생성하고 그 쓰레드 안에서 select 를 하는건가요?
만약 그렇다면 그렇게 하시지 않는 편이 좋습니다.
물론, 프로그램은 작동하지만 쓰레드를 사용하는 이유가 반응시간을 줄이자는 취지에서 사용하는 걸텐데요.
thread 생성이나 fork 후 동일한 소켓을 select 하는 프로세스나 쓰레드가 복수개 이면 thundering herd problem 이 발생합니다.

http://www.faqs.org/docs/jargon/T/thundering-herd-problem.html

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.