본문 바로가기

공부/tcp/ip 프로그래밍

17장 select보다 나은 epoll

반응형

17장.pptx

 

서버 설계구현방법

서버 모델 최소화(select, epoll, iopc, multi process) + 기능(받은 정보를 가지고 무엇을 어떻게 처리할 것인가? 예>echo)

 

구조체

1.

struct book{

 

} a;

 

2.

struct {

 

} a;

 

3.

Struct student{

 

};
typedef struct student student;
student mystudent;

 

4.

typedef struct {

 

} software;
software visual;

 

5.

typedef  union epoll_data{

 

} epoll_data_t;

epoll_data_t data;

 

select의 단점

1. 전체 파일디스크립터가 나타나는 배열에 생성되어 검사의 대상이 되는 파일디스크립터만 1로 표시하여

   일일히 손으로 배열에 넣어 놓아야 함
2. 변화가 있는 파일디스크립터 뿐 아니라 변화가 없는 파일디스크립터까지 나타나 있는 배열을 받아서

    일일히 for문을 통해서 1로 표시된변화가 생긴 파일디스크립터가 무엇인지 찾아야 함

운영체제에 공통적으로 있는 select함수

 

운영체제별로 커널에서 select함수를 발전시킨 여러 함수들이 존재
Linux => epoll
Windows => iocp

 

epoll의 전체구조

 

epoll 인스턴스 생성 함수

#include <sys/epoll.h>

 

int epoll_create(int size);

성공시 epoll 파일 디스크립터, 실패시 -1 반환

 

size : epoll 인스턴스의 크기 정보

 

epoll 인스턴스에 관찰대상이 되는 파일 디스크립터 등록 함수

#include <sys/epoll.h>

 

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

성공시 0, 실패시 -1 반환

 

epfd : 관찰대상을 등록할 epoll 인스턴스의 파일 디스크립트

op : 관찰대상의 추가, 삭제 또는 변경여부 지정

fd : 등록할 관찰대상의 파일 디스크립터

event : 관찰대상의 관찰 이벤트 유형

 

사건별로 변화가 생긴 파일 디스크립터에 대한 정보를 얻는 함수

#include <sys/epoll.h>

 

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

성공시 이벤트가 발생한 파일 디스크립터의 수, 실패시 -1 반환

 

epfd : 이벤트 발생의 관찰영역인 epoll 인스턴스의 파일 디스크립터

events : 이벤트가 발생한 파일 디스크립터가 채워질 버퍼의 주소 값

maxevents : 두 번째 인자로 전달된 주소 값의 버퍼에 등록 가능한 최대 이벤트 수

timeout : 1/1000초 단위의 대기시간, -1 전달 시, 이벤트가 발샐 할 때까지 무한 대기

 

 

엣지 트리거와 레벨 트리거 

epoll은 기본적으로 레벨 트리거를 사용

 

엣지 트리거를 사용하기 위한 설정

struct epoll_event event;

event.ebents = EPOLLIN | EIPOLLET;

 

엣지 트리거 기반의 서버 구현을 위해서 알아야 할 것 2가지

1. 변수 errno을 이용한 오류의 원인을 확인하는 방법

read함수는 입력버퍼가 비어서 더 이상 읽어 들일 데이터가 없을 때 -1을 반환하고 이 때 errno에는 상수 EAGAIN가 저장

 

2. 넌-블로킹(non-blocking) IO를 위한 소켓의 특성을 변경하는 방법

리눅스에서 파일의 특성을 변경 및 참조하는 함수

#include <fcntl.h>

 

int fcntl(int filedes, int cmd, ~);

성공 시 매개변수 cmd에 따른 값, 실패 시 -1반환

 

filedes : 특성 변경의 대상이 되는 파일의 파일 디스크립터 전달

cmd : 함수호출의 목적에 해당되는 정보 전달

 

파일(소켓)을 넌-블로킹 모드로 변경하기 위한 방법

int flag = fcntl(fd, F_GETFL, 0);

fcntl(fd, F_SETFL, flag|O_NONBLOCK);

 

 

 

레벨 트리거

 

엣지 트리거

반응형