프로세스 (Process)
프로세스 정의
- 프로세스 (Process) 는 실행 중인 프로그램, 컴퓨팅 시스템에서 한 작업의 단위이기도 하다.
- 작업 (Job) 은 일괄 처리 시스템, 태스크 (Task) 는 시분할 시스템에서 사용된다. (각 시스템 별로 단위는 다르다.)
- 프로세스 활동 상태는 PC (프로그램 카운터) 및 프로세스 레지스터 값으로 표현 가능하다.
- 즉 실행 중인 작업이 CPU 에서 참고하고 있다는 의미.
- 프로그램 : 명령어 목록으로 구성된 디스크 저장 파일에 불과하다. (수동적)
- 사용자가 OS 를 사용하여 실행을 해야 프로세스 라는 개체가 되는 것이다. (자동적)
- 프로세스 자체가 다른 실행 환경으로 동작할 수 있다.
- 예를 들어 JVM (Java Virtual Machine) 원리를 참고할 것.
- 프로세스가 한 번에 여러 작업 (Job) 을 할 수 있게 허용하는 개체를 Thread 라고 한다.
메모리 섹션
- 메모리 Heap : 프로세스 실행 중 동적으로 생성되는 메모리.
- 메모리 Stack : 프로세스 실행 중 함수 호출 시의 임시 저장 장소.
- 메모리 Text : 실행 코드
- 메모리 Data : 전역 (Global) 변수.
프로세스 상태
- NEW : 프로세스 생성 중.
- RUNNING : 프로세스 실행 중.
- WAITING : 프로세스 I/O 대기.
- READY : 프로세스가 PC 에 할당되기 기다림.
- TERMINATED : 프로세스 종료.
PCB (Process Control Block)
- 각 프로세스 별 OS 와 연관된 정보들을 보유한다.
- 보유하고 있는 정보 중 일부
- 프로세스 상태 (상단부)
- PC 주소
- CPU 레지스터, 스케쥴링 정보 및 회계 (Accounting) 정보
- 메모리 관리 정보
- I/O 정보
- Thread 정보
프로세스 스케쥴링
- 코어 및 프로세스 실행 횟수 별로 작업 분배를 효율적으로 진행하는 개념.
- 다중 프로그래밍의 정도를 측정하는 값 : 프로세스의 개수.
- I/O 바운드 프로세스 : CPU 연산 < I/O 연산 (대부분 프로세스)
- CPU 바운드 프로세스 : CPU 연산 > I/O 연산
- 일반적으로 I/O 바운드 프로세스의 우선 순위를 높게 책정한다.
스케쥴링 큐
- Ready 큐 : 프로세스가 시스템에 실행되기 이전 시점.
- Long-Term 스케쥴러 (외부 -> 시스템) / Short-Term 스케쥴러 (시스템 -> 시스템)
- Waiting 큐 : 프로세스가 I/O 작업을 요청했을 시점.
- PCB 에 각 Queue 별로 가리키는 인덱스를 보유.
CPU 스케쥴링
- 1 코어 당 1 개의 프로세스를 배치한다.
- 디스패치 : CPU 에 다음 프로세스가 배치되기 위한 작업.
- 스와핑 : 메모리가 꽉 찬 경우 이를 제거하여 다중 프로그래밍의 정도를 감소 시킨다.
문맥 교환
- 프로세스 실행 중 운영체제가 개입하여 프로세스를 교환하는 과정.
- 인터럽트 발생 시, 이를 처리한 후 문맥으로 복귀하기 위해 이를 저장하는 개념.
- 문맥 데이터는 PCB 에 저장된다.
- 문맥 교환 시간은 아무런 처리를 못 하는 오버헤드 작업이다.
프로세스 생성 과정
- 프로세스의 관계는 부모 - 자식 관계로 생성된다.
- 프로세스 식별자 (PID) : 프로세스를 식별하기 위한 값.
- fork() : 프로세스의 복사본을 생성. 부모 프로세스는 자식 PID, 자식 프로세스는 0 의 값을 지정.
- 복제된 부모, 자식 프로세스는 동시에 작동한다.
- exec() : 프로그램을 생성한다. 이를 프로세스의 개념이라 칭한다.
- wait() : 프로세스 종료를 기다린다.
프로세스 종료 과정
- exit() 을 호출하면 프로세스를 종료할 수 있다.
- 물리, 가상 메모리, I/O 버퍼, 파일 등 모든 자원들의 연동이 해제된다.
- 부모 프로세스가 종료되면 자식 프로세스가 상위로 바라보게 된다.
- 자식 프로세스가 종료되면 부모 프로세스에게 종료 상태를 알려야 한다.
- 오작동하는 프로세스에 대해 kill 을 할 수 있다.
- 연쇄식 종료 (Cascading Terminal) : 부모 프로세스가 종료될 때, 종속된 자식 프로세스들도 전부 종료된다.
- 좀비 프로세스 : 자식 프로세스가 종료 되었는데 부모 프로세스가 자원 정보를 회수하지 않은 경우 메모리에 남는 현상.
- 고아 프로세스 : 부모 프로세스가 종료된 이후 자식 프로세스들이 남아버리는 현상.
- 이는 init 에서 wait() 를 호출하여 어느 정도 해결할 수 있다.
프로세스 간 통신 (IPC)
- 프로세스는 본래 다른 프로세스들과 자원을 공유하지 않아 독립적이었다.
- 그러나 실행 중인 프로세스들의 영향에 따라 작동하는 협력적인 성향도 있다.
- 공유 메모리 (Shared Memory)
- 협력 프로세스들에 의해 메모리 접근 방식을 제공하여 빠른 편.
- 메모리 동시 접근 현상을 프로그래머가 막아야 하는 단점이 있다.
- 메시지 전달 방식 (Message Passing)
- 협력 프로세스들에 의해 메시지를 주고 받아, 커널 측에서 정보를 주고 받는다.
- 커널 기능 구현이 잘 되어 있어 프로그래머의 업무 부담이 줄어든다. 다만 문맥 교환 현상이 많아진다.
생성자 - 소비자 패러다임
- 클라이언트와 서버의 관계랑 같은 맥락이라 볼 수 있다.
- 생산하는 프로세스가 생산자 (Producer), 소비하는 프로세스가 소비자 (Customer)
- 두 프로세스가 동시에 동작될 때 야기될 수 있는 이슈. (공유 메모리 개념 적용 시.)
- 버퍼를 사용하여 동기화 문제를 해결해야 할 것이다.
- 버퍼의 크기는 유한 (소비자 유리), 무한 (생산자 유리) 버퍼로 나뉜다.
Blocking, Non-Blocking
- 메시지 전달에 대한 문제를 해결하기 위한 방법들.
- Blocking 전송 : 수신자가 메시지를 받을 때까지 Block 됨.
- Blocking 수신 : 메시지를 받고 이용 가능할 때까지 수신자가 Block 됨.
- Non-Blocking 전송 : 송신자가 메시지를 보내고 계속 작업한다.
- Non-Blocking 수신 : 수신자가 메시지를 받되 유효한 메시지 혹은 NULL 을 받을 수 있다.