TCP/IP - 8,10챕터
| 소켓 | |
| 포트번호 | |
| 프로세스 | |
| 도메인 | |
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를 반복하는 구조였기 때문.
이렇게 할 수 밖에 없는 이유는 하나의 프로세스로만 프로그램이 동작했기 때문
하지만 이제는 둘 이상의 프로세스를 생성할 수 있으니
데이터의 송신과 수신을 분리할 수 있음
부모 프로세스가 실행하는 영역에는 수신과 관련한 코드만 작성하고
자식 프로세스가 실행하는 영역에는 송신과 관련한 코드만 작성하면 되니 코드 구현이 보다 수월해짐