본문 바로가기
Develop/Network

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

by Tarra 2023. 6. 30.

 

 

 

 

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

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

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

 

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

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

01. 멀티플렉싱 기술에 대한 일반적인 의미를 말하고, IO를 멀티플렉싱 한다는 것이 무엇을 의미하는지 설명해보자.

멀티플렉싱은 여러 개의 소스를 하나의 공유된 리소스로 효율적으로 전송 또는 처리하는 기술을 말한다.

이는 시간, 공간 또는 주파수 등의 차원에서 리소스를 공유하여 효율성을 높이는 것을 의미한다.

 

IO를 멀티플렉싱한다는 것은 입출력(IO) 작업을 처리하는 과정에서 다수의 입출력 소스를 단일 IO 리소스로 효율적으로 관리하는 것을 의미한다.

일반적으로 입출력 작업은 블로킹(IO 작업이 완료될 때까지 대기) 또는 비블로킹(IO 작업이 완료될 때까지 다른 작업을 수행) 방식으로 처리된다.

이와 달리 멀티플렉싱은 여러 개의 IO 작업을 하나의 리소스에 등록하고, IO 작업이 준비되었을 때 해당 작업을 선택적으로 처리하는 방식이다.

 

예를 들어, 여러 개의 네트워크 소켓이 있을 때, 각 소켓은 독립적으로 데이터를 송수신할 수 있다.

그러나 이들 소켓을 동시에 모니터링하고 데이터를 읽거나 쓰기 위해서는 여러 개의 IO 작업을 동시에 처리하는 것이 필요하다.

이때 멀티플렉싱을 사용하여 하나의 IO 리소스로 모든 소켓을 관리하면, 단일 스레드나 프로세스로 여러 소켓을 효율적으로 관리할 수 있다.

이는 리소스 사용을 최적화하고, 병렬 처리를 통해 성능을 향상시킬 수 있는 장점을 제공한다.

 

더보기

모범 답안

멀티플렉싱이란 최소한의 물리적인 요소만 사용해서 최대한의 데이터를 전송하는 기술이다.

마찬가지로 IO 멀티플렉싱이란 IO를 필요로 하는 소켓을 한데 묶어서 최소한의 리소스 및 프로세스를 이용해서 데이터를 송수신하는 기술을 의미한다.

 

 

02. 멀티프로세스 기반의 동시접속 서버의 단점은 무엇이며, 이를 멀티플렉싱 서버에서는 어떻게 보완하는지 설명해 보자.

1. 자원 낭비

각 클라이언트 요청마다 새로운 프로세스를 생성하는 방식이기 때문에, 프로세스 간의 메모리 공간을 독립적으로 유지해야 한다.

이로 인해 메모리 사용량이 증가하고, 많은 클라이언트 접속 시 프로세스 생성에 따른 자원 소비가 크게 증가한다.

 

2. 성능 저하

프로세스 간의 전환(context switch) 비용이 발생하며, 이는 시스템 자원의 낭비와 성능 저하로 이어진다.

또한, 동시에 실행되는 프로세스 수에 제한이 있어 동시 접속 클라이언트 수도 제한된다.

 

3. 확장 어려움

서버의 확장이 어렵고 복잡해진다. 프로세스 간의 통신과 동기화, 데이터 공유 등을 위한 추가적인 구현이 필요하며, 이는 개발과 유지보수의 어려움을 야기할 수 있다.

 

이러한 단점을 보완하기 위해 멀티플렉싱 서버를 사용할 수 있다. 멀티플렉싱 서버는 다은과 같은 방식으로 단점을 극복한다.

1. 단일 프로세스 / 스레드 

멀티플렉싱 서버는 단일 프로세스 또는 스레드에서 여러 클라이언트를 동시에 처리할 수 있다.

이는 프로세스 간의 생성 및 관리 비용을 절감하고, 자원을 효율적으로 사용할 수 있게 한다.

 

2. 이벤트 기반 처리

멀티플렉싱 서버는 비동기 이벤트 기반으로 동작하며, 여러 클라이언트의 입출력 이벤트를 단일 IO 리소스로 관리한다.

이로써 멀티 플렉싱을 통해 여러 클라이언트의 동시 처리가 가능해지며, 성능 향상과 확장성이 향상된다.

 

3. 효율적인 자원 관리

멀티플렉싱 서버는 단일 프로세스 / 스레드에서 동작하기 때문에 메모리 공간을 공유할 수 있다. 

이를 통해 자원 사용량을 최소화하고 성능을 개선할 수 있다.

 

4. 확장성

멀티플렉싱 서버는 비교적 간단한 확장이 가능하다.

추가적인 클라이언트의 접속은 새로운 소켓을 생성하고 멀티플렉싱을 통해 관리할 수 있으며, 별도의 프로세스 생성이나 동기화 작업이 필요하지 않다.

 

더보기

모범 답안

멀티프로세스 기반의 동시접속 서버는 클라이언트가 연결요청을 해 올 때마다 추가로 프로세스를 생성해서 서비스를 하는 방식이다.

그런데 프로세스의 생성은 매우 부담이 되는 작업이기 때문에 많은 수의 클라이언트에게 서비스를 제공하는데 한계가 있다.

