poll과 select가 어떻게 틀린가요.

gkqksrl의 이미지

poll과 select가 어떻게 틀린가요...?

jinyeong의 이미지

Quote:
poll과 select가 어떻게 틀린가요...?

"사용법이 다릅니다.!!!!!"

돌 날아 오겠지요 ^^ 이게 제 생각엔 가장 큰 차이입니다 :)

select는 fd_set의 사이즈 제한이 있고, poll은 그런 제한이 없습니다.

성능이나 이런 측면은 큰 차이가 없을 것 같네요.

Socket faq에 Richard Stevens 의 답변입니다. =)

Quote:

2.14. Whats the difference between select() and poll()?

From Richard Stevens (rstevens@noao.edu)

The basic difference is that select()'s fd_set is a bit mask and
therefore has some fixed size. It would be possible for the kernel to
not limit this size when the kernel is compiled, allowing the
application to define FD_SETSIZE to whatever it wants (as the comments
in the system header imply today) but it takes more work. 4.4BSD's
kernel and the Solaris library function both have this limit. But I
see that BSD/OS 2.1 has now been coded to avoid this limit, so it's
doable, just a small matter of programming. :-) Someone should file a
Solaris bug report on this, and see if it ever gets fixed.

With poll(), however, the user must allocate an array of pollfd
structures, and pass the number of entries in this array, so there's
no fundamental limit. As Casper notes, fewer systems have poll() than
select, so the latter is more portable. Also, with original
implementations (SVR3) you could not set the descriptor to -1 to tell
the kernel to ignore an entry in the pollfd structure, which made it
hard to remove entries from the array; SVR4 gets around this.
Personally, I always use select() and rarely poll(), because I port my
code to BSD environments too. Someone could write an implementation
of poll() that uses select(), for these environments, but I've never
seen one. Both select() and poll() are being standardized by POSIX
1003.1g.

역시 별 차이가 없다. 그런 내용이지요 :)

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

낙엽의 이미지

글쎄요?

제가 알기론(자세히는 찾아봐야겠지만..) select는 fd_set을 loop로 일일이 찾아봐서 set된것을 찾지만, poll은 방식에 있어서 좀 차이가 있는것으로 알고있는데요..

자료를 찾아보고 다시 글을 올려야 겠군요 ^^

bugiii의 이미지

이름이... -_-;

poll의 가장 큰 특징은 변화를 감지하고자 하는 fd와 원하는 이벤트를 가지는 구조체 배열을 주면 그중에 변경된 사항을 그 배열에 일어난 이벤트를 세팅해서 돌려주는 특징이 있습니다.

select는 만약 fd가 0, 999 두개만 조사해도 되는 경우에 모든 0~999까지 전부 세팅해서 넘겨주고 리턴될 때에도 최악의 경우 모든 걸 다 검사해봐야 하는 경우가 생깁니다. (검사시 갯수를 세면서 하면 좀 더 빨리 끝날 수도 있지만 최악은 전부 검사)

poll이 조금 더 낫기는 하지만... 둘다 어떻든 매번 똑같은 내용을 넘겨야 한다는 것도 부담이고... 그래서 좀 더 효율적인 epoll 이나 kqueue 를 사용한다고 합니다.

낙엽의 이미지

bugiii wrote:
이름이... -_-;

올인~ ^^;

jinyeong의 이미지

Quote:

글쎄요?

제가 알기론(자세히는 찾아봐야겠지만..) select는 fd_set을 loop로 일일이 찾아봐서 set된것을 찾지만, poll은 방식에 있어서 좀 차이가 있는것으로 알고있는데요..

자료를 찾아보고 다시 글을 올려야 겠군요 ^^

네.. 내부적인 구현으로는 bugiii 님께서 말씀하신대로, poll 쪽이 좀 더 유리 합니다.

select는 사실 request가 아주 많은 곳에서는 사용하기 꺼려지지요..

그렇지만 bugii 님 말씀대로 그런 사항이 고려 되어야 한다면,

kqueue, epoll, /dev/poll(solaris경우) 등이 쓰여야 한다고 봅니다.

제가 너무 단정적으로 말했나보네요. ;)

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

fox9의 이미지

질문과는 무관한 내용이지만...

select보다는 poll이 유리한 점이 많아서 어떤 OS에서는 아예 내부적으로는 둘다 poll로 구현을 해놓고 그것으로 하나는 select처럼 동작하도록 (기존 소스등의 호환성을 위해서) 해놓은 것도 있다고 하더군요.

amister의 이미지

poll 이 항상 select보다 좋을 수는 없습니다.

수가 굉장히 많고, 연속적이며, 이벤트가 자주 발생하는 시스템에서는 select가 더 좋습니다. 구현을 이상하게 하지 않은 이상 말이죠.

fd가 어느정도 이산되어있거나 개수가 많지 않은 경우 등에는 당연히 poll이 유리합니다.

select -> fdset을 첫번째 arg인 max_fd만큼 linear scan
poll -> array list following

위와 같이 fd list를 따라가는 방식의 차이로 인한 것이지요. 상황에 맞게 적절히 사용하는 것이 중요합니다.

서지훈의 이미지

쉽게 설명을 드리면...

비오는날 술은 땡기고 해서 한 잔을 걸치로 갑니다.
물론 우산을 쓰고 가야겠지요.
이때...
우산을 잊어먹지 않기 위해 옆에 있는 우산을 한 잔 마실때 마다 확인하는게 poll입니다.
select는 우산을 자기의 허리에 묶어 두고 뭔가 신호가 있을 때...
확인을 하는 방식입니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

gkqksrl의 이미지

위의 우산의 비유는 좀 무리가 아닐까 하는데요.

poll이든 select든 계속 폴링하는건 같지 않은가요.

real time signal과 혼동하신것이 아니신지요.

jinyeong의 이미지

level-trigger와 edge-trigger의 차이를 말씀하시는 건가요?

그렇다면, poll 이나 select는 둘다 마시면서 우산을 봐줘야 하는 게 아닐까요?

술을 마시기 시작하는데 먹구름이 끼었습니다.

level-trigger는 계속 우산을 확인합니다.

edge-trigger는 비가 내리는 순간 우산을 확인합니다.

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

댓글 달기

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