네트워크

[네트워크] IO 멀티플렉싱

양원준 2023. 6. 11. 17:14
728x90

멀티 프로세스 서버의 단점

  • 프로세스의 빈번한 생성은 성능의 저하로 이어짐
  • 멀티 프로세스의 흐름을 고려해서 구현해야 하기 때문에 구현이 쉽지 않음
  • 프로세스간 통신이 필요한 상황에서는 서버의 구현이 더 복잠해짐

 

이 대안은?

 

하나의 프로세스가 다수의 클라이언트에게 서비스를 할 수 있게 함

하나의 프로세스가 여러 개의 소켓을 핸들링 할 수 있는 방법이 존재야함

 

--> 이것이 IO 멀티플렉싱이다

멀티플렉싱은 하나의 리소스를 둘 이상의 영역에서 공유하는 것

 

select 함수

select 함수를 사용하면 한곳에 여러개의 파일 디스크립터를 모아 놓고 다음과 같은 사항을 관찰할수 있다

  • 수신한 데이터를 지니고 있는 소켓이 존재하는가?
  • 블로킹되지 않고 데이터의 전송이 가능한 소켓을 무엇인가?
  • 예외상황이 발생한 소켓은 무엇인가?

 

select 함수 호출 순서

1) 파일 디스크립트 설정

  • FD_ZERO(fd_set *fdset); :fd_set 초기화
  • FD_SET(int fd, fd_set *fdset); : 해당 파일디스크립터 fd를 1로 (관찰 대상으로 추가)
  • FD_CLR(int fd, fd_set *fdset); : 해당 파일디스크립터 fd를 0으로 (관찰 대상에서 제외)
  • FD_ISSET(int fd, fd_set *fdset); : 해당 파일디스크립터 fd가 0인지 확인 (정보가 있으면 양수 반환)

2) 검사의 범위 지정

  • 검사해야할 파일 디스크립터 개수 전달
  • 가장 큰 파일 디스크립터 값에 1 더함(0부터 시작)

3) 타임 아웃 설정

  • select 함수가 블락 되는 것을 피하기 위해 설정

 

 

select 함수

  • 관찰이 되는 디스크립터의 수는 maxfd
  • 2,3,4 번째 인자를 통해 전달된 관찰 대상의 입력, 출력, 오류가 발생했을때 select 함수는 반환을 한다
  • 단, timeout의 지정을 통해 무조건 반환이 되는 시간 결정 가능

 

select 함수호출 결과 확인

 

 

select 함수 호출 이후에는 변화가 발생한 소켓만 1로 설정, 나머지 0으로 초기화

 

 

select 함수 호출 예시

FD_ZERO(&reads); 
FD_SET(0, &reads);

..............

timeout.tv_sec=5;
timeout.tv_usec=0;
result= select(1, &temps, 0, 0, &timeout);

 

 

 

 

 

728x90