340 likes | 696 Views
TCP / IP 소켓 프로그래밍. 4 주차 ( Ch.15 ~ Ch.18 + α ). 세부 계획. Chapter 15~24 다중 접속 서버의 구현. 다중 접속 서버와 비 다중 접속 서버. 비 다중 접속 서버. 다중 접속 서버. 서비스 시간이 조금 느리다 접속 대기 시간이 짧다 ( 병렬 ). 서비스 시간이 빠르다 접속 대기 시간이 길다 ( 순차 ). 다중 접속 서버란 ?. 둘 이상의 클라이언트 에게 동시에 접속을 허용하여 , 동시에 둘 이상의 클라이언트에게
E N D
TCP / IP 소켓 프로그래밍 4주차 (Ch.15 ~ Ch.18 + α )
다중 접속 서버와 비 다중 접속 서버 비 다중 접속 서버 다중 접속 서버 • 서비스 시간이 조금 느리다 • 접속 대기 시간이 짧다(병렬) • 서비스 시간이 빠르다 • 접속 대기 시간이 길다(순차)
다중 접속 서버란? 둘 이상의 클라이언트에게 동시에 접속을 허용하여, 동시에 둘 이상의 클라이언트에게 서비스를 제공하는 서버를 의미한다.
다중 접속 서버의 종류 멀티 프로세스 서버 멀티 플렉싱 서버 멀티 쓰레드 서버
멀티 플렉싱 서버에서의 epoll Select 함수의 단점 해결책 if((fd_num=select(fd_max+1, &cpy_reads, 0, 0, &timeout))==-1) ……. for(i=0; i<fd_max+1; i++) { if(FD_ISSET(i, &cpy_reads)) { …..FD_SET(clnt_sock, &reads); .…. } else { ….. FD_CLR(i, &reads); ….. } }
Epoll의 장점 epoll구현의 함수 select 구현의 함수 VS
쓰레드의 등장 배경 프로세스는 부담스럽다. 데이터의 교환이 어렵다. • 프로세스간 메모리가 독립적으로 운영되기 때문에 프로세스간 데이터 공유 불가능 • 운영체제가 별도로 제공하는 메모리공간을 대상으로 별도의 IPC 기법 적용 • 프로세스의 생성에는 많은 리소스가 소모 • 프로세스가 생성되면, 프로세스간의 컨텍스트스위칭으로 인해서 성능이 저하 • 컨텍스트스위칭은 프로세스의 정보를 하드디스크에 저장 및 복원 하는 일
그래서 쓰레드는? • 프로세스보다 가벼운, 경량화된 프로세스 • 컨텍스트스위칭이빠름 • 쓰레드 별로 메모리공유가 가능하기 때문에 별도의 IPC 기법 불필요
쓰레드와 프로세스의 차이점 프로세스 쓰레드 프로세스는 서로 완전히 독립적 프로세스는 운영체제 관점에서의 실행 흐름을 구성 쓰레드는 데이터 영역과 힙 영역을 공유 쓰레드는 프로세스 내에서의 실행 흐름
쓰레드의 문제점 • 쓰레드메모리공유가 가능하기 때문에 문제가 발생 ← 정상적인 접근 ↓ 잘못된 접근
쓰레드의 임계영역 • 둘 이상의 쓰레드가동시에 실행하면 문제를 일으키는 영역 전역변수 long longnum = 0; NO!!! ↑ 임계영역? YES!!! 임계영역?
해결 방법은? 동기화! • 둘 이상의 쓰레드가동시에 실행하면 문제를 일으키는 영역 뮤텍스(Mutex) -동기 접근에 대한 해결책 세마포어(Semaphore) -실행 순서 컨트롤 중심의 컨트롤
다중 접속 서버의 선택 절대 우위를 점하는 서버의 모델은 없다! 상황에 맞게 적절한 모델을 선택할 수 있어야 한다.
구현 환경과 내용 구현 환경 구현 내용 • 멀티캐스트 • 멀티 쓰레드(혹은 멀티 프로세스) • 리눅스(C언어)
구현 계획 서버 클라이언트 • 서버에 접속 및 종료 • 전송 받은 내용 화면 표시 • 파일 요청 및 수신 • 클라이언트간 통신 중계 • 대화 내용 및 요청 저장 • 파일 요청에 따른 제공 및 중계
프로세스란? • 간단하게는 실행중인 프로그램을 뜻한다. • 실행중인 프로그램에 관련된 메모리, 리소스등을 총칭하는 의미이다. • 멀티프로세스 운영체제는 둘 이상의 프로세스를 동시에 생성 가능하다.
Fork 함수 • fork 함수가 호출되면, 호출한 프로세스가 복사되어 fork 함수 호출 이후를 각각의 프로세스가 독립적으로 실행하게 된다. 부모 자식
Fork 함수 사용 방법 pid=fork(); if(pid==0) // if Child Process gval+=2, lval+=2; else // if Parent Process gval-=2, lval-=2; if(pid==0) printf("Child Proc: [%d, %d] \n", gval, lval); else printf("Parent Proc: [%d, %d] \n", gval, lval);
좀비 프로세스 실행이 완료되었음에도 불구하고, 소멸되지 않은 프로세스 • wait 함수 • waitpid함수 퇴치 방법은 ?
시그널 핸들링 특정 상황이 되었을 때 운영체제가 프로세스에게 해당 상황이 발생했음을 알리는 일종의 메시지를 가리켜 시그널이라 한다. pid=fork(); …………… if(pid==0) printf("Child Proc: [%d, %d] \n", gval, lval); else printf("Parent Proc: [%d, %d] \n", gval, lval); return 0; 시그널 발생 !
프로세스 기반 다중접속 서버 연결이 하나 생성될 때마다 프로세스를 생성해서 해당 클라이언트에 대해 서비스를 제공하는 것이다.
fork 를 통한 디스크립터의 복사 프로세스에 의해 만들어진 소켓이 복사되는 게 아니고, 파일 디스크립터가 복사된다
멀티 프로세스의 단점 • 프로세스의 빈번한 생성은 성능의 저하로 이어진다. • 멀티프로세스의 흐름을 고려해서 구현해야 하기 때문에 구현이 쉽지않다. • 프로세스간 통신이 필요한 상황에서는 서버의 구현이 더 복잡해진다.
멀티플렉싱이란? 전자 및 통신공학에서의 멀티 플렉싱의 의미 “하나의 통신채널을 통해서 둘 이상의 데이터를 전송하는데 사용되는 기술” 서버에 적용한 멀티 플렉싱 Client Server Client Client
Select 함수 • 멀티플렉싱 서버의 구현에 있어서 가장 대표적인 방법 • Select함수를 사용하면 한곳에 여러 개의 파일 디스크립터를 모아놓고 동시에 관찰 할수있다. • 수신한 데이터를 지니고 있는 소켓이 존재하는가? • 블로킹되지 않고 데이터의 전송이 가능한 소켓은 무엇인가? • 예외상황이 발생한 소켓은 무엇인가? Select함수 호출과정
파일 디스크립터의 설정 • 함수 안에는 파일들을 관찰항목(수신, 전송, 예외)에 따라서 구분해서 모으기 위한 fd_set형 변수존재
검사의 범위지정과 타임아웃의 설정 * 변수 maxfd는 파일 스크립터의 검사 범위를 지정 파일 디스크립터의 수를 넣는다. * 변수 timeout은 함수의 블로킹 상태를 방지하기 위하여 설정. * 반환 값 파일스크립터가 변화 변화한 파일스크립터 수 timeout에 의한 반환 값 0 오류발생시 -1