select() 리턴값

착이의 이미지

select() 함수는 변경된? 디스크립터들의 수를 리턴한다는데, 어느정도의 기간동안 일어난 것일까요..

정말 정말 거의 동시에 일어나지 않는 한 '1'을 리턴할까요?

그렇다면 2 이상의 값이 반환되려면 어느정도의 시간 차로 이벤트? 가 일어나야 할지 ^^;

ssehoony의 이미지

리턴하는 개수는
select 함수를 콜한후 그 다음 select 함수를 콜한 사이에 일어난 모든 이벤트 입니다.

rasungboy의 이미지

착이 wrote:
select() 함수는 변경된? 디스크립터들의 수를 리턴한다는데, 어느정도의 기간동안 일어난 것일까요..

정말 정말 거의 동시에 일어나지 않는 한 '1'을 리턴할까요?

그렇다면 2 이상의 값이 반환되려면 어느정도의 시간 차로 이벤트? 가 일어나야 할지 ^^;

기간은 중요하지 않습니다. 즉 이벤트가 일어났냐 안일어났냐

만 검사할뿐이죠.

예를들어 READ 이벤트가 일어났고 이 이벤트에 따라 recv()

를 호출해서 데이타를 받아야 한다고 할때 만약 recv() 호출 하지

않고 그냥 넘어갔다면 다음번 select 에서도 READ 이벤트가

감지 될겁니다. 그래서 이 이벤트가 실제로는 SELECT 를 호출한

시점에 발생한거는 아니라는 거죠. select 는 단순히 지정된 시

간동안 지정된 fd_set 들을 검사해서 이벤트가 발생한것만 반환

해주니까요.

착이의 이미지

리턴값을 받아와서 FD_ISSET() 을 확인해서 처리한 뒤에 하나 감소시키고 0이면 while문에서 continue를 적용하길래.. 한번에 두개를 받아오는게 아니라 처리안한게 있으면 다시 리턴이 되는거군요 ^^;

확실하게 처리?만 해주면 꼭 리턴값을 쓰지 않아도 되겠군요!

감사합니다 ^^

is null?

익명 사용자의 이미지

착이 wrote:
리턴값을 받아와서 FD_ISSET() 을 확인해서 처리한 뒤에 하나 감소시키고 0이면 while문에서 continue를 적용하길래.. 한번에 두개를 받아오는게 아니라 처리안한게 있으면 다시 리턴이 되는거군요 ^^;

확실하게 처리?만 해주면 꼭 리턴값을 쓰지 않아도 되겠군요!

감사합니다 ^^

음 위글을 읽으면, 뭔가 아햏햏한데요.

다음 시나리오를 생각해 보세요.

1. 현재 10개의 클라이언트가 접속해 있다.(Listen까지 11개의 소켓이 있을것으로 예측)
2. select()에서 2가 리턴되었다.
=> 11개중 2개에서 이벤트가 발생됨
=> 이경우 2개에 대해 서비스를 해야함
==> 문제, 그런데, 11개중 어느 2개에서 이벤트 발생인지 몰라!
==> 아는 방법? FD_ISSET()으로 11개에 대해 검사하는 거지 뭐.
3. 그렇다면, 11개라면, 11번 루프를 돌면서 체크해야할까?
아니면, 11개중 2개를 처리하면 루프를 빠져서 다시 select()로 가도 될까(continue)?

음... 재수좋아서, 앞에 2개가 연속적으로 이벤트 발생시킨 것들이라면, 구지 루프를 11번 돌필요없이 2번 돌고 끝....

4. 당근.

착이의 이미지

이전에 처리하지 않은 이벤트가 존재하지 않는 한 리턴값은 1보다 크지 않다는 것으로 해석한건데.. 처음에 제가 올린 질문도 전에 처리하지 않은 이벤트가 없을 경우에 2 이상이 리턴될 수 있느냐는 것이었고요;

이 뜻이 아니었나요?

is null?

익명 사용자의 이미지

select()는 Level trigger 입니다. 이것은 recv() 할게
남아 있을 때에는 무조건 이벤트 발생건수가 있다고
판단합니다.

하나의 fd에서 상대편이 두번 send() 했다고 해서
이벤트 두번이 아닙니다. 중요한 것은 수신소켓 버퍼에
recv() 할 것이 남아 있는지 없는지만 중요합니다.

이벤트가 있다고 리턴되더라도 recv()를 통해서
소켓버퍼에서 모두 읽어오지 않으면 그 소켓은
여전히 이벤트가 있는 것으로 select()에서 리턴할겁니다.

Level trigger. 즉, 수신소켓버퍼가 비어 있는지
아닌지만 감지할수 있는 트리거입니다.

익명 사용자의 이미지

착이 wrote:
이전에 처리하지 않은 이벤트가 존재하지 않는 한 리턴값은 1보다 크지 않다는 것으로 해석한건데.. 처음에 제가 올린 질문도 전에 처리하지 않은 이벤트가 없을 경우에 2 이상이 리턴될 수 있느냐는 것이었고요;

이 뜻이 아니었나요?

당연히 2보다 큰값이 항시 발생가능합니다.

zienie의 이미지

Anonymous wrote:

당연히 2보다 큰값이 항시 발생가능합니다.

발생가능은 하지만,
자주 나타나지는 않았던걸로 기억합니다.

저도 이 부분이 궁금해서
Non blocking 700~800 User
초당 평균 2~30 번의 select event 가 발생하는 서버에
select 의 리턴값을 log 에 기록해보니
1이상의 값이 발생하는 빈도는 그리 많지 않더군요.

##########################################################
넘어지는건 아직 괜찮다.
하지만 넘어질때마다 무언가를 주워서 일어나자.

익명 사용자의 이미지

zienie wrote:

발생가능은 하지만,
자주 나타나지는 않았던걸로 기억합니다.
...
700~800
...
1이상의 값이 발생하는 빈도는 그리 많지 않더군요.

단위시간내에 사용자의 interaction이 별로 많지 않아서 그런듯.
특정환경에서 빈도가 그리 많지 않을 수도 있으나, 그 경우에 맞춰 프로그램을 개발할 수는 없겠지요?

당연히, zienie 님의 경우 700~800보다 큰값이 항시 발생가능합니다.
테스트사례에서는 1이 대부분이라는 말씀이 있긴했지만 말입니다.

peccavi의 이미지

위에 언급된 내용들이
poll() 에도 똑같이 적용되는건가요? :oops:

----
jai guru deva om...

댓글 달기

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