본문으로 바로가기

[C] epoll 이란

category 프로그래밍/C 2020. 12. 28. 22:58
728x90
반응형

네트워크 트래픽이 증가함에 따라, 서버에 접속하는 사용자들수도 많아 집니다.

이런 사용자들은 보통 하나의 세션이 될 것이고, 사용자가 많아지면, 서버는 이 사용자들이 접속한 세션들을 관리해야합니다.

이런 세션들을 관리하기 위해서 epoll을 사용합니다.

epoll은 리눅스에서 제공되는 기능이고, 많이 사용합니다.

epoll에 세션 즉, 소켓 fd를 등록하고 그 소켓에 이벤트가 발생한다면 즉각적으로 알림을 받아 처리를 할 수 있습니다.

이런 관리를 위해서 select나 poll을 쓰는 방법도 있습니다.

select의 경우 fd_set 구조체에 fd를 등록하여 싱글 쓰레드로 이벤트를 감지합니다. fd_set는 bitmask이기 때문에 최대 1024개까지만 등록할 수 있습니다.

그 이상의 fd에 대해서는 관리를 할 수 없습니다.

또한, select의 경우 1024개를 순차적으로 체크하기 때문에 동시접속이 많으면 성능에 문제가 발생할 수 있습니다.

그리고 이벤트가 발생했을 때의 정보들이 많지 않습니다.

poll 함수는 select 함수의 단점을 보완하긴 했지만, fd를 순차적으로 검사하기 때문에 비효율 적입니다.

epoll은 이러한 단점을 보완했습니다.

select와 poll이 순차적으로 모든 fd를 체크한다면, epoll은 이벤트가 발생한 fd 목록을 알려줍니다.

또한, fd_set이 없기 때문에 사용하기도 편합니다.

epoll은 fd를 trigger 하는 2가지 방식이 있습니다.

1. level-triggered(LT) : 특정 상태가 유지되는 동안 감지

2. edge-triggered(ET) : 특정 상태가 변화하는 시점에서만 감지

예를 들어보겠습니다.

0000111000011100

LT의 경우 1이 유지되는 동안 감지를 합니다. 즉 6회 입니다.

ET의 경우 특정 상태가 변하는 시점에서만 발생하기 때문에 2회 감지합니다

기본 값은 ET입니다. 상황에 맞게 사용하시면됩니다.

예제 소스 코드를 통해서 epoll 사용법에 대해 알아보겠습니다. 간단합니다.

=========================================================================================

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <sys/types.h>
#include <sys/epoll.h>

#define MAX_CLIENT 100

int main()
{

    struct epoll_event events[MAX_CLIENT];

    struct epoll_event ev;


    int fd = 0, ret = 0, epoll_fd = 0;

    /* epoll create */
    epoll_fd = epoll_create(MAX_CLIENT);
    if ( epoll_fd < 0 )
    {
        printf("epoll_create() fail!\n");
        return -1;
    }

 

    /* epoll setting */

    ev.events = EPOLLIN;

    ev.data.fd = fd;


    /* epoll add */
    epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev);

    while(1)
    {
        /* epoll wait */
        ret = epoll_wait(epoll_fd, events, MAX_CLIENT, 10);
        if ( ret < -1 )
        {
            printf("epoll_wait() fail!\n");
            break;
        }
        else if ( ret == 0 )
        {
            printf("idle\n");
            continue;
        }
        else
        {
            /* fd work */

            continue;
        }
    }

    return 1;
}

=========================================================================================

이 코드에서는 fd가 세팅되어 있다고 가정을 했습니다.

epoll_create로 필요한 갯수만큼 epoll을 만듭니다.

그리고 epoll에 필요한만큼의 fd를 추가해줍니다.

그리고 epoll_wait에서 epoll에서 리턴하는 값으로 fd 동작을 수행시킵니다.

 

위의 코드는 epoll을 사용하는 가장 기본 코드입니다. 이것을 활용하시면 됩니다.


오늘 포스팅은 여기까지입니다.

이상입니다.

 

 

728x90
반응형

'프로그래밍 > C' 카테고리의 다른 글

[C] cJSON을 사용하여 json 파싱  (0) 2021.03.30
[C] 정상적으로 tcp 소켓 통신이 종료 되었을 경우  (0) 2021.03.23
[C] gcc의 mcmodel 옵션  (0) 2020.12.28
[c언어] 소켓 함수 타임아웃  (0) 2020.07.21
[C] TCP 소켓  (0) 2020.03.09