Epoll 멀티 플랙싱

Seokchan Yun·2022년 6월 29일
0

socket create ~ close

Epoll?

  • linux 에서 select 단점을 보완하여 사용할 수 있도록 만든 I/O 모델.
  • 파일 디스크립터를 사용자가 아닌 커널이 관리하여 자원소모가 적다.

Epoll fucntions

int epoll_create(int size);

  • Fd들의 입출력 이벤트 저장공간을 만드는 함수. size 만큼 입출력 이벤트 공간을 생성한다.

int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event);

  • epoll_ctl은 epoll에 fd들을 등록/수정/삭제를 하는 함수인데 일반적으로 epoll이 관심을 가져주길 바라는 fd와 그 fd에서 발생하는 관심있는 사건의 종류를 등록하는 인터페이스로 설명된다.
  • op (등록/수정/삭제) 가 실행된 결과는 event 구조체에 등록된다.
{{{#!plain
typedef union epoll_data
{
    void *ptr;
    int fd;
    __uint32_t u32;
    __uint64_t u64;
} epoll_data_t;

struct epoll_event 
{
    __uint32_t event // 발생된 이벤트
    epoll_data_t data // 유저 데이터로 직접 설정가능
};
}}}

int  epoll_wait(int  epfd,  struct epoll_event * events, int maxevents, int timeout)

  • 실제 이벤트가 발생하는 것을 기다리다가, 이벤트가 발생하면 그것을 리스트(epoll_event).events[] 의 배열로 전달한다. 리턴값은 발생한 이벤트의 갯수가 리턴된다.
    • event : 이벤트가 발생된 fd 배열
    • maxevents : 실제 동시 접속수와 상관없이 한번에 처리하려는 이벤트의 개수를 제한한다.
    • timeout : wait동작을 지정해주는 옵션
      • timeout(-1) blocking 상태
      • timeout(0) 사건 유무에 상관없이 조사만 하고 바로 리턴하는 상태

  • epoll 설계 파트에서는 sever(socket)을 생성하는 클래스 하나와 epoll을 동작시키는 클래스로 생성/동작을 나누어서 만들어 볼 계획(?).
  • config 에서 port / timeout / server 블록의 개수를 입력받아서 socket을 생성한다.
  • 연결이 갑자기 종료 될 경우를 항상 주의한다.
  • 대기큐 구성하는것을 좀 더 찾아봐야한다. event Q 와 os Q 차이점.
profile
42 Paris developer

0개의 댓글