반면 멀티플렉싱 서버는 소켓의 파일 디스크립터를 하나로 묶어서 관리하는 방식으로, 하나의 프로세스가 이를 모두 처리하기 때문에 프로세스 생성에 대한 리소스 소모가 없다.

 

 

03. 멀티플렉싱 기반의 서버 구현에서는 select 함수를 사용한다. 다음 중 select 함수의 사용방법에 대해서 잘못 설명한 것을 모두 고르면?

a. select 함수의 호출에 앞서 입출력의 관찰 대상이 되는 파일 디스크립터를 모으는 과정이 필요하다.

 

b. select 함수의 호출을 통해서 한번 관찰의 대상으로 등록이 되면, 추가로 select 함수를 호출하면서 재 등록의 과정을 거칠 필요가 없다.

select 함수의 호출을 통해 관찰 대상으로 등록된 파일 디스크립터들은 한 번의 호출로 계속해서 관찰되지 않는다.

select 함수는 호출 시점에서의 상태를 기반으로 관찰을 수행하며, 상태 변화가 있는 파일 디스크립터만을 반환한다.

따라서 관찰 대산의 상태가 변경되면, 다시 select 함수를 호출하여 새로운 상태를 확인해야 한다.

 

c. 멀티플렉싱 서버는 한 순간에 하나의 클라이언트에게만 서비스가 가능하다. 때문에 서비스를 필요로 하는 클라이언트는 서버에 접속한 후 자신의 순서가 오기를 기다려야 한다.

멀티플렉싱 서버는 한 순간에 여러 클라이언트에게 서비스를 제공할 수 있다. 

select 함수를 통해 여러 클라이언트의 상태 변화를 감지하고, 이에 따라 서비스를 제공한다.

따라서 클라이언트는 순서를 기다리지 않고 동시에 서비스를 받을 수 있다.

 

d. select 기반의 멀티플렉싱 서버는 멀티프로세스 기반의 서버와 달리 하나의 프로세스만 필요로 한다. 때문에 프로세스의 생성으로 인한 서버의 부담이 적다.

 

정답 b, c

 

 

04. select 함수의 관찰대상에 서버 소켓(리스닝 소켓)도 포함을 시켜야 한다. 그렇다면 어떠한 부류에 포함을 시켜야 하며, 그 부류에 포함시키는 이유도 설명해보자.

select 함수의 관찰 대상에 서버 소켓(리스닝 소켓)을 포함시켜야 한다.

서버 소켓은 입력 이벤트를 감지하여 클라이언트의 연결 요청을 받을 수 있도록 해주는 소켓이다.

 

서버 소켓은 클라이언트의 연결 요청을 처리하기 위해 'accept' 함수를 호출해야 한다. 따라서 select 함수를 통해 서버 소켓도 관찰 대상으로 등록하여 입력 이벤트를 감지할 수 있도록 해야한다.

 

서버 소켓을 select 함수의 관찰 대상에 포함시키는 이유는 다음과 같다.

1. 클라이언트의 연결 요청을 즉시 받을 수 있다.

서버 소켓을 포함하여 관찰 대상으로 설정하면, 클라이언으의 연결 요청이 발생했을 때 즉시 이를 감지하여 처리할 수 있다.

이는 실시간성을 요구하는 서비스에서 중요하다.

 

2. 효율적인 자원 관리

서버 소켓을 select 함수로 관찰하면, 연결 요청이 없는 경우에는 다른 파일 디스크립터의 상태 변화만 감지하고, 연결 요청이 발생한 경우에만 'accept' 함수를 호출하여 연결을 처리한다. 이는 자원의 효율적인 관리를 가능하게 한다.

 

더보기

모범 답안

서버 소켓(리스닝 소켓)은 '수신한 데이터가 존재하는가?'에 관심이 있는 파일 디스크립터의 부류로 묶어야한다.

왜냐하면 클라이언트의 연결 요청도 일종의 데이터 전송이기 때문이다.

 

 

05. select 함수의 호출에 사용되는 자료형 fd_set의 정의형태는 윈도우와 리눅스에서 차이를 보인다. 그렇다면 어떻게 차이가 나는지 설명하고, 차이가 날수밖에 없는 이유에 대해서도 설명해보자.

'fd_set'은 파일 디스크립터의 집합을 나타내는 자료형이다.

이 자료형은 주로 'select' 함수에서 사용되어 관찰 대상 파일 디스크립터를 설정하고 확인하는 데에 활용된다.

윈도우와 리눅스에서 'fd_set'의 정의와 사용 방법에 차이가 있다.

 

모범 답안
리눅스의 fd_set은 비트 배열로 구성되어 있는 반면, 윈도우의 fd_set은 소켓의 핸들을 저장할 수 있는 배열로
구성되어 있다.
리눅스의 파일 디스크립터는 0에서부터 시작해서 값이 하나씩 증가하는 구조를 지니기 때문에, 
생성된 파일 디스크립터의 수와 마지막으로 생성된 파일 디스크립터 수 사이에 어떠한 관계성을 찾아낼 수 있다.
그러나 윈도우 기반의 소켓 핸들은 0에서부터 시작하지 않을 뿐 아니라, 생성되는 핸들의 정수 값 사이에서도 
규칙을 찾아낼 수 없기 때문에 소켓의 핸들을 그대로 저장할 수 있는 배열이 필요하다.

 

 

 

 


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

https://cafe.naver.com/cstudyjava

 

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

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

cafe.naver.com