epoll 엣지 트리거 관련 질문 드립니다..
글쓴이: zzang3757 / 작성시간: 월, 2013/11/04 - 4:38오후
여러 문서를 찾아봐도,,
레벨 트리거는 버퍼에 데이터가 남아있으면 계속해서 이벤트가 발생하는 것이고..
엣지 트리거는 버퍼에 데이터가 남아있으면 추가적인 데이터가 들어와도 이벤트가 발생하지 않는다고 봤습니다.
서버 소켓을 논블럭소켓으로 설정하고 EPOLL 이벤트에 등록할떄 EPOLLET 를 추가하여 등록하였습니다.
클라이언트가 연결될떄 또한 논블럭으로 살정하고 epoll 이벤트 풀에 EPOLLET 를 추가하여 등록하였습니다.
클라이언트에서 1024바이트씩 100번을 쪼개서 보내면
제 생각에는 서버에서는 EPOLL 이벤트가 1번만 발생해야할것 같은데,,
실제 샘플코드를 만들어서 실행해보니 7번 정도가 발생합니다 -,-,,,
소켓에 설정한것은 위에 말씀드린 논블럭, EPOLL 등록시 EPOLLET 추가 밖에 없습니다..
왜 이런건지 알려주세요 ㅜ
Forums:
샘플코드를 어떻게 구현하셨는지는 모르겠지만
엣지 트리거는 "상태변화"를 감지하는 걸로 알고있습니다.
그리고 클라이언트에서 1024 * 100 = 100KB를 보냈다고 해도 이것이 서버에 한번에 도착하지는
않습니다. 서버쪽에서는 몇번 나뉘어서 받게 되겠죠. 만약 16KB로 쪼개져서 들어온다고 가정하면,
첫번째 16KB가 도착했을 때 이벤트가 발생하겠죠. 왜냐하면 Recv큐가 비어있는 상태에서 -> 데이터
가 존재하는 상태로 바뀌었으니까요. 이 상태에서 서버가 16KB의 데이터를 읽어서 처리합니다.
그러면 다시 비어있는 상태로 변화하죠. 그리고 두번째 16KB가 도착! 역시 비어있는 상태에서 읽을
데이터가 있는 상태로 변화합니다. 이벤트가 또 발생할 것이고, 아마 이런식으로 쭉 이벤트가 총
7번정도 발생한게 아닌가 싶네요.
우선 답변 감사드립니다. 제가 작성한 샘플 코드에는
우선 답변 감사드립니다.
제가 작성한 샘플 코드에는 서버에서는 일부러 엣지 트리거가 동작하는 방식을 확인하기 위하여,, 데이터가 도착했다는 이벤트가 발생하더라도 실제 Read 를 하지 않고있었습니다...ㅠ
Read를 하지 않더라도
Read를 하지 않더라도 데이터가 나뉘어서 들어오는 경우 epoll_wait이 여러번 블록 상태에서
풀려날 수도 있습니다.
1. 100KB중 일부 데이터 도착
2. epoll_wait 리턴
3. epoll_wait 재호출(블록됨)
4. 클라이언트로부터 일부 데이터가 다시 도착
5. epoll_wait 리턴
6. 2~5 반복...
7. 최종적으로 모든 데이터가 도착하게 되면 epoll_wait 재호출로 인해 블록상태에 머물게 되는거 같습니다.
댓글 달기