본문 바로가기

Golang/etc

tcp/ip -10 멀티프로세스 기반의 서버 구현

728x90
반응형

다중 접속 서버

: 여러 클라이언트들에게 동시에 서비스를 제공할 수 있는 프로그램 

 

구현 방법 

1. 멀티프로세스 기반 서버 : 다수의 프로세스를 생성하는 방식으로 서비스 제공

2. 멀티플렉싱 기반 서버 : 입출력 대상을 묶어서 관리하는 방식으로 서비스 제공

3. 멀티 쓰레딩 기반 서버 : 클라이언트의 수만큼 쓰레드를 생성하는 방식으로 서비스 제공

 

프로세스란?

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

 

프로그램을 실행시키면 메인 메모리로 이동해서 실행할 준비를 마치게 됨 -> 이때부터 프로세스라 부를 수 있음

이 프로세스에 번호를 매긴 것이 ProcessID = pid 

 

* fork 함수 호출을 통한 프로세스 생성

- fork함수는 호출한 프로세스의 복사본을 생성한다. 이미 실행중인 프로세스가 부모 프로세스가 되어 그 하위에 자식 프로세스를 생성하는 것. 

 

fork함수 호출 시 반환 값

- 자식의 pid

- 0

- -1 (오류 발생)

 

fork함수를 호출하는 순간 복사가 일어나기 때문에, 부모와 자식 프로세스 둘 다 fork 함수의 반환값을 받게 된다. 

 

 

좀비(Zombie) 프로세스

: 실행이 완료되었음에도 불구하고 소멸되지 않은 프로세스

main함수가 반환되면 소멸되어야 하는데, 소멸되지 않고 사용한 리소스가 메모리 공간에 여전히 존재한다는 의미

-> 자식 프로세스가 종료되면서 반환하는 상태 값이 부모 프로세스에게 전달되지 않으면,

해당 프로세스는 소멸되지 않고 좀비가 된다. 

 

wait() 함수

: 성공 시 종료된 자식 프로세스 ID, 실패 시 -1 반환

위 함수가 호출 되었을 때, 이미 종료된 자식 프로세스가 있다면, 자식 프로세스가 종료되면서 전달한 값이 매개변수로 전달된 주소의 변수에 저장된다. 

이 변수에는 다른 정보가 함께 포함되 있음

 

매크로 함수로 확인 가능 

- WIFEXITED : 자식 프로세스가 정상 종료한 경우 true를 반환

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

 

이 wait 함수가 호출괸 시점에 종료된 자식 프로세스가 없다면, 임의의 자식 프로세스가 종료될 때까지 블로킹 상태에 놓인다는 특징이 있다. 

 

waitpid 함수

: wait()함수는 블로킹 상태에 빠질 수 있는 반면, waitpid 함수는 블로킹 상태에 놓이지 않게끔 할 수 있다는 장점이 있다. 

-> 세번째 인자의 값으로 WNOHANG을 전달하면 종료된 프로세스가 없으면 0을 반환한다. 

 

 

시그널 핸들링

 

시그널 (Signal) 

: 특정 상황이 발생했음을 알리기 위해 운영체제가 프로세스에게 전달하는 메시지

부모 프로세스는 자식 프로세스의 종료 후 반환 값을 전달 받기 위해서는,

운영체제에게 자식 함수의 종료시 특정 함수를 호출해달라고 등록해야한다. -> 시그널 등록  

 

sigaction()

: 운영체제 종류에 상관없이 동작, sigaction이라는 구조체를 함수 인자로 받기 때문.

 

 

멀티테스킹 기반의 다중접속 서버

: 연결 요청을 수락하는 프로세스, 서비스를 제공하는 프로세스 두 가지로 프로그램의 흐름을 나누어야함.

-> 자식 프로스세를 생성할때 연결 요청 수락한 소켓의 파일 디스크립터를 전달 

728x90
반응형

'Golang > etc' 카테고리의 다른 글

tcp/ip - 09 소켓 옵션  (0) 2022.07.06
tcp/ip -08 DNS  (0) 2022.07.06
tcp/ip - 07 소켓의 종료  (0) 2022.07.04
golang udp example  (0) 2022.07.03
tcp/ip 05  (0) 2022.07.03