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
'네트워크' 카테고리의 다른 글
[네트워크] HTTP (0) | 2023.06.12 |
---|---|
[네트워크] 쓰레드, 멀티 쓰레드 (0) | 2023.06.11 |
[네트워크] 시그널 핸들링 (0) | 2023.06.11 |
[네트워크] send&recv, readv&writev 입출력 함수 (0) | 2022.11.29 |
[네트워크] 멀티캐스트, 브로드캐스트 (0) | 2022.11.29 |