tioon's Devlog

멀티플렉싱 개념(select,epoll) 본문

네트워크

멀티플렉싱 개념(select,epoll)

tioon 2023. 5. 2. 16:15
멀티플렉싱(Multiplexing)이란?

-다수의 네트워크 연결요청을 동시에 처리하기 위한 기술, 위에서 멀티 쓰레드,프로세스를 이용해 동시 처리를 할 수 있지만, 해당 기술은 매우 불안정합니다. 따라서 멀티플렉싱은 하나의 프로세스에서 여러개의 소켓을 동시에 관리하여  네트워크의 안정성과 성능을 향상 시킬 수 있습니다. 이 기술은 select라는 시스템콜을 이용해 구현됩니다.

 

멀티플렉싱 과정
  1. 소켓 생성 및 바인딩 
    -소켓을 생성한후 바인딩하여 요청들어오는 소켓을 대기합니다.

  2. 소켓 감시 대기열 설정
    -파일 디스크립터 배열을 통해 요청이 들어올때 처리할 감시 대기열을 설정합니다. 여기서 감시 대기열에 설정된 파일디스크립터만 관찰을 하여, 데이터 입출력을 관찰합니다. 감시할 종류는 3가지로 나뉘는데, (읽기,쓰기,예외)가 있습니다.

  3. 감시 대기열 이벤트 발생 처리
    -감시중인 파일 디스크립터에서 입출력과 같은 이벤트가 발생하면, 해당 파일 디스크립터를 반환해 입출력을 처리합니다.

  4. 반복
    -이벤트 발생을 처리했으면 다시 대기상태로 돌아가 감시를 합니다.

 

 

 

 

select()와 epoll()의 파일디스크립터 체크 차이

 

 

 

 

 

select 멀티플렉싱

 -Unix/Linux 계열에서 사용되는 I/O 멀티플렉싱 기술, 하나의 프로세스가 여러개의 파일 디스크립터를 감시하고 이들 중 발생한 이벤트를 처리하는 기술입니다. read,write,exceppt 3개의 집합으로 나눈 후  발생한 이벤트의 종류에 따라 이벤트를 처리합니다. 파일디스크립터를 감시할때 0부터 최대값까지 순차적으로 다 체크해야해서 크기가 커질수록 느립니다.

 

int select( int nfds, fd_set *readfds , fd_set *writefds , fs_set *exceptfds , struct timeval *timeout);

 

  • nfds -> 파일 디스크립터중 제일 높은값 (0부터 관찰할 파일디스크립터 최대값)
  • readfds , writefds , exceptfds -> 파일디스크립터 집합 (읽기,쓰기,예외) 3개의 집합으로 나뉨.
  • timeout -> 관찰 과정에서 응답이 들어올때 까지 블로킹 상태가 생기는데 ,timeout(제한시간)으로 무한 블로킹상태를 막음

 

void FD_ZERO(fd_set *fdset);
  • fdset의 모든 비트를 0으로 설정하는 함수
void FD_SET(int fd, fd_set *fdset);
  • fdset의 fd에 해당하는 비트를 1로 설정하는 함수
void FD_CLR(int fd, fd_set *fdset);
  • fdset 중 fd에 해당하는 비트를 0으로 설정
int FD_ISSET(int fd, fd_set *fdset);
  • fdset 중 fd에 해당하는 비트가 1이면 양수 반환하는 함수

 

 

 

epoll 멀티플렉싱

 -Linux 계열에서 사용되는 I/O 멀티플렉싱 기술, epoll인스턴스를 생성하여 파일 디스크립터를 등록하여 감시할 대상을 지정한후, 이벤트가 발생시 처리하는 기술입니다. 크게 epoll생성, epoll 제어, epoll 대기 과정이 있습니다. select와 다르게 파일디스크립터를 감시할때 0부터 최대값까지 순차적으로 체크하는게 아닌, 원하는것만 체크가능해 속도가 빠릅니다.

 

int epoll_create(int size);     //epoll 생성함수
  • size -> 관리하려는 파일 디스크립터의 개수

 

