둘 이상의 프로세스는 운영체제의 의해 실행 된다.
이때, CPU 스케줄링 -> context switching 발생 -> 이전 데이터 스왑영역에 이동(하드디스크에 보관 됨)
이런 작업의 부담으로 경량화 된 프로세스 등장 (스레드)
다중 접속 서버의 구현 방법들
1) 멀티 프로세스 기반 서버 : 다수의 프로세스를 생성하는 방식
2) 멀티 플렉싱 기반 서버 : 입출력 대상을 묶어서 관리하는 방식으로 서비스 제공
3) 멀티 쓰레딩 기반 서버 : 클라이언트 수만큼 쓰레드를 생성하는 방식으로 서비스 제공
프로세스란
- 간단하게는 실행 중인 프로그램을 뜻한다.
- 실행중인 프로그램에 관련된 메모리, 리소스 등을 총칭하는 의미이다.
- 멀티프로세스 운영체제는 둘 이상의 프로세스를 동시에 생성 가능하다.
프로세스 ID
운영체제는 생성되는 모든 프로세스에 id를 할당한다.
fork()
함수가 호출되면 호출한 프로세스가 복사되어 fork함수 호출 이후를 각각의 프로세스가 독립적으로 실행하게 된다.
부모 프로세스 에서는 자식 프로세스의 ID(0이 아닌 값). 자식 프로세스에서는 0값을 반환.
좀비 프로세스
프로세스 간에는 부모-자식 계층 관계를 갖는다.
자식 프로세스가 종료되면 실제로 메모리 상에서 사라지지 않고 OS에게 값을 반환하게 된다. 부모 프로세스가 자식 프로세스가 반환한 값을 확인 할 때 비로서 자식 프로세서는 사라진다. 그 값이 int main 함수의 return 값이다.
자식 프로세스가 종료되었지만 아직 소멸되지 않은 상태(부모 프로세스가 자식 프로세스가 종료하면서 반환한 값을 확인하지 않은 상태)
자식 프로세스가 좀비 상태에서 부모 프로세스가 소멸 되면 자식 프로세스도 자동으로 같이 소멸 된다.
wait()
자식 프로세스의 반환값을 확인한다.
자식 프로세스가 종료되지 않았으면 블로킹 상태에 놓인다.
waitpid()
특정 프로세스 id를 지정하여 반환값을 얻는다.
블로킹 상태가 되지 않는다.
시그널 핸들링
좀비 프로세스가 생성되는 것을 os가 부모 프로세스에게 알려 줄 수 있다.
부모 프로세스 -> os (요구) => 등록
os -> 부모 프로세스 (알림) => 콜백함수 호출
시그널 종류
SIGALRM : alarm 함수호출을 통해서 등록된 시간이 된 상황
SIGINT : crtl + c 가 입력된 상황
SIGCHILD : 자식 프로세스가 종료된 상황
signal(),
시그널 등록 함수
타입과, 함수포인터 전달
sigaction()
운영체제와 상관 없이 동일한 인터페이스 제공
실제로 signal() 대신 sigaction() 함수 사용
프로세스 기반 다중접속 서버 모델
1단계 - 에코서버(부모프로세스)는 accpet 함수 호출을 통해서 연락 요청을 수락한다.
2단계 - 이때 얻게 되는 소켓의 파일 디스크립터를 자식 프로스에게 생성해서 넘겨준다.(실제로 fork 함수로 프로세스가 생성되면 부모프로세스의 모든 정보가 자식프로세스에도 복사 된다.)
3단계 - 자식 프로세스는 전달 받은 파일 스크립터(클라이언트와 연결에 필요한)를 바탕으로 서비스를 제공한다.
4단계 - 부모 프로세스는 클라이언트 소켓을 자식 프로세스는 리스닝 소켓을 제거한다(필요 없으므로) => 하나의 커널 오브젝트를 두개의 디스크립터가 가리키게 되면 모든 디스크립터가 제거되야 커널 오브젝트가 소멸 되므로 미리 관리 해주는 것이 좋다.
'Network' 카테고리의 다른 글
[인강/윤성우/TCP/IP 소켓 프로그래밍] IO 멀티플렉싱(select 모델) (0) | 2022.03.10 |
---|---|
[인강/윤성우/TCP/IP 소켓 프로그래밍] 프로세스간 통신 (0) | 2022.03.08 |
[인강/윤성우/TCP/IP 소켓 프로그래밍] 소켓의 다양한 옵션 (0) | 2022.03.03 |
[인강/윤성우/TCP/IP 소켓 프로그래밍] 도메인 이름과 인터넷 주소 (0) | 2022.03.02 |
[인강/윤성우/TCP/IP 소켓 프로그래밍] TCP half close (0) | 2022.03.02 |