두개 이상의 프로세스가 동시에 실행되는 것을 멀티프로세스라고 한다.
멀티 프로세스 상황에서 CPU 코어가 하나라면 CPU는 스케줄링을 통해 여러개의 프로세스를 번갈아가며 연산(동시성)하고 코어가 여러개라면 각 코어마다 프로세스를 연산해 병렬로 실행(병렬성)한다.
CPU의 코어가 하나일 때 동시성
모든 프로세스들은 CPU와 메모리를 공유한다. 메모리에선 각 프로세스들마다 메모리영역을 차지하며 서로의 영역이 침범되지 않게 OS가 관리해준다. 반면에 CPU는 한번에 하나의 프로세스만 연산이 가능하며, CPU가 PC register가 가리키는 명령어를 읽어 프로세스마다 번갈아 연산을 진행한다. 사용자 입장에선 동시에 프로세스를 수행하는것처럼 보이지만 CPU의 연산속도가 빨라 티가 나지 않을 뿐이다. 이렇게 CPU의 시간을 프로세스들이 나누어 사용하는 것을 시분할 시스템(Time Sharing System)이라 한다.
시분할 시스템
시분할 시스템에서는 하나의 프로세스마다 번갈아가며 연산을 하기 때문에 각 프로세스마다 어디까지 명령을 수행했는지에 대한 정보를 저장해야한다. 이에 대한 정보를 context라 하며 프로세스의 상태, 주소,테이블 등의 값을 PCB(Process Control Block)에 저장된다. 실행중인 프로세스에서 다른 프로세스로 CPU 점유를 넘길 때 PCB에 현재 Context를 저장하고 다른 PCB의 Context를 불러온다. 이것을 바로 Context Switch라 한다.
멀티스레드는 하나의 프로세스 안에서 동시에 여러 동작을 수행하는 개념이다.
한 프로세스 안에서 스레드들은 Stack 외 모든 memory 영역이 공유 가능하다. 각 스레드는 function이라고 보면 되며 파라미터, 리턴값, 지역변수 저장 등을 위해 독립적으로 stack 메모리 공간이 필요하다. 또한 멀티 프로세스보다 더 잘게 쪼개서 CPU를 사용하는 것이므로 PC register가 여러개의 스레드 단위로 구분된다.
멀티프로세스는 많은 메모리와 CPU 점유시간을 가지며 Context Switching이 느린 반면에, 멀티 스레드는 적은 메모리와 적은 CPU 점유시간을 가지며 Conetext Switching 비용이 낮다. 하지만 멀티스레드는 자원을 공유하기 때문에 동기화 문제가 발생할 수 있어 멀티 프로세스에 비해 안정성이 낮다. 따라서 메모리를 나누어 안정성을 높일 때는 멀티 프로세스를 Context Switching이 많고 빠른 처리속도를 요구할 경우 멀티 스레드를 이용하는게 좋다.
-> Context Switching 예시