int epoll_ctl( int epfd , int op , int fd , struct epoll_event *event);     //epoll 제어함수
  • epfd -> epoll 파일 디스크립터.  (create로 생성한 epoll의 인스턴스 넣음)
  • op -> 수행할 작업의 종류. ADD(파일디스크립터 등록) ,MOD (이미 등록된 파일디스크립터 이벤트 유형 변경) ,DEL(파일디스크립터 삭제)
  • fd -> 대상 파일 디스크립터 (epoll 파일 디스크립터에 등록하거나 수정하거나 삭제할 파일 디스크립터)
  • event -> epoll_event 구조체 (이벤트 유형을 지정, 사용자정의 데이터를 포함하는 event 구조체) (epoll_ctl실행전에 event와 data.fd를 설정하고 넣어야함)

 

int epoll_wait( int epfd , struct epoll_event *events , int maxevents , int timeout);   //epoll 모니터링 대기함수
  • epfd -> epoll 파일 디스크립터 (create로 생성한 epoll의 인스턴스 넣음)
  • events -> 모니터링할 event 구조체 (이벤트가 발생한 파일 디스크립터 정보를 events 배열에 저장함)
  • maxevent -> events 배열의 크기 , 한번에 이벤트를 받을 수 있는 최대를 정합니다.
  • timeout -> epoll_wait함수가 대기하는 시간을 지정.  -1는 이벤트 발생할때까지 무한 대기, 0은 논블로킹 , 양의정수는 해당 값만듬 밀리세컨드 단위로 타임아웃.

 

typedef union epoll_data {
    void *ptr;
    int fd;
    uint32_t u32;
    uint64_t u64;
} epoll_data_t;

struct epoll_event {
    uint32_t events;    // 발생한 이벤트의 유형을 나타내는 비트 마스크
    epoll_data_t data;  // 파일 디스크립터와 연관된 사용자 정의 데이터
};
  • events -> 발생한 이벤트의 유형을 나타내는 비트 마스크
    EPOLLIN(수신 가능), EPOLLOUT(송신가능),EPOLLERR(오류),EPOLLHUP(연결 종료) 등이 있습니다.
  • events -> 이벤트가 발생한 파일 디스크립터와 연관된 사용자 정의 데이터를 저장하는 구조체

 

 

 

 

epoll 진행과정
  1. epoll 인스턴스 생성
    -epoll_create를 사용해 eopll인스턴스를 생성합니다.

  2. 파일 디스크립터 등록
    -epoll_ctl 함수를 사용하여 관심있는 파일디스크립터를 epoll에 등록합니다. 이때,파일 디스크립터와 이벤트 유형을 지정해 등록해야합니다.

  3. 대기 상태로 진입
    -epoll_wait함수를 사용하여 등록된 파일 디스크립터의 이벤트를 기다립니다. 

  4. 이벤트 감지 및 처리
    -epoll_wait로 대기를 하고 있다가 설정한 특정 이벤트가 발생하였으면, 등록한 events 배열에 이벤트 발생한 파일디스크립터의 정보를 저장합니다.

 

 

 

 

 

epoll 모드

 

  • 엣지 트리거 (Edge-triggered Mode)
    파일 디스크립터의 상태(read,write,except...)가 변화할때만 이벤트 발생. 이벤트 처리 유무와 상관없이 딱한번만 이벤트 알림이 발생합니다.


  • 레벨 트리거 (Level-Triggered Mode)
    파일 디스크립터의 상태(read,write,except...)가 변화하지 않더라도 이벤트가 지속적으로 발생, 즉, 상태 변화가 일어난 후 이벤트를 처리하지않으면 계속해서 이벤트 알림이 발생. 데이터 처리를 해야 알림이 발생안함.

'네트워크' 카테고리의 다른 글

DNS서버란?  (0) 2023.05.07
MAC주소와 ARP  (0) 2023.05.02
멀티 쓰레드(세마포어,뮤텍스) , 멀티플렉싱이란?  (0) 2023.04.11
시그널(Signal)이란?  (0) 2023.04.03
UDP 통신이란?  (0) 2023.03.27