-IO 멀티플렉싱 기반의 서버-
멀티프로세스 서버의 단점과 대안
멀티프로세스 서버의 단점 : 프로세스 생성에 많은 양의 연산, 메모리 공간 요구. IPC (inner process communcation) 방법도 복잡하다.
멀티플렉싱이라는 단어의 이해
그럼 멀티프로세스의 해결방법은 무엇인가? IO 멀티플렉싱 서버가 그 답이 될수 있다.
그럼 멀티 플렉싱이란 뭐냐? 이건 책의 그림을 보아야 할듯. 말로 하자면.. 책보자. 사전적으로 이야기 하자면 하나의 통신채널을 통해서 둘 이상의 데이터(시그널)를 전송하는데 사용되는 기술
멀티플렉싱의 개념을 서버에 적용하기
하나의 프로세스를 이용해서 둘 이상의 클라이언트에게 서비스를 제공하는 방법인데..
IO 멀티플렉싱 서버에서는 하나의 프로세스가 데이터가 수신된 소켓이 있는지 확인하고 그 소켓을 통해서 전송된 데이터를 수신하게 된다.
-select 함수의 이해와 서버의 구현-
select 함수를 이용하는 것이 멀티플렉싱 서버의 구현에 대표적인 방법이다.
select 함수의 기능과 호출순서
select 함수를 이용하면 한곳에 여러 개의 파일 디스크립터를 모아놓고 동시에 다음을 관찰할 수 있다.
관찰 항목(event) :
1.수신한 데이터를 지니고 있는 소켓이 존재 하는가?
2.블로킹되지 않고 데이터의 전송이 가능한 소켓은 무엇인가?
3.예외사항이 발생한 소켓은 무엇인가?
이와 같은 관찰 항목을 이벤트(event) 라고 한다. 관찰 항목에 속하는 상황이 발생 하였을때 이를 이벤트가 발생하였다라고 표현한다.
select 함수의 사용이 상당히 복잡한데 이를 정리하면 다음과 같다.
step1 : 파일 디스크립터의 설정, 검사의 범위 지정, 타임아웃의 설정
step2 : select 함수의 호출
step3 : 호출결과 확인
파일 디스크립터의 설정
select함수가 여러개의 파일 디스크립터를 동시에 관찰 할수 있기 때문에(곧 여러 소켓을 동시에 관찰) 우선 파일 디스크립터를 모아야 한다. 모을때도 이벤트(관찰 항목; 수신, 전송, 예외)에 따라 구분해서 모아야 한다.
이 파일 디스크립터는 fd_set이라는 구조체에 모으는데 비트단위로 이뤄진 배열이라고 생각하면 된다.그러니까 첫번째 배열의 값 (index 0인 값)은 0번의 파일 디스크립터를 의미하고 이것이 1이면 관찰 대상에 있는 파일 디스크립터라는 의미이다. select 함수 이후 변화가 없는 파일디스크립터의 fd_set 구조체의 1은 0이 된다. 그래서 select 후 여전히 1값을 갖는 fd_set 구조체의 component를 찾으면 그것이 관심있는 변화가 생긴 파일 디스크립터이다.
검사(관찰)의 범위지저오가 타임아웃의 설정
select는 함수는 다음과 같다. int select(int maxfd, fd_set *readset, fd_set *write_set, fd_set *exceptset, const struct timeval * timeout); 형태로 오류시 -1 timeout 지정시간보다 시간이 지났는데 변화가 있는 fd_set이 없으면 0을 변화가 있으면 변화된 파일 디스크립터의 수를 리턴한다.
select 함수호출 이후의 결과확인
최종! select 함수를 호출하는 예제의 확인
멀티플렉싱 서버의 구현
전체적으로 select 를 이용한 멀티플랙싱을 들여다보니, 이게 어떻게 진행되는거냐 하면 우선은 프로세스가 하나이고 전에는 한 프로세스가 하나의 파일 디스크립터만을 감당했는데, 이제는 fd_set이라는 구조체를 이용해서 파일디스크립터들을 fd_set 구조체에 묶고 fd_set을 하나하나 for문으로 들여다 보면서 관심 대상의 변화가 있는 파일디스크립터를 골라내서 특정 작업을 하는 것이다.
No comments:
Post a Comment