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 |