epoll 엣지 트리거 관련 질문 드립니다..

zzang3757의 이미지

여러 문서를 찾아봐도,,

레벨 트리거는 버퍼에 데이터가 남아있으면 계속해서 이벤트가 발생하는 것이고..

엣지 트리거는 버퍼에 데이터가 남아있으면 추가적인 데이터가 들어와도 이벤트가 발생하지 않는다고 봤습니다.

서버 소켓을 논블럭소켓으로 설정하고 EPOLL 이벤트에 등록할떄 EPOLLET 를 추가하여 등록하였습니다.

클라이언트가 연결될떄 또한 논블럭으로 살정하고 epoll 이벤트 풀에 EPOLLET 를 추가하여 등록하였습니다.

클라이언트에서 1024바이트씩 100번을 쪼개서 보내면

제 생각에는 서버에서는 EPOLL 이벤트가 1번만 발생해야할것 같은데,,

실제 샘플코드를 만들어서 실행해보니 7번 정도가 발생합니다 -,-,,,

소켓에 설정한것은 위에 말씀드린 논블럭, EPOLL 등록시 EPOLLET 추가 밖에 없습니다..

왜 이런건지 알려주세요 ㅜ

익명 사용자의 이미지

엣지 트리거는 "상태변화"를 감지하는 걸로 알고있습니다.

그리고 클라이언트에서 1024 * 100 = 100KB를 보냈다고 해도 이것이 서버에 한번에 도착하지는

않습니다. 서버쪽에서는 몇번 나뉘어서 받게 되겠죠. 만약 16KB로 쪼개져서 들어온다고 가정하면,

첫번째 16KB가 도착했을 때 이벤트가 발생하겠죠. 왜냐하면 Recv큐가 비어있는 상태에서 -> 데이터

가 존재하는 상태로 바뀌었으니까요. 이 상태에서 서버가 16KB의 데이터를 읽어서 처리합니다.

그러면 다시 비어있는 상태로 변화하죠. 그리고 두번째 16KB가 도착! 역시 비어있는 상태에서 읽을

데이터가 있는 상태로 변화합니다. 이벤트가 또 발생할 것이고, 아마 이런식으로 쭉 이벤트가 총

7번정도 발생한게 아닌가 싶네요.

zzang3757의 이미지

우선 답변 감사드립니다.

제가 작성한 샘플 코드에는 서버에서는 일부러 엣지 트리거가 동작하는 방식을 확인하기 위하여,, 데이터가 도착했다는 이벤트가 발생하더라도 실제 Read 를 하지 않고있었습니다...ㅠ

익명 사용자의 이미지

Read를 하지 않더라도 데이터가 나뉘어서 들어오는 경우 epoll_wait이 여러번 블록 상태에서

풀려날 수도 있습니다.

1. 100KB중 일부 데이터 도착
2. epoll_wait 리턴
3. epoll_wait 재호출(블록됨)
4. 클라이언트로부터 일부 데이터가 다시 도착
5. epoll_wait 리턴
6. 2~5 반복...
7. 최종적으로 모든 데이터가 도착하게 되면 epoll_wait 재호출로 인해 블록상태에 머물게 되는거 같습니다.

댓글 달기

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