상세 컨텐츠

본문 제목

select 와 epoll

프로그래밍/시스템 프로그래밍

by wlwwlwwlw 2016. 12. 16. 17:28

본문

select

 

멀티프로세스와 멀티플렉싱

 

select의 설명에 앞서 멀티플렉싱에 대한 이해가 필요하다.

다중접속 서버의 구현을 위해 멀티프로세스 서버를 사용할 수 있으나 많은 양의 연산이 요구되며 필요한 메모리 공간이 큰 단점이 있다.

 

 <멀티프로세스 서버 모델>

 

따라서 다중접속 서버의 구현을 위해 프로세스의 생성을 동반하지 않으면서 다수의 클라이언트에게 서비스를 제공할 수 있는 방법인 IO 멀티플렉싱 서버가 있다. 서버에 멀티플렉싱 기술을 도입하여 필요한 프로세스의 수를 줄일 수 있다.

 

<멀티플렉싱 서버 모델>

 

select함수

 

select 함수는 한곳에 여러 개의 파일 디스크립터(소켓)를 모아놓고 동시에 이들을 관찰할 수 있다.

파일디스크립터를 동시에 관찰하려면 파일디스크립터들을 모아야한다. 이 모을 때 사용되는 것이 fd_set형 변수이다.

 

int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval * timeout);

 

 

 

 

maxfd : 검사 대상이 되는 파일 디스크립터의 수

readset : fd_set형 변수에 수신된 데이터의 존재여부에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

writeset : fd_set형 변수에 블로킹 없는 데이터 전송의 가능여부에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변소의 주소 값을 전달한다.

exceptset : fd_set형 변수에 예외상황의 발생여부에 관심이 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다.

timeout : select함수호출 이후에 무한정 블로킹 상태에 빠지지 않도록 타임아웃을 설정하기 위한 인자를 전달한다.

->성공 시 0 이상, 오류발생시에는 -1이 반환되고, 타임 아웃에 의한 반환 시에는 0이 반환된다.

select함수를 실행할 때 파일디스크립터에 변화가 생기지 않으면 무한정 브로킹 상태에 머물게 된다. 이러한 상황을 막기 위해 타임아웃을 지정하고 일정한 시간이 지나면 함수가 0을 반환한다.

 

 

select의 문제점

 

- select는 오래 전에 개발된 멀티플렉싱 기법으로 허용할 수 있는 동시접속자의 수가 백을 넘기 힘들다.

  그래서 오늘날의 개발환경에서는 epoll을 많이 사용한다.

 

- select 함수호출 이후에 항상 등장하는, 모든 파일 디스크립터를 대상으로 하는 반복문

 

- select 함수를 호출할 때마다 인자로 매번 전달해야 하는 관찰대상에 대한 정보들

  select 함수 호출시 관찰대상에 대한 정보를 매번 운영체제에 전달해야 한다는 것을 말한다. 운영체제에게

  데이터를 전달하는 것은 프로그램에 많은 부담이 따르는 일이다. 그러므로 성능에 치명적인 약점이 될 수 있다.

  그래서 운영체제에게 관찰대상에 대한 정보를 딱 한번만 알려주고서, 관찰대상의 범위, 또는 내용에 변경이 있을

  때 변경 사항만 알려주도록 하는 함수가 리눅스의 epoll이다.

 

epoll

 

epoll의 장점

 

- 상태변화의 확인을 위한, 전체 파일 디스크립터를 대상으로 하는 반복문이 필요 없다.

 

- select 함수에 대응하는 epoll_wait 함수호출 시, 관찰대상의 정보를 매번 전달할 필요가 없다.

 

epoll의 함수

 

epoll_create : epoll 파일 디스크립터 저장소 생성

epoll_ctl : 저장소에 파일 디스크립터 등록 및 삭제

epoll_wait : select 함수와 마찬가지로 파일 디스크립터의 변화를 대기한다.

 

int epoll_create(int size);

 

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

->성공 시 epoll 파일 디스크립터, 실패 시 -1반환//함수 호출 시 생성되는 파일 디스크립터 저장소

 

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

 

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

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

      EPOLL_CTL_ADD 파일 디스크립터를 epoll 인스턴스에 등록한다.

      EPOLL_CTL_DEL 파일 디스크립터를 epoll 인스턴스에서 삭제한다.

      EPOLL_CTL_MOD 등록된 파일 디스크립터의 이벤트 발생상황을 변경한다.

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

event : 관찰대상의 관찰 이벤트 유형 (epoll_event의 포인터,event의 유형을 등록하는 용도)

 

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

 

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

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

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

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

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

'프로그래밍 > 시스템 프로그래밍' 카테고리의 다른 글

실행과 성능측정  (0) 2016.12.17
Chattting Project  (0) 2016.12.17
Thread  (0) 2016.12.17

관련글 더보기