실행 중인 프로그램. 프로그램은 컴퓨터가 실행할 수 있는 명령어들의 집합이고, 그것이 메모리에 올라가 실제로 돌기 시작하면 프로세스가 된다. 프로세스는 저마다 독립된 메모리 공간을 할당받는데, 이 한 줄이 프로세스의 성질 대부분을 결정한다. 서로 침범할 수 없어 안전한 대신 데이터를 나누기가 까다롭고 전환 비용도 크다.

명령어를 해석하고 실행하는 연산 장치가 CPU이고, 프로세스가 CPU에서 실행되기를 기다리는 곳이 메인 메모리다. 파일을 읽고 쓰거나 네트워크와 데이터를 주고받는 것을 IO라고 부른다.

단일 프로세스에서 멀티태스킹까지

초창기의 단일 프로세스 시스템은 한 번에 하나만 실행했다. 다른 프로그램을 돌리려면 먼저 실행 중인 것을 끝내야 했다. 문제는 IO 작업 중에 CPU가 논다는 것이었다. 파일을 읽는 동안 CPU는 할 일이 없는데도 다른 일을 하지 못했다.

여러 프로그램을 메모리에 올려두고 IO가 생기면 다른 프로세스를 CPU에 올리는 것이 멀티 프로그래밍이다. 목적은 CPU 사용률을 끌어올리는 데 있다.

그런데 CPU를 오래 쓰는 프로세스가 하나 있으면 나머지가 계속 기다린다. 그래서 CPU 시간을 밀리초 단위로 아주 짧게 쪼개(quantum) 그 안에서 번갈아 쓰게 만든 것이 멀티태스킹이다. 시간을 잘게 나눈다는 점도 다르고 목적도 다르다. 멀티 프로그래밍이 CPU 사용률을 노렸다면 멀티태스킹은 응답 시간을 줄이는 쪽을 노린다. 사용자에게는 여러 프로그램이 정말 동시에 도는 것처럼 느껴진다.

프로세스를 여러 개 만드는 대가

멀티태스킹으로도 한 프로세스가 동시에 여러 작업을 하지는 못한다. 프로세스를 여러 개 만들면 되지 않느냐 싶지만 대가가 세 가지 붙는다.

  • 컨텍스트 스위칭이 무겁다
  • 독립된 메모리 공간을 가지므로 데이터를 나누려면 IPC를 거쳐야 한다
  • 등장한 멀티 코어를 잘 쓰기 어렵다

이것을 풀려고 나온 것이 스레드다.

관련

출처