본문 바로가기
Develop/Network

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

by Tarra 2023. 6. 29.

 

 

 

 

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

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

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

 

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

 

www.orentec.co.kr

에서 확인할 수 있습니다.

 

 


 

01. 다음 중 프로세스에 대한 설명으로 옳지 않은 것을 모두 고르면?

 

a. 프로세스는 운영체제의 관점에서 프로그램의 실행 단위가 된다.

 

b. 프로세스도 생성방식에 따라서 부모와 자식의 관계를 갖는다.

 

c. 프로시스는 다른 프로세스를 포함할 수 있다. 즉, 하나의 프로세스는 자신의 메모리 영역에 또 다른 프로세스를 포함할 수 있다.

프로세스는 독립적인 실행 단위로서 각각 자신의 메모리 영역을 가지며, 다른 프로세스를 직접적으로 포함할 수 없다.

각 프로세스는 자신의 메모리 공간에 독립적으로 실행되고 데이터를 관리한다.

프로세스 간의 상호작용을 위해서는 프로세스간 통신(IPC) 기법을 사용해야 한다.

 

d. 자식 프로세스는 또 다른 자식 프로세스를 생성할 수 있고, 이렇게 생성된 자식 프로세스 역시 또 다른 자식 프로세스를 생성할 수 있지만, 이들은 모두 하나의 프로세스와만 부모 자식의 관계를 형성한다.

자식 프로세스는 또 다른 자식 프로세스를 생성할 수 있고, 이들은 모두 하나의 프로세스와 부모 자식의 관계를 형성할 수 있다.

즉, 여러 수준의 부모-자식 관계를 형성할 수 있다. 부모 프로세스는 자식 프로세스를 형성하고, 자식 프로세스는 또 다른 자식 프로세스를 생성할 수 있다. 이렇게 생성된 프로세스들은 계층 구조를 형성하게 된다.

 

정답 c, d

 

 

02. fork 함수가 호출되면 자식 프로세스가 생성되는데, 이 자식 프로세스의 특징으로 옳지 않은 것을 모두 고르면?

a. 부모 프로세스가 소멸되면 자식 프로세스도 소멸된다.

부모 프로세스와 자식 프로세스의 생존은 독립적이다.

부모 프로세스가 종료되더라도 자식 프로세스는 계속해서 실행될 수 있다. 자식 프로세스가 종료되는 경우에는 별도의 종료 조건이나 시그널에 의해 발생한다.

 

b. 자식 프로세스는 부모 프로세스의 모든 것을 복사해서 생성되는 프로세스이다.

 

c. 부모 프로세스와 자식 프로세스는 전역으로 선언되는 변수를 공유한다.

부모 프로세스와 자식 프로세스는 전역으로 변수를 공유하지 않는다.

부모 프로세스와 자식 프로세스는 각각 독립적인 메모리 공간을 가지며, 서로의 전역 변수에 대한 영향을 주지 않는다.

따라서 전역 변수의 값은 각각의 프로세스에 대해 별도로 유지된다.

 

d. fork 함수 호출로 생성된 자식 프로세스는 부모 프로세스가 실행한 코드를 처음부터 fork 함수가 호출된 위치까지 실행해 온다.

fork 함수 호출 이후, 자식 프로세스는 부모 프로세스가 실행한 코드를 그대로 복사하지 않고, fork 함수 호출 이후부터 실행을 시작한다.

fork 함수 이전에 실행된 코드는 자식 프로세스에 영향을 주지 않는다.

자식 프로세스는 fork 함수 호출 이후의 코드부터 자신의 실행을 시작한다.

 

정답 a, c, d

 

 

03. 자식 프로세스가 생성되면 부모 프로세스의 모든 것을 복사하는데, 이때 복사의 대상으로는 소켓의 파일 디스크립터도 포함이 된다. 그렇다면 복사된 파일 디스크립터의 정수 값은 원본 파일 디스크립터의 정수 값과 동일한지 확인하기 위한 프로그램을 작성해보자.

 

(생략)

 

 

04. 프로세스가 좀비가 되는 경우에 대해서 설명하고, 이를 막기 위해서 어떠한 방법을 취해야 하는지 설명해 보자.

프로세스가 좀비상태가 되는 경우는 일반적으로 자식 프로세스가 종료되었지만, 부모 프로세스가 해당 종료 상태를 인식하지 않고 필요한 후처리를 수행하지 않는 경우이다.

좀비 상태에서는 프로세스 자원은 해제되지만, 프로세스의 메타데이터와 프로세스 ID는 여전히 시스템에 남아있게 된다.

 

좀비 프로세스가 너무 많아지면 시스템의 리소스를 소비하게 되므로, 좀비 프로세스를 막기 위해 부모 프로세스는 자식 프로세스의 종료 상태를 처리해야 한다. 이를 위해 부모 프로세스는 자식 프로세스의 종료를 감지하기 위한 작업을 진행해야 한다.

 

1. wait() 또는 waitpid() 함수 호출

부모 프로세스는 자식 프로세스의 종료를 대기하고, 해당 상태를 처리하는 데 사용된다. 이 함수들은 자식 프로세스가 종료될 때까지 대기하며, 종료 상태를 받아올 수 있다.

 

2. 시그널 핸들링

부모 프로세스는 SIGCHLD 시그널을 처리하여 자식 프로세스의 종료를 감지할 수 있다.

이 시그널을 처리하는 핸들러를 등록하여 자식 프로세스의 종료 상태를 확인하고 처리할 수 있다.

 

더보기

모범 답안

좀비가 되는 프로세스는 자식 프로세스이다.

자식 프로세스 종료 시 인자로 전달 및 반환하는 값은 운영체제로 넘어가는데, 이 값이 자식 프로세스의 부모 프로세스에게 전달될 때까지 해당 자식 프로세스는 좀비가 된다. 

따라서 이를 막기 위해서는 부모 프로세스가 자식 프로세스의 종료 값을 명시적으로 요청해야 하며, 이 값이 부모 프로세스에게 전달되고 나면 자식 프로세스는 소멸이 되어서 좀비로 남아있지 않게 된다.

 

 

05. SIGINT에 대한 핸들러를 등록하지 않은 상태에서 Ctrl+C 키가 입력되면, 운영체제가 지정해 놓은 디폴트 이벤트 핸들러에 의해서 프로그램이 종료되어 버린다. 그러나 Ctrl+C 키에 대한 핸들러를 직접 등록하면 프로그램은 종료되지 않고 프로그래머가 지정한 이벤트 핸들러가 대신 호출된다. 그렇다면 일반적인 프로그램에서 다음과 같이 동작하도록 이벤트 핸들러 등록을 위한 코드를 구성해보자.

"Ctrl + C 키가 눌리면, 정말로 프로그램을 종료할 것인지 묻고, 이에 대한 대답으로 'Y'가 입력되면 프로그램을 종료한다."

그리고 간단히 문자열을 1초당 한번 정도 반복 출력하는 프로그램을 작성해서 위의 이벤트 핸들러 등록 코드를 적용시켜보자.

 

(생략)

 

 

 


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

https://cafe.naver.com/cstudyjava

 

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

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

cafe.naver.com