본문 바로가기
Develop/Network

[윤성우의 열혈 TCP/IP 소켓 프로그래밍] Chapter17 - 내용 확인 문제 풀이

by Tarra 2023. 7. 2.

 

 

 

 

 [윤성우의 열혈 TCP / IP 소켓 프로그래밍] 책을 기반으로 개인적으로  문제 풀이 및 개념을 정리한 내용입니다.

모든 소스 코드와 강의, 확인 문제의 정확한 답안은 (23년 7월 1일부터 전면 무료화 예정)

http://www.orentec.co.kr/

 

====== 오렌지 미디어 ======

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

 

01. select 함수를 기반으로 서버를 구현할 때 코드상에서 확인할 수 있는 단점 두 가지는 무엇인가?

1. 확장성의 제한

select 함수는 단일 프로세스 내에서 동작하며, 다중 클라이언트 요청을 처리하기 위해 루프를 돌면서 각 소켓의 상태를 확인한다.

이로 인해 클라이언트 수가 증가할수록 성능이 저하되는 문제가 발생할 수 있다. 이는 "스케일링 문제"라고도 알려져 있다.

큰 규모의 서버에서 많은 클라이언트를 동시에 처리해야 하는 경우, select 함수는 한계가 있을 수 있다.

 

2. 선형적인 탐색

select 함수는 각 소켓의 상태를 확인하기 위해 모든 소켓을 순차적으로 탐색한다. 이는 소켓의 개수에 비례하여 시간이 증가하므로, 많은 수의 소켓이 있는 경우에는 효율이 저하될 수 있다. 이러한 선형적인 탐색은 스케일링 문제와 연관되며, 소켓이 많은 시스템에서는 다른 비동기 입출력 모델이 더 효율적일 수 있다.

 

더보기

모범 답안

select 함수호출 이후에 항상 등장하는, 모든 파일 디스크립터를 대상으로 하는 반복문

select 함수를 호출할 때마다 인자로 매번 전달해야 하는 관찰대상에 대한 정보들

 

 

02. select 방식이나 epoll 방식이나, 관찰의 대상이 되는 파일 디스크립터의 정보를 함수호출을 통해서 운영체제에 전달해야 한다. 그렇다면 이들 정보를 운영체제에게 전달하는 이유는 어디에 있는가?

1. 이벤트 감지

파일 디스크립터에 대한 정보를 운영체제에 전달함으로써, 운영체제는 해당 팡리 디스크립터에 발생한 이벤트를 감지할 수 있다.

이는 파일 디스크립터에 대한 입출력 가능 여부를 실시간으로 파악하기 위한 것이다.

 

2. 블로킹과 비블로킹 모드 제어

운영체제는 파일 디스크립터의 정보를 바탕으로 블로킹 또는 비블로킹 모드로 소켓 또는 파일을 설정한다.

이는 입출력 작업이 차단되거나 차단되지 않도록 제어하는데 도움을 준다.

 

3. 이벤트 처리

운영체제는 전달받은 파일 디스크립터의 정보를 바탕으로 해당 이벤트를 처리한다.

이는 읽기 가능한 데이터를 읽어들이고 쓰기 가능한 상태에서 데이터를 전송하는 등의 작업을 수행하는데 사용된다.

 

정리하면, 파일 디스크립터의 정보를 운영체제에 전달함으로써 운영체제는 해당 파일 디스크립터의 상태를 감지하고 제어하며, 이벤트를 처리할 수 있도록 도와준다. 이를 통해 효율적인 입출력 처리와 이벤트 기반 동작을 구현할 수 있다.

 

더보기

모범 답안

select와 epoll은 파일 디스크립터, 정확히 말하면 소켓변화의 관찰이 요구되는 방식이다.

그런데 소켓은 운영체제에 의해 관리가 된다.

즉, select 방식과 epoll 방식은 절대적으로 운영체제에 의해 완성되는 함수이다.

때문에 관찰대상의 정보를 운영체제에 전달해야 한다.

 

 

03. select 방식과 epoll 방식의 가장 큰 차이점은 관찰의 대상이 되는 파일 디스크립터를 운영체제에게 전달하는 방식에 있다. 어떻게 차이가 나는지, 그리고 그러한 차이를 보이는 이유는 무엇인지 설명해보자.

