여러 프로세스의 생성이나 이들 프로세스의 관리는 시스템에 많은 부하를 준다. 스레드의 경우도 프로세스에 비해 적지만 여전히 스레드의 생성과 관리에 시스템은 부하를 감당해야 한다. 멀티플렉싱(multiplexing)방식에서는 여러 클라이언트가 동시에 서비스를 요청해도 서버는 select 함수를 이용해서 하나의 프로세스만으로 처리한다.
서버는 select 함수를 호출해서 서비스 요청을 기다리다가 하나 이상의 클라이언트에서 서비스 요청이 들어오면 서버 프로세스가 직접 서비스 요청을 차례로 처리한다. 즉, 별도의 자식 프로세스나 새로운 스레드를 생성하지 않고, 프로세스 하나에서 모두 처리하는 구조를 갖는다.
물론 select함수를 이용하면 네트워크 통신을 위한 소켓뿐만 아니라 표준 입출력 장치나 디스크 파일에 대해서도 읽을 자료가 있는지, 자료를 차단하지(blocking) 않고 전송할 수 있는지, 예회 상황이 있는지 등을 기다렸다가 이를 처리하도록 코드를 작성할 수 있다.
int select(
int maxfd,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout
);
반환 값
- 성공시: 1로 설정된 비트 수
- 실패시: -1
인자
- maxfd: 사건의 발생을 검사할 최대 소켓이나 파일 기술자의 수
- readfds: 읽을 데이터가 있는지를 검사할 파일이나 소켓 기술자의 목록
- writefsd: 차단(blocking)되지 않고 자료를 전송할 수 있는지를 검사할 파일이나 소켓 기술자의 목록
- exceptfds: 예외 상황이 발생했는지를 검사할 파일이나 소켓 기술자의 목록
- timeout: select 함수를 호출하고서 커널에 머물러 있는 최대 시간
'C / C++' 카테고리의 다른 글
struct timeval (0) | 2015.12.04 |
---|---|
gettimeofday() (0) | 2015.12.04 |
extra efforts (0) | 2014.09.29 |
malloc 개념 보충 (0) | 2014.09.05 |
coding based on the basic functions (0) | 2014.09.04 |