본문 바로가기
Develop/Network

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

by Tarra 2023. 7. 2.

 

 

 

 

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

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

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

 

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

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

01. 하나의 CPU를 기반으로 어떻게 둘 이상의 프로세스가 동시에 실행되는지 설명해보자, 그리고 그 과정에서 발생하는 컨텍스트 스위칭이 무엇인지도 함께 설명해보자.

하나의 CPU를 기반으로 둘 이상의 프로세스가 동시에 실행되는 것은 시분할(Time-sharing) 방식을 통해 가능하다.

시분할 방식은 CPU 시간을 작은 시간 단위로 나누어 여러 프로세스에 할당하여 각 프로세스가 동시에 실행되는 것처럼 보이게 한다.

이를 가능하게 하는 주요한 개념이 바로 컨텍스트 스위칭이다.

 

컨텍스트 스위칭은 CPU가 현재 실행 중인 프로세스에서 다음으로 실행할 프로세스로 전환하는 과정을 말한다.

이 과정에서 CPU는 실행 중인 프로세스의 상태를 저장하고, 다음에 실행할 프로세스의 상태를 불러와야 한다. 

이는 다음과 같은 단계로 이루어진다.

 

1. 현재 실행 중인 프로세스의 상태 저장

현재 실행중인 프로세스의 레지스터 상태, 프로그램 카운터, 스택 등의 정보를 저장한다.

 

2. 다음에 실행할 프로세스 선택

스케줄러에 의해 다음에 실행할 프로세스가 선택된다.

이는 우선순위, 동작 큐, 시간 할당량 등을 기반으로 결정된다.

 

3. 다음에 실행할 프로세스 상태 로드

선택된 다음 프로세스의 저장된 상태를 불러온다.

이는 레지스터 상태, 프로그램 타운터, 스택 등의 정보를 복원하는 과정이다.

 

4. CPU 제어권 이전

선택된 다음 프로세의 상태가 복원된 후, CPU의 제어권이 해당 프로세스로 이전된다.

이로 인해 선택된 프로세스가 실행되며, 이전에 실행 중이었던 프로세스는 중단된다.

 

컨텍스트 스위칭은 프로세스 간의 전환 속도를 매우 빠르게 수행해야 하므로, 상대적으로 많은 리소스와 시간을 소모한다.

따라서 많은 컨텍스트 스위칭이 발생하면 오버헤드가 발생할 수 있다.

이를 최소화하기 위해 스케줄링 알고리즘과 커널의 성능 향상 기법이 적용된다.

 

더보기

모범 답안

CPU의 실행 시간을 프로세스가 고속으로 나누기 때문에 둘 이상의 프로세스가 동시에 실행 가능하다.

그리고 컨텍스트 스위칭이란, CPU에 의한 실행의 대상을 변경하는 과정에서 발생하는 준비 과정으로써, 이전에 실행되던 프로세스의 데이터를 메모리 공간에서 내리고 이어서 실행될 프로세스의 데이터를 메모리 공간에 올리는 작업을 의미한다.

 

 

02. 쓰레드의 컨텍스트 스위칭이 빠른 이유는 무엇인가? 그리고 쓰레드간의 데이터 교환에는 IPC와 같은 별도의 기법이 불필요한 이유는 무엇인가?

1. 공유하는 메모리

쓰레드는 하나의 프로세스 내에서 실행되기 때문에, 각 쓰레드는 프로세스 내의 동일한 주소 공간을 공유한다.

이로 인해 쓰레드 간의 컨텍스트 스위칭 시에는 메모리 상태를 변경할 필요가 없으므로 빠른 스위칭이 가능하다.

 

2. 작은 컨텍스트

쓰레드 간의 컨텍스트 스위칭은 프로세스 간의 컨텍스트 스위칭보다 더 작은 범위의 작업이 필요하다.

프로세스 간의 컨텍스트 스위칭은 주소 공간, 파일 디스크립터 등의 전체 프로세스 상태를 변경해야 하지만,

쓰레드 간의 컨텍스트 스위칭은 스택, 레지스터 등의 작은 컨텍스트만 변경하면 된다.

 

