프로세스 이해와 활용
trade off: 접속 대기 시간, 작업 수행 시간
- 다중접속 서버의 구현방법들
- 네트워크 프로그램의 경우 CPU 연산을 필요치 않는 데이터의 송수신 시간이 큰 비중을 차지하므로 여러 클라이언트에게 동시에 서비스를 제공하는 것이 CPU를 효율적으로 사용하는 것
1. 멀티프로세스 기반 서버: 다수의 프로세스를 생성하는 방식
2. 멀티플렉싱 기반 서버: 입출력 대상을 묶어서 관리하는 방식
3. 멀티쓰레딩 기반 서버: 클라이언트의 수만큼 쓰레드를 생성하는 방식
- 프로세스의 이해
- 프로세스
: 메모리 공간을 차지한 상태에서 실행중인 프로그램. 프로그램이 메인메모리에 이동해 실행을 위한 준비를 마친 상태
: 운영체제 관점에서 프로그램 흐름의 기본 단위
CPU 코어 수와 프로세스 수
코어의 수만큼 프로세스는 동시 실행 가능하며 코어의 수를 넘어서는 개수의 프로세스가 실행되면 프로세스 별로 코어에 할당되는 시간이 나뉨
- 프로세스 ID
: 운영체제로부터 프로세스가 부여받는 ID
: 2 이상의 정수 형태 (1: 운영체제의 실행을 돕는 프로세스)
현재 실행중인 프로세스 확인
Linux: ps au
window: netstat -anp tcp | find "LISTEN"
- fork 함수 호출을 통한 프로세스의 생성
- fork 함수: 멀티프로세스 기반 서버의 구현에 사용
#include <unistd.h>
pid_t fork();
→ 성공 시 프로세스 ID, 실패 시 -1 반환
: 새로운 프로그램을 바탕으로 프로세스를 생성하는 것이 아니라 fork함수를 호츨한 프로세스를 복사 (메모리 영역까지 동일하게 복사)
□ 부모 프로세스와 자식 프로세스를 구분하기 위해 이후의 프로그램 흐름은 fork함수의 반환값을 기준으로 나눔
- 부모 프로세스(fork 함수를 호출한 주체): fork 함수의 반환값은 자식 프로세스의 ID
- 자식 프로세스(복사된 프로세스): fork함수의 반환값은 0
하지만 아쉽게도 window 운영체제에서는 fork함수를 지원하지 않는다...
대신 CreateProcess 함수를 지원하는데...!
프로세스 생성 시 window와 UNIX의 차이
fork: 자식 프로세스가 부모 프로세스의 주소 공간을 상속
CreateProcess: 어떤 자식 프로세스를 실행할 것인지 구체적으로 요구 (특정 주소값)
다음 순서는 CreateProcess함수를 어떻게 사용하는지 방법을 공부해봐야겠군