iocp, epoll, kqueue??

hascoms의 이미지

NT에서 IOCP를 BSD에서는 kqueue를
리눅스 2.6커널부터는 epoll을 기술을 사용하는 것으로 알고 있습니다.
그렇다면 유닉스에서는 IOCP나 epoll, kqueue와 비슷한 퍼포먼스를 내는 어떠한 기술이
있는지 궁금합니다.
엄청난 초보라서.. 좀 쉽게 설명부탁드립니다. ^^;;

ddoman의 이미지

몰랐는데, Solaris도 IOCP를 지원하는군요.
http://en.wikipedia.org/wiki/Input/output_completion_port

어쨋든,
아직 시작하시는 단계라고 하니, 드릴 수 있는 조언은
무작정 좋은 툴을 찾기보다,
어떤 문제들이 있어왔는지, 그래서 그 좋은 툴들이 왜 나와서 어떻게 그 문제들을 풀고 있는지
공부하시는게 중요하다는것 입니다.

혹 관련분야로 앞으로도 공부 해보고 싶으시다면,

The C10K problem 이라는 문서부터 읽어보시길 권장드립니다.
http://en.wikipedia.org/wiki/C10k_problem
http://www.kegel.com/c10k.html

그 문서를 보다보면,
왜 kqueue, epoll, IOCP 같은것이 나왔으며

많은 수의 커넥션을 처리하는 네트워크 서버에서 발생할 수 있는 문제 들에 대한 설명과 함께
비교도 해줍니다.

또한 lighttpd 의 블로그에도 좋은 글이 많습니다.

http://blog.lighttpd.net/articles/2006/11/12/lighty-1-5-0-and-linux-aio
http://www.lighttpd.net/2007/2/3/raw-io-performance
http://www.lighttpd.net/2007/2/11/buffered-io-performance

저 글들에서는 리눅스의 Asynchronous I/O 에 대한 비교를 많이하는데( MS Windows의 IOCP도 Asynchoronous I/O의 일종입니다. )
리눅스에서도 async I/O가 이제는 괜찮은 선택이라는 결과를 보여줍니다.

hascoms의 이미지

우선 답변 감사드립니다. 많은 도움이 되었습니다.
한가지 궁금한 것이 솔라리스 10부터 IOCP를 지원한다는 건가요???
문서를 봐도 무슨말인지 이해가 좀 안되서요;;
제가 조사하는 게 유닉스에서 사용할 수 있는 개선된 poll() 기술이거든요 ㅎ

김정균의 이미지

linux의 epoll이 개선된 poll 이기는 하지만 solaris의 poll이 개선된 것이다라고 하기는 힘이 듭니다. 기존에 있는 linux의 poll이 워낙 구리게 구현이 되어 있어서 epoll이 나타났고 (처음에는 solaris처럼 /dev/poll을 사용하여 devpoll 이라고 하기도 했습니다.) 커널 2.5에 들어온 후에 2.6 나오기 직전 devpoll 방식에서 kernal symbol로 변경이 되었습니다.

그래서 꼭 solaris의 poll 보다 개선이 되어진 것이라고는 하기 힘들지 않을까 싶습니다.

tj의 이미지

poll/select(2)가 구린 건 구현이 문제가 아니라 API 자체의 문제입니다. 호출 사이에 context가 전혀 없기 때문에 제대로 된 방법으로 scalable하게 구현할 수 없어요 (볼 fd수를 N이라고 할 때 매 호출의 복잡도 O(N)). 그래서 kqueue, epoll, /dev/poll 등이 나온거구요 (매 호출의 볼 fd수에 대한 복잡도 O(1)). 구현이 문제면 API는 그대로 두고 구현만 바꾸지요.

kqueue, epoll, /dev/poll 인터페이스는 약간씩 다르지만 내용은 거의 같고, select/poll이 개선된 것이라고 보통 그럽니다.

김정균의 이미지

흠 그런가요? solaris에서 poll을 사용해 본적이 없어서 정확히는 모르겠지만, 전 epoll이 solaris의 poll을 제대로 구현한 것이라 알고 있었는데, 지금 검색해 보니 select나 poll이나 비슷하게 동작하는 놈이었네요. 제 의견 철수 시키도록 하겠습니다. T.T 8년전에 귀동냥한 정보를 지금까지 진실로 믿고 있었네요 ㅋㅋㅋ

ddoman의 이미지

네. 솔라리스 10부터 IOCP 를 지원하네요. 제가 링크해놓은 위키페이지에
해당 문서가 링크되어있으니 읽어보시는것도 좋겠습니다.

일단 "유닉스"라는 말의 정의에 대해서 명확히 하시는것이 좋겠습니다.

유닉스 계열 (Unix Like OS)의 운영체제를 말하는것인지
POSIX competible UNIX를 말하는것인지

아니면 정말, 지금은 SCO에서 라이센스를 가지고 있는 UNIX System V류의 유닉스를 말하는것인지

혹 유닉스에 익숙치않아, 무슨말인지 잘 모르시겠다면, http://en.wikipedia.org/wiki/Unix
부터 읽어보시길 권장드립니다.

아무튼,
Solaris에서 사용할 수 있는 개선된 poll은 /dev/poll
Linux에서는 epoll
FreeBSD에서는 kqueue

야 유명한 툴들이지만

다른 BSD류 OS나, HP-UX, AIX, 등등에 대해서는 잘 모르겠네요.

댓글 달기

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