따라서, 쓰레드 간의 컨텍스트 스위칭은 프로세스 간의 컨텍스트 스위칭보다 빠르다.

또한, 쓰레드 간의 데이터 교환에 별도의 기법이 필요하지 않은 이유는 다음과 같다.

 

1. 공유 메모리

쓰레드는 동일한 프로세스 내에서 실행되며, 주소 공간을 공유하기 때문에 메모리를 통한 데이터 공유가 가능하다.

따라서, 쓰레드 간에는 일반적으로 변수나 데이터 구조를 직접 공유할 수 있다.

 

2. 동기화 기법

쓰레드 간의 데이터 공유 시 발생할 수 있는 동기화 문제를 해결하기 위해 동기화 기법을 사용할 수 있다.

동기화 기법을 통해 쓰레드 간 데이터 접근을 제어하고, 데이터의 일관성과 안전성을 보장할 수 있다.

 

더보기

모범 답안

쓰레드 각각의 고유 데이터는 프로세스 각각의 고유 데이터보다 크기가 작다.

때문에 컨텍스트 스위칭의 과정에서 올리고 내릴 데이터의 크기가 그만큼 작으며,

이로 인해서 프로세스의 컨텍스트 스위칭보다 속도가 빠르다.

또한 모든 쓰레드는 스택을 제외한 나머지 메모리 공간을 공유하기 때문에 IPC와 같은 별도의 통신 기법을 필요로 하지 않는다.

 

 

03. 실행흐름의 관점에서 프로세스와 쓰레드를 구분하여라.

프로세스

- 프로세스는 운영체제로부터 자원을 할당받아 독립적으로 실행되는 단위이다.

- 각각의 프로세스는 독립된 주소 공간, 파일 디스크립터, 메모리, 레지스터 등의 자원을 가지고 있다.

- 다중 쓰레드 프로세스는 여러 개의 쓰레드를 가지고 있으며, 각각의 쓰레드는 프로세스의 자원을 공유한다.

- 각각의 프로세스는 독립된 실행 흐름을 가지고 있어, 다른 프로세스의 영향을 받지 않고 독립적으로 실행된다.

- 프로세스 간 통신(IPC)을 위해서는 별도의 메커니즘을 사용해야 한다.

 

쓰레드

- 쓰레드는 프로세스 내에서 실행되는 실행 흐름의 단위이다.

- 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있고, 이러한 쓰레드들은 프로세스의 자원을 공유한다.

- 쓰레드는 프로세스의 주소 공간, 파일 디스크립터, 힙 메모리 등을 공유하며, 각 쓰레드는 독립적인 스택과 레지스터 값을 갖는다.

- 다중 쓰레드 프로세스에서 각각의 쓰레드는 동시에 실행될 수 있고, 각 쓰레드는 병렬적으로 동작할 수 있다.

- 쓰레드 간 통신은 프로세스 내에서 자원 공유를 통해 이루어진다. 따라서 별도의 IPC 기법 없이도 데이터를 공유하고 통신할 수 있다.

 

더보기

모범 답안

프로세스는 운영체제 관점에서의 실행 흐름을 의미하고,

쓰레드는 프로세스 내에서 구분되는 실행의 흐름을 의미한다.

 

 

04. 다음 중에서 임계영역과 관련해서 잘못 설명하고 있는 것을 모두 고르면?

a. 임계영역은 둘 이상의 쓰레드가 동시에 접근(실행)하는 경우에 문제가 발생하는 영역을 의미한다.

 

b. 쓰레드에 안전한 함수는 임계영역이 존재하지 않아서 둘 이상의 쓰레드가 동시에 호출해도 문제가 발생하지 않는 함수를 의미한다.

쓰레드에 안전한 함수는 여러 쓰레드에서 동시에 호출되더라도 안전하게 실행될 수 있는 함수를 의미한다.

이러한 함수는 동기화 메커니즘 없이도 안전하게 동작할 수 있다.

 

c. 하나의 임계영역을 하나의 코드블록으로만 구성된다. 하나의 임계영역이 둘 이상의 코드블록으로 구성되는 경우는 없다. 즉, A 쓰레드가 실행하는 코드블록 A와 B 쓰레드가 실행하는 코드블록 B 사이에서는 절대 임계영역이 구성되지 않는다.

