23doyoon / DOTORY

Chatting Client / Server
1 stars 0 forks source link

18/05/02 #5

Open 23doyoon opened 6 years ago

23doyoon commented 6 years ago

더 나아가 내가 지금 공부해야하는 것은 IO Multiplexing기반의 서버를 만들어야한다.

IO Multiplexing

다중접속 서버의 다른 구현방법인 멀티플렉싱 기반의 서버구현. 서버의 구현기술을 하나 더 늘리는 것도 중요하지만, 그보다 중요한 것은 기술마다 지니는 장단점을 이해하는 데 초점맞추기.

기술 별 장단점을 잘 알면, 단순하게 기능에만 초점을 맞춰서 구현하는 개발자가 아니라, 목적에 맞는 이상적인 모델을 적용하는 개발자가 될 수 있기 때문이다.

23doyoon commented 6 years ago

IO 멀티플렉싱 기반의 서버

멀티프로세스 서버의 단점과 대안 다중접속 서버의 구현을 위해서 클라이언트의 연결요청이 있을 때마다 새로운 프로세스를 생성한다. 프로세스의 생성에는 상당히 많은 대가를 지불해야한다.(많은 양의 연산이 요구되고, 필요한 메모리 공간도 비교적 편이다.)

IO 멀티플렉싱 서버는 프로세스의 생성을 동반하지 않으면서 다수의 클라이언트에게 서비스를 제공할 수 있는 방법이다.

멀티플렉싱이라는 단어의 이해

하나의 통신채널을 통해 둘 이상의 데이터(시그널)를 전송하는데 사용되는 기술

물리적 장치의 효율성을 높이기 위해서 최소한의 물리적인 요소만 사용해서 최대한의 데이터를 전달하기 위해 사용되는 기술

서버에 멀티플랙싱 기술을 도입해서 필요한 프로세스의 수를 줄일 수 있다. 접속해있는 클라이언트의 수에 상관없이, 서비스를 제공하는 프로세스의 수는 딱 하나이다.

23doyoon commented 6 years ago

멀티플렉싱 서버의 구현에 있어서 가장 대표적인 방법이 select함수를 이용하는 것이라 하여 오늘은 select함수의 이해와 서버의 구현을 공부해 보기로 했다.

select 함수의 기능과 호출순서

select 함수를 사용하면 한곳에 여러 개의 file descriptor를 모아놓고 동시에 이들을 관찰할 수 있다.

select 함수의 호출 과정

  1. 파일 디스크립터의 설정, 검사의 범위 지정, 타임아웃의 설정
  2. select 함수의 호출
  3. 호출결과 확인
23doyoon commented 6 years ago

1. 파일 디스크립터의 설정 select 함수를 사용하면 여러 개의 파일 디스크립터를 동시에 관찰할 수 있다. 파일 디스크립터의 관찰 == 소켓의 관찰

먼저 관찰하고자 하는 파일 디스크립터를 모아야한다. 이때 관찰항목(수신, 전송, 예외)에 따라서 구분해서 모아야한다.

파일 디스크립터를 세 묶으로 모을 때 사용되는 것이 fd_set형 변수이다.

23doyoon commented 6 years ago

1. 검사(관찰)의 범위지정과 타임아웃의 설정

#include <sys/select.h> #include <sys/time.h> int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); -> 성공 시 0 이상, 실패 시 -1 반환

struct timeval{ long tv_sec; long tv_usec; }

파일 디스크립터의 관찰(검사) 범위는 select 함수의 첫 번째 매개변수와 관련이 있고, select 함수의 타임아웃 시간은 select 함수의 마지막 매개변수와 관련이 있다.

timeout이 발생하는 경우는 주어진 시간 내 지정된 파일 디스크립터 중 아무것도 변화가 발생 하지 않았을 때이다. 루프를 돌때 앞선 루프에서 대기했던 시간을 뺀 값. 즉 남은 시간만큼의 길이

23doyoon commented 6 years ago

3. select 함수호출 이후의 결과확인 select 함수가 0이 아닌 양수가 반환이 되면, 그 수만큼 파일 디스크립터에 변화가 발생했음을 의미한다. (파일 디스크립터의 변화는 관심대상으로 등록된 파일 디스크립터에 해당 관심에 관련된 변화가 발생했음을 뜻함)

23doyoon commented 6 years ago

select

23doyoon commented 6 years ago

echoselect

23doyoon commented 6 years ago

채팅 서버/클라이언트 구현

전체 모양

게임클라이언트 / 서버에서 사용하는 채팅 서버와 클라이언트를 구현

제약조건

권장 사항

무관

23doyoon commented 6 years ago

멘토님 말씀

제가 채팅이라는 주제를 선택한 이유를 말씀드리는게 고민에 도움이 될 것 같아 추가로 댓글을 남깁니다.

서버에 대한 이해도를 높이는 것에 도움을 주기 위한 방안 중 하나로 채팅이라는 수단을 택했다로 이해하시면 될 것 같습니다.

서버를 디자인 / 설계하는 것부터 어떤 방식으로 만들어야 하는지, 왜 그렇게 하는지, 어떠한 장점이 있는지...등을 포괄해서 가장 적합한게 채팅서버라고 보여서 선택했습니다. (개인적으로 많은 공부를 했던 분야이기도 해서...)

따라서 특정 프로토콜이나 라이브러리 사용보다는 직접 디자인하고 만들어보시는 게 좀 더 많은 것을 얻을 수 있을 것 같아 보입니다.

서버 설계/디자인 -> 프로토콜 설계 -> 구현 -> 테스트 -> 성능테스트 -> CI / CD 의 개발단계를 거쳐보면서, 채팅서버를 만든다기 보다는 서버 개발단계를 공부한다는 생각으로 접근해서 서버개발에 대한 재미를 느껴보실 수 있었으면 좋겠습니다.

23doyoon commented 6 years ago

하루를 마무리하며...

서버 개발 단계를 공부한다는 생각으로 접근하라는 멘토님 말씀 덕분에 복잡했던 머리 속 생각이 '어떻게 준비하고, 무엇을 공부해야하는지 등' 정리가 되었다.

아침에 내린 비 덕분에 시원하고 기분좋은 날씨와 함께 학교에서 알고리즘 수업을 듣고, 카페에서 IO멀티플렉싱 기반 서버에 대해서 공부하고 좋은 하루였다. 다음으로 공부할 내용으로는 EPOLL이다. 그 후 EPOLL기반의 다중 클라이언트가 접속할 수 있는 서버 구현.

누나의 결혼식과 중간고사로 숨가빴던 4월도 끝나고, 이제 5월이다. 1년 중 내가 가장 좋아하는 5월! 5월도 학교 전공공부와 함께 네이버 핵데이 준비로 바쁜 한 달을 보내게 될것같다.

파이팅!!