select 방식과 epoll 방식의 가장 큰 차이점은 관찰의 대상인 파일 디스크립터를 운영체제에게 전달하는 방식에 있다.

 

1. select 방식

- select 함수를 호출 할 때, 관찰할 파일 디스크립터들을 집합에 등록하고 이를 운영체제에게 전달한다.

- select 함수가 호출되면, 운영체제는 모든 등록된 파일 디스크립터를 순회하면서 이벤트 발생 여부를 체크한다.

- 이벤트 발생 여부를 체크하기 위해서는 파일 디스크립터들의 정보를 반복해서 운영체제에게 전달해야 한다. 이는 호출될 때마다 파일 디스크립터 집합을 전달하는 방식이다.

- 따라서 select 방식은 대량의 파일 디스크립터를 처리할 때 성능 문제가 발생할 수 있다. 모든 파일 디스크립터를 반복적으로 전달해야 하기 때문에 시스템 자원의 낭비가 발생할 수 있다.

 

2. epoll 방식

- epoll을 사용하기 위해 epoll_create 함수를 호출하여 epoll 인스턴스를 생성하고, epoll_ctl 함수를 호출하여 관찰할 파일 디스크립터를 등록한다.

- 등록된 파일 디스크립터들의 정보는 운영체제 내부에 저장된다. epoll 인스턴스는 이러한 정보를 가지고 있으므로 반복적으로 전달할 필요가 없다.

- epoll_wait 함수를 호출하여 이벤트가 발생한 파일 디스크립터들의 목록을 반환받을 수 있다. 이는 epoll 인스턴스 내부에 저장된 파일 디스클비터들의 정보를 운영체제가 직접 확인하고 반환하는 방식이다.

- 따라서 epoll 방식은 파일 디스크립터의 집합을 전달하는 오버헤드가 없으며, 대량의 파일 디스크립터를 효율적으로 관리할 수 있다.

 

더보기

모범 답안

epoll은 select 방식과 달리 관찰의 대상이 되는 파일 디스크립터의 정보를 한번씩만 전달하면 된다.

epoll 방식은 select 방식의 단점을 극복하여 리눅스 커널에서 관찰의 대상 정보를 기억하는 방식이기 때문이다.

 

 

04. select 방식을 개선시킨 것이 epoll 방식이긴 하지만 select 방식도 나름의 장점이 있다. 어떠한 상황에서 select 방식을 선택하는 것이 보다 현명한 선택이 될 수 있는가?

1. 작은 규모의 네트워크

네트워크 규모가 작고 동시에 처리해야 할 파일 디스크립터 수가 적을 때 select 방식은 충분히 사용될 수 있다.

작은 규모의 서버에서는 select 방식이 간단하고 구현하기 쉬우며, 성능상 큰 문제가 없을 수 있다.

 

2. 플랫폼 호환성

select 함수는 여러 플랫폼에서 널리 지원되는 기능이다.

따라서 특정 플랫폼에 종속되지 않고 호환성을 유지해야 하는 경우에는 select 방식을 선택할 수 있다.

 

3. 동시 처리할 파일 디스크립터 수의 제한

select 방식은 파일 디스크립터 집합을 관찰하기 때문에 처리할 수 있는 파일 디스크립터 수의 제한이 있을 수 있다.

작은 수의 동시 연결만 다루어야 하는 경우 select 방식을 사용할 수 있다.

 

4. 단순한 응용 프로그램

select 방식은 단순한 응용 프로그램에 적합할 수 있다. 예를 들어, 싱글 스레드 환경에서 작동하거나, 동시에 처리해야 할 다른 작업이 없는 경우에는 select 방식이 간단하고 효율적일 수 있다.

 

더보기

모범 답안

서버의 접속자 수가 많지 않으면서 (고성능이 요구되지 않으면서), 다양한 운영체제에서 운영이 가능해야 하는 경우.

 

 

05. epoll은 레벨 트리거 방식, 또는 엣지 트리거 방식으로 동작한다. 그렇다면 이 둘이 어떻게 차이가 나는지 이벤트의 발생시점을 입력버퍼 기준으로 설명해보자.

레벨 트리거와 엣지 트리거는 epoll에서 이벤트를 처리하는 방식에 대한 개념이다.

이들의 가장 큰 차이점은 이벤트가 언제 발생되는지에 있다. 

 

1. 레벨 트리거 (Level-Triggered)