임계영역은 한 번에 하나의 쓰레드만이 접근할 수 있는 코드 영역을 의미한다.

이 코드 영역은 일반적으로 블록으로 구성되지만, 여러 개의 코드 블록으로 구성될 수도 있다.

따라서 A 쓰레드가 실행하는 코드 블록 A와 B 쓰레드가 실행하는 코드 블록 B 사이에도 임계영역이 구성될 수 있다.

 

d. 임계영역은 전역변수의 접근코드로 구성된다. 이외의 변수에서는 문제가 발생하지 않는다.

임계영역은 전역변수의 접근뿐만 아니라, 공유 자원이나 데이터에 접근하는 모든 코드로 구성될 수 있다.

전역변수는 임계영역의 일반적인 예시일 뿐이다. 

다른 자원에 대한 접근도 동시 접근으로 인한 문제를 발생시킬 수 있으며, 이를 해결하기 위해 임계영역과 동기화 메커니즘을 사용한다.

 

정답 b, c, d

 

 

05. 다음 중에서 쓰레드의 동기화와 관련해서 잘못 설명하고 있는 것을 모두 고르면?

a. 쓰레드의 동기화는 임계영역으로의 접근을 제한하는 것이다.

 

b. 쓰레드의 동기화에는 쓰레드의 실행순서를 컨트롤한다는 의미도 있다.

 

c. 뮤텍스와 세마포어는 대표적인 동기화 기법이다.

 

d. 쓰레드의 동기화는 프로세스의 IPC를 대체하는 기법이다.

쓰레드의 동기화는 멀티쓰레드 환경에서 동시에 실행되는 쓰레드들 간의 상호작용을 조절하기 위한 기법으로 사용된다.

이와는 별개로, 프로세스 간 통신을 위한 IPC기법은 다른 프로세스들 간에 데이터를 주고 받거나 동기화하는 메커니즘을 제공한다.

 

정답 d

 

 

06. 리눅스의 쓰레드를 완전히 소멸하는 방법 두가지를 설명하여라.

1. pthread_join 함수 사용

pthread_join 함수는 쓰레드가 종료될 때까지 현재 실행중인 쓰레드를 블록시키는 역할을 한다.

이 함수를 사용하여 쓰레드가 종료되기를 기다린 후, 해당 쓰레드를 완전히 소멸할 수 있다.

pthread_join 함수는 쓰레드의 종료 상태를 확인할 수도 있으므로, 필요에 따라 종료 상태를 확인하고 처리할 수도 있다.

 

2. pthread_detach 함수 사용

pthread_detach 함수는 쓰레드를 분리(detach)시켜 소멸 가능한 상태로 만든다.

분리된 쓰레드는 종료되었을 때 자동으로 자원이 회수되며, 다른 쓰레드에서 해당 쓰레드의 종료 상태를 확인할 수 없다.

따라서, 분리된 쓰레드의 자원 해제를 위해 별도의 조치가 필요하지 않다.

 

더보기

모범 답안

다음 두 함수 중 하나를 호출해서 명시적으로 쓰레드의 완전 소멸을 명시해야 한다.

- pthread_join 함수의 호출

- pthread_detach 함수의 호출

 

 

07. 에코 서버를 멀티쓰레드 기반으로 구현해보자. 단, 클라이언트가 전송하는 메시지의 저장을 목적으로 선언되는 메모리 공간을 모든 쓰레드가 공유하도록 하자. 참고로 이는 간단하게나마 본무에서 보인 동기화 기법의 적용을 유도하기 위한 것일 뿐, 이렇게 구현하면 다소 이치에 맞지 않는 에코 서버가 만들어진다.

 

(생략)

 

 

08. 위의 문제 7에서는 에코 메시지의 송수신에 사용할 메모리 공간을 모든 쓰레드가 공유할 것을 요구하고 있다. 이렇게 구현을 하면 동기화를 해도, 안 해도 문제가 발생하는데, 각각의 경우에 따라서 어떠한 문제가 발생하는지 설명해보자.

 

(생략)

 


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

https://cafe.naver.com/cstudyjava

 

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

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

cafe.naver.com