TCP IP

TCP/IP - 8,10챕터

joo_coding 2025. 4. 4. 14:04
소켓  
포트번호  
프로세스  
도메인  
   
   
   
   
   
   

 

8. 도메인

도메인이란?

인터넷에서 특정 서버나 서비스를 찾는 주소 역할 = 서버와 클라이언트를 연결해주는 역할

IP주소는 숫자로 되어있는데 인간이 이를 알아보기 어려우니

IP주소를 대신하고, 인간이 알아보기 쉽게 표현한 것이 도메인이다. 

 

< 도메인을 사용하면 좋은 이유 >

ip주소는 변경 확률이 높기 때문에

개발자 입장에서 ip주소를 바탕으로 프로그램을 작성하는 것은 좋지않다.

그래서 변경할 일이 상대적으로 더 적은 도메인을 사용하면 유지가 편하다.

 

< DNS 서버 >

DNS란, 도메인을 IP주소로 변환해서 해당 서버로 실제 접속하는 것

 

< 관련 함수 >

 

 

10. 멀티프로세스 기반의 서버구현

 

다중접속 서버 구현 방법

1.멀티프로세스 기반 서버

2.멀티플렉싱 기반 서버

3.멀티쓰레딩 기반 서버

 

프로세스란?

"메모리 공간을 차지한 상태에서 실행중인 프로그램"

실행 전 = 프로그램

실행 후 = 프로세스

음악을 들으면서 작업하고, 중간에 메신저로 대화도 한다면? 총 3개의 프로세스를 생성하는 셈

하나의 프로그램이 여러개의 프로세스를 생성하기도 함 (대표적으로 멀티프로세스 기반)

OS는 여러 프로세스를 관리하며 메모리를 효율적으로 관리하고. 여러가지 일을 처리하는 일을 함

 

<프로세스 ID>

대부분의 OS는 프로세스를 구분하기 위해 프로세스에게 PID를 부여함

2 이상의 정수형태임 (1은 운영체제가 시작되자마자 실행되는 프로세스에 할당됨)

 

<프로세스 생성 방법>

프로세스를 생성하는 방법에는 여라기지가 있다.

그 중에서 멀티프로세서 기반 서버 구현에 사용되는 fork 함수를 알아보자

 

<fork 함수>

멀티프로세스 기반 서버 구현에 사용

이 함수는 호출한 프로세스의 복사본을 생성함

메모리 영역까지 복사하기 때문에 구분이 필요함

fork 함수의 반환값을 기준으로 구분 할 수 있음

 

-부모 프로세스(원본): fork 반환값은 자식 프로세스의 ID

-자식 프로세스(복사본): fork 반환값 0

함수 호출 이후 두개의 프로세스가 서로 완전히 분리된 메모리 구조를 지니고 있음 ( 병렬차리 가능 )

 

< 자식 프로세스를 만드는 이유 >

개발자는 사용자에게 서비스를 제공하는 프로그램을 만드는데

그 프로그램이 한번에 하나의 일 밖에 못하면 사용자는 답답하지 않겠는가?

그래서 부모는 자식을 여러개 만들어서 여러 일을 처리 할 수 있게하여 사용자에게 편의를 제공한다.

이를 병렬처리 라고 한다.

예를들어 파일다운 프로그램이라고 하면, 여러개의 파일을 동시에 다운로드 받을 수 있는 것이다.

 

<좀비 프로세스>

파일을 열었으면 닫는게 중요한 것 처럼, 프로세스도 생성했으면 소멸 해주는 것이 아주 중요함.

프로세스는 확실히 소멸시켜주지 않으면 좀비가 되어 날 괴롭힘

 

<좀비프로세스가 생성되는 이유>

fork함수로 생성된 자식 프로세스를 종료할 수 있는 방법

1.exit함수로 전달되는 인자 값

2.main함수에서 return으로 반환되는 값

 

위 값들은 모두 OS로 전달됨

OS가 값을 부모프로세스에게 전달해줄때까지 자식프로세스는 소멸되지 않음

값은 부모프로세스가 OS한테 요청해야만 전달해줌

그래서 부모가 적극적으로 값을 요청하지 않으면 자식은 좀비 상태로 남아있음

 

<좀비프로세스 소멸 방법>

1.wait 함수 

함수를 호출하면 자식을 종료하면서 전달한 깂이 매게변수로 전달된 주소의 변수에 저장됨

그런데 이 변수에 저장되는 값에 자식 프로세스가 종료되면서 전달한 값 이외에도 다른 정보가 포함되어

다음 매크로를 통해 값의 분리과정을 거쳐야함

 

WIFEXITED: 자식 프로세스가 정상 종료한 경우 참을 반환

WEXITSTATUS: 자식 프로세스 전달 값을 반환

 

주의점: 이 함수 호출 시점에 자식 프로세스가 없다면, 자식 프로세스가 종료될 때 까지 블로킹 상태에 놓임

 

2.waitpid 함수 

좀비 프로세스 생성을 막는것 + 블로킹 문제 해결책

 

<시그널 핸들링>

하지만 자식 프로세스가 언제 종료될 줄 알고 함수를 호출하는가?

이 부분을 해결해줄 수 있는 기능이 있다.

자식 종료의 인식 주체는 OS인데

OS가 부모에게 자식이 종료되었다고 알려주면 매우 효율적이다.

이 기능이 바로 시그널 핸들링이다.

 

<signal 함수>

부모 프로세스는 OS에게 자식 프로세스가 종료되면 알려달라고 요청할 수 있다.

요청하는 방법은 signal 함수 호출이다. (시그널 등록 함수라고 함)

 

이 함수는 반환값이 함수 포인터라, 선언이 다소 복잡함

 

[ 2. 멀티태스킹 기반의 다중접속 서버 ]

에코 서버는 한번에 하나의 클라이언트에게만 서비스를 제공 할 수 있음

즉, 동시에 둘 이상의 클라이언트에게는 서비스 제공이 불가함

둘 이상이 가능하도록 에코서버를 확장할 수 있음

 

클아이언트가 에코서버에 서비스를 요청하면 에코서버는 그때마다 자식프로세스를 생성함

 

< 입출력 루틴 분할 >

에코 클라이언트의 데이터 에코 방식

서버로 데이터를 전송 > 데이터가 에코되어 돌아올때까지 기다림 > 에코된 데이터가 돌아와야만 추가로 전송할 수 있음

데이터가 올때까지 마냥 기다려야 했던 이유는,

read와 write를 반복하는 구조였기 때문.

이렇게 할 수 밖에 없는 이유는 하나의 프로세스로만 프로그램이 동작했기 때문

 

하지만 이제는 둘 이상의 프로세스를 생성할 수 있으니

데이터의 송신과 수신을 분리할 수 있음

 

부모 프로세스가 실행하는 영역에는 수신과 관련한 코드만 작성하고

자식 프로세스가 실행하는 영역에는 송신과 관련한 코드만 작성하면 되니 코드 구현이 보다 수월해짐