CS/Network

06_Multiplexing

@~@ 2024. 7. 24. 00:40

select

https://develop-rock.tistory.com/32

 

03_TCP Connections

TCP connection overviewaccept()를 호출하면 새로운 connect 요청이 들어올 때까지 프로그램 실행이 block 됨recv를 호출하면 읽을 수 있는 새로운 데이터가 들어올 때까지 프로그램 실행이 block 됨 blocking의

develop-rock.tistory.com

 

epoll()

select()는 관찰 대상에 대한 정보가 매번 전달되어야 함

→ epoll()로 해결

  • select()로 100개 이상의 소켓은 무리임(100개의 array를 OS에게 return 해야 하니까)
  • 전체 fd를 대상으로 하는 루프가 없어서 상태 변경을 확인하기 쉬움
  • select()에 해당하는 epoll_wait()을 호출할 때, 관리 대상의 정보를 매번 전송할 필요 없음

 

epoll_event 구조체

  • select()는 fd_set 타입 변수에서 변경된 부분을 매번 체크해야 했음
    → 관찰하고자 하는 fd를 fd_set에 등록하고, 이 변수를 select()에 전달하여 관찰 대상의 상태 변경을 감지하는 방식
    → select 함수를 호출할 때마다 관찰 대상 정보를 새롭게 OS에 전달해야 함, 전체 fd를 대상으로 변경 상태를 확인하는 루프가 필요함
  • epoll method에서는 상태가 변경된 fd들이 epoll_event 구조체를 기반으로 묶여 관리됨
    → 초기에 관찰 대상 fd를 등록한 후, 이벤트가 발생한 fd만을 반환하는 방식으로 동작하기 때문
    → 루프 필요 없음

 

epoll_create()

#include <sys/epoll.h>
int epoll_create(int size);
  • size: epoll 객체의 크기
  • return 값
    • 성공: epoll의 fd
    • 실패: -1

 

epoll_ctl()

epoll에 fd를 add, delete, change 하는 함수

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
  • epfd: 관찰 대상을 저장할 epoll의 fd
  • op: add, delete, or change the target of death
    • EPOLL_CTL_DEL, EPOLL_CTL_ADD
  • fd: 관찰 대상의 fd
  • event: 관찰할 event 종류
    • NULL: 더이상 fd를 사용하지 않는다는 의미, 보통 op: EPOLL_CTL_DEL과 함께 사용됨
  • return 값
    • 성공: 0
    • 실패: -1

 

EPOLLET: level

  • epoll_ctl의 op 중 하나
  • 개별 소켓마다 이벤트 감지 방법을 level trigger/edge trigger로 세팅 가능
  • epoll은 기본적으로 level trigger이다.

 

epoll_wait()

level trigger로 이벤트 발생을 감지

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
  • epfd: epoll 객체의 fd
  • events: 이벤트가 발생한 fd의 정보가 채워질 버퍼(epoll_event 구조체의 배열)의 주소, 동적 할당 가능

  • maxevents: events로 전달된 주소값의 버퍼에 등록할 수 있는 최대 이벤트 수
  • timeout: 이벤트 발생을 대기하는 시간, -1이면 무한 대기
  • return 값
    • 성공: 이벤트가 발생한 fd의 수
    • 실패: -1

 

Level Triggered vs. Edge Triggered

 

'CS > Network' 카테고리의 다른 글

11_Security  (5) 2024.07.24
05_Thread  (12) 2024.07.24
04_Multiprocess  (2) 2024.07.24
03_TCP Connections  (0) 2024.07.24
02_Socket_IO  (2) 2024.07.23