- 레벨 트리거 방식은 입력 버퍼에 데이터가 남아있는 한, 이벤트가 계속해서 발생한다.

- 즉, 입력 버퍼에 데이터가 있으면 해당 파일 디스크립터는 항상 이벤트가 발생한 것으로 처리한다.

- 따라서 데이터를 읽거나 쓸 수 있는 경우, epoll_wait 함수가 호출될 때마다 이벤트가 발생한다.

- 레벨 트리거 방식은 이벤트가 발생할 때마다 반드시 데이터를 모두 읽거나 써야하기 때문에, 응용 프로그램이 데이터를 처리하지 않으면 이벤트가 반복해서 발생하게 될 수 있다.

 

2. 엣지 트리거(Edge-Triggered)

- 엣지 트리거 방식은 입력 버퍼에 새로운 데이터가 들어오거나, 출력 버퍼로부터 데이터를 읽어서 버퍼가 비워질 때만 이벤트가 발생한다.

- 즉, 입력 버퍼에 변화가 있을 때만 이벤트가 발생하고, 변화가 없는 한 추가적인 이벤트는 발생하지 않는다.

- 엣지 트리거 방식은 epoll_wait 함수를 호출했을 때, 현재 상태에서 이벤트가 발생한 파일 디스크립터만 리턴된다.

- 응용 프로그램은 데이터를 읽거나 쓴 후에야 다시 이벤트를 감지할 수 있다.

 

더보기

모범 답안

레벨 트리거 방식에서는 입력 버퍼에 데이터가 남아있는 동안 계속해서 이벤트가 등록된다.

반면 엣지 트리거 방식에서는 입력 버퍼에 데이터가 들어올 때 이벤트가 등록된다.

 

 

06. 엣지 트리거 방식을 사용하면 데이터의 수신과 데이터의 처리시점을 분리할 수 있다고 하였다. 그 이유는 무엇이고, 이는 어떠한 장점이 있는가?

1. 데이터의 수신과 처리의 독립성

엣지 트리거 방식은 데이터의 수신 이벤트가 발생할 때만 이벤트를 처리하므로, 데이터의 수신과 처리를 분리할 수 있다.

이는 응용 프로그램이 데이터를 수신하는 동안 다른 작업을 수행하거나, 처리에 많은 시간이 소요되는 작업을 비동기적으로 처리할 수 있는 유연성을 제공한다.

 

2. 이벤트 누락 방지

레벨 트리거 방식은 데이터가 남아있는 한 항상 이벤트를 발생시키기 때문에, 응용 프로그램이 데이터를 처리하지 않으면 이벤트가 반복해서 발생하게 된다.

반면에 엣지 트리거 방식은 데이터의 변화가 있는 경우에만 이벤트가 발생하므로, 데이터를 읽은 후에는 추가적인 이벤트가 발생하지 않는다.

이는 이벤트의 누락을 방지하고, 응용 프로그램이 이벤트를 더 효율적으로 처리할 수 있도록 한다.

 

3. 처리 성능 향상

엣지 트리거 방식은 데이터의 변화에 대해서만 이벤트를 발생시키기 때문에,

응용 프로그램은 항상 데이터가 변화할 때만 처리를 수행하면 된다.

이는 불필요한 이벤트 핸들링을 피하고, 처리 성능을 향상시킬 수 있는 장점을 제공한다.

 

더보기

모범 답안

엣지 트리거 방식을 사용하면 입력 버퍼에 데이터가 수신될 때 딱 한번만 이벤트가 발생하고, 입력 버퍼에 데이터가 남아있는 동안에는 이벤트가 발생하지 않기 때문에 데이터가 수신된 이후에 원하는 시점에 가서 데이터를 처리할 수 있다.

그리고 이렇게 수신과 처리의 시점을 분리하면 서버 구현에 엄청난 유연성을 갖게 된다.

 

 

07. 서버에 접속한 모든 클라이언트들 사이에서 메시지를 주고받는 형태의 채팅 서버를 레벨 트리거 방식의 epoll 기반으로, 엣지 트리거 방식의 epoll 기반으로 각각 구현해보자.

 

(생략)

 


출처 : [윤성우의 열혈 TCP / IP 소켓 프로그래밍] / 윤성우 저 / 오렌지 미디어

https://cafe.naver.com/cstudyjava

 

윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페

윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^

cafe.naver.com