다중 접속 서버
: 여러 클라이언트들에게 동시에 서비스를 제공할 수 있는 프로그램
구현 방법
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이라는 구조체를 함수 인자로 받기 때문.
멀티테스킹 기반의 다중접속 서버
: 연결 요청을 수락하는 프로세스, 서비스를 제공하는 프로세스 두 가지로 프로그램의 흐름을 나누어야함.
-> 자식 프로스세를 생성할때 연결 요청 수락한 소켓의 파일 디스크립터를 전달
'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 |