select()가 리턴하는 조건에 대해서 의문점인 있습니다..

sharefeel의 이미지

select() 는 버퍼에 읽을 데이터가 있거나 소켓이 끊어지거나 connect 요청이 있을 때 리턴합니다..

제가 궁금한 것은 버퍼에 읽을 데이터가 있을 때 정확히 어떻게 동작하는 지 입니다.
select()를 이용한 가장 쉬운 구조를 생각하면....

while()
{
select();
if (FD_ISSET(listenfd, &rset))
accept();
else
recv();
}

의 구조가 될 것입니다.
하지만 큰 사이즈의 데이터를 받아야 하는 경우라면,,,
recv()에서 시간이 많이 필요할 것이고 그러면 다시 select()가 호출 될 때까지 지연이 되게됩니다.

그래서 스레드를 생성해서..
하나의 스레드는 select()를, 다른 스레드는 recv()를 하는 워커 스레드로 쓸려고 합니다.
하지만 이경우 문제는 recv()가 끝나기 전에 select()가 호출된다는 것입니다.
즉 recv()가 끝나지 않았기 때문에 TCP 버퍼에 데이터가 남아 있는 상황에서 다시 select()가 호출 된다면,
새로운 네트웍 이벤트가 발생하지 않은 상황에서도 select()가 리턴하게 되지않을까요?
지금 설계중인데.. 이런 모델을 실제로 쓰는 지도 궁금합니다..ㅜㅜ

스티븐스씨가 153페이지에서 SO_RCVLOWAT, 즉 워터마크에 대해서 언급을 했는데,,
관련이 있는 것도 같은데 자세히 설명을 하고 있지는 않네요..

하나 생각해볼 수 있는 것이 recv() 하는 소켓 디스크립터를 select()에서 빼면 됩니다.
하지만 그렇게 할경우 recv()가 끝나면 해당 소켓 디스크립터를 다시 select()에 포함 시켜야하고,
이 경우 select()를 임의로 시턴시키고 다시 호출하도록 해야합니다.

아.. 그리고.. 참고로 디스크립터마다 스레드를 주거나 할 입장은 못됩니다.

charsyam의 이미지

제 개인적인 생각으로는 단순히 select 후에 recv를 하는 것만으로

많은 시간을 소모할까요? 그렇게 많은 시간이 걸릴것 같지 않습니다.

그럼 고운 하루되시길...

=========================
CharSyam ^^ --- 고운 하루
=========================

sharefeel의 이미지

큰 데이터는 recv() 시에 많은 시간이 필요하다는 제 생각은 틀린걸까요?
생각해보니 recv()는 WAITALL 같은 옵션 안주면 데이터가 있어도
1000 바이트 조금 더 읽고 리턴하네요..

정말 하나의 루프 안에서 recv까지 호출해도 상관없는 걸까요?
아직 그렇게 트래픽이 많은건 안맹글어봐서리..

그리고 좀 더 찾아보니까 SO_RCVLOWAT는 이 문제랑은 별로 상관이 없네요..
매뉴얼페이지만 찾아봐도 알 수 있었던 것을..쩌비.

===============
Vas Rel Por

choissi의 이미지

워크 쓰레드가 여러개라면,,
여러 쓰레드가 한 fd를 recv하게 된다면

recv 버퍼 때문에
결국 동기화 작업을 해줘야 할텐데요..

Quote:
즉 recv()가 끝나지 않았기 때문에 TCP 버퍼에 데이터가 남아 있는 상황에서 다시 select()가 호출 된다면,
새로운 네트웍 이벤트가 발생하지 않은 상황에서도 select()가 리턴하게 되지않을까요?

요것은 질문하신분의 예상이 맞습니다.
읽어가지 않으면 바로 다음번 select에 또 read 이벤트가 걸립니다.

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

ifyou의 이미지

정확한 용도는 모르겠지만, 지금 코드 그대로 사용하셔도 문제 될 것 없을 것 같은데..

recv()한 후 select() 호출되기까지 시간이 걸리는 것이 왜 문제가 되는지 모르겠네요. recv()할때 버퍼를 아무리 크게 잡아도 한번에 다 못 받고 결국은 lopp를 돌게 될텐데요..

아니면, 하나의 select()로 여러개의 소켓을 감시하는 것인가요? 그렇다고 해도 큰 문제는 되지 않을 것 같은데.. 아니면, 애초에 쓰레드를 사용하거나..
윈도의 iocp와 같은 것을 원한다면.. 유닉스에는 지원이 안되는 걸로 알고 있습니다.

아직 비몽사몽이라 틀린 것일 수도.. zzZZZ

낙엽의 이미지

참고하세요..
윈도우의 kqueue가 iocp와 비슷한 모델로 알고있는데요..
http://www.ezdoum.com/stories.php?story=02/07/18/0795779

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.