멀티 프로세스는 프로세스가 동시에 실행되는 것을 말합니다.
동시에 실행되는 것을 좀 자세히 뜯어보면
CPU 코어가 1개일때의 동시성과 코어가 여러개일 때의 병렬성으로 나눠집니다.
프로세스가 실행될때는 메모리와 CPU를 사용하게 됩니다. 메모리는 여러 프로세스가 함께 담겨있을 수 있는데, CPU는 한 프로세스만 연산할 수 있습니다.
그래서 코어가 여러개일때는 프로세스는 진짜로 동시에 실행될 수 있습니다. 이를 병렬성(parallelism)이라고 합니다.
반면 코어가 1개일때는 진짜로 동시에 실행될 수는 없습니다. 하지만 빠르게 프로세스를 바꿔가며 번갈아 실행하며 동시에 실행되는 것처럼 보일 수 있습니다. 이를 동시성(Concurrency)이라고 합니다. 그리고 프로세스를 바꿔가며, 짧은 시간동안 번갈아가며 연산하는 것을 시분할 시스템(time sharing system)이라고 합니다.
멀티 프로세스를 얘기한다는 것은 보통 병렬성(parallelism)보다 동시성(Concurrency)를 말합니다.
여러 프로세스가 메모리에 적재될때는 각 프로세스가 서로의 메모리를 침범하지 않도록 운영체제에서 관리해줍니다.
이전 프로세스를 다루는 게시글에서 메모리는 코드, 데이터, 힙, 스택으로 영역이 구분된다고 말씀드렸는데요, 여기서 코드와 데이터는 정적영역으로 크기가 변하지 않습니다. 하지만 힙과 스택은 동적영역으로 크기가 변합니다. 하지만 힙과 스택이 데이터가 쌓이는 방향이 서로를 향해 반대 방향으로 쌓이기 때문에 겉의 틀 자체는 크기가 변하지 않게 됩니다.
또한 전의 Process를 다루는 게시글에서 PC register가 프로세스가 실행할 주소를 가르킨다고 말씀드렸는데요, 멀티 프로세스 상황에서는 프로세스 1의 주소들을 가르켰다가, 프로세스 2의 주소를 가르켰다가, 프로세스 1의 주소를 가르킵니다. 이때 PC Register가 Process 1을 다시 가르킬때 처음부터 가르키는게 아니라 프로세스 2로 넘어가면서 멈춰진 부분부터 가르키는데요, 그런 정보는 어떻게 CPU가 알 수 있는 걸까요?
바로 PCB에 프로세스의 Context를 담기 때문입니다. Context는 프로세스가 현재 어떤 상태로 수행되고 있고, 어디까지 명령을 수행했고 레지스터에 어떤 값이 저장되어있는지에 대한 총제적인 정보입니다. 이런 Context가 PCB(Process Cotrol Block)에 저장됩니다.
PCB는 운영체제가 프로세스를 표현한 자료구조 입니다. PCB는 프로세스의 중요한 정보가 저장되어 있기 때문에 사용자가 접근하지 못하도록 일부 운영체제에서는 운영체제 프로그램(프로세스)가 담겨 있는 메모리의 커널영역에 보관되어 있습니다. 커널영역은 일반 프로세스가 적재되는 사용자 영역과 구분됩니다. 커널영역 안에 PCB가 있으면 보호하기 쉬우면서 CPU가 접근하기 비교적 쉽습니다.
PCB는 프로세스 상태, PC Register 정보, 프로세스 넘버, CPU 스케줄링 정보, 우선순위, 메모리 정보 등이 담겨 있습니다.
프로세스 상태를 잠깐 보고 가자면, 실행, 준비, 봉쇄 단계가 있습니다. 실행 상태는 프로세스가 CPU를 점유하고 실행중인 상태 입니다. 준비상태는 CPU만 할당받으면 바로 프로세스가 실행할 수 있도록 준비된 상태입니다. 봉쇄는 CPU를 할당받아도 실행할 수 없는 상태 입니다.
그럼 한 프로세스에서 다른 프로세스로 전환될때는 어떤 일이 일어날까요? 한 프로세스의 context가 PCB에 저장되고, 실행할 프로세스의 Context가 PCB에서 불러와서 보관된 상태로 복구하는 작업이 필요합니다. 이를 Process Switch라고 말하고 CPU의 제어권을 넘겨주는 것을 말합니다. Process Switch가 많이 일어나는 것을 over head라고 말하는데, over head는 성능에 영향을 미치기 때문에, 이를 적정한 수준으로 잘 관리하는 것도 필요합니다.