- 프로그램 : 컴퓨터가 일련의 동작을 하게끔 하는 명령어들의 집합
- 프로세스 : 운영체제 내에서 실행되고 있는 프로그램
- 쓰레드 : 프로세스 내에서 실행되고 있는 작업 단위. 기본적으로는 프로세스 당 한 개의 쓰레드로 동작함
프로그램을 설명하기 전에, 명령어에 대해 알아보자.
명령어란, CPU가 어떤 동작을 취할 것인지를 나타내는 가장 작은 단위이다. 예를 들어, CPU 내부의 레지스터 중 r1, r2가 있다고 하자. 그리고, r1에 저장된 값과 r2에 저장된 값을 더한 값을 r1에 저장한다는 명령어가 있다고 하자. 이러한 명령어를 실행함으로써, CPU는 먼저 r1과 r2에 저장된 값을 가져온 후 CPU 내부의 ALU (Arithmetic and Logic Unit; 산술 논리 연산 장치)에서 덧셈 연산을 수행한다. 이후, 계산 결과값은 다시 r1 레지스터에 저장된다. 이처럼 명령어는 CPU 안에서 어떤 작업을 처리한 후, 처리한 결과를 레지스터 혹은 메모리에 반영하는 작업을 수행한다. 물론, 처리한 명령어에 따라 반영되지 않을 수도 있다.
프로그램을 실행하는 과정에 대하여 알아보자.
프로그램은 명령어의 집합이다. 다시 말해, 하나 이상의 명령어들이 프로그램을 구성하고 있는 것이다. 일반적으로, 명령어는 CPU에서 한 번에 하나씩 실행할 수 있다. 그렇기 때문에, 처리할 명령어가 어떤 것인지 특정할 필요가 있다. 이러한 기능을 수행할 레지스터가 이러한 이유 때문에 CPU에 존재하는데, 이를 프로그램 카운터 (Program Counter; PC)라고 한다.
프로그램이 실행되는 과정은 이렇다.
프로세스는 운영체제에서 현재 실행 중인 프로그램을 의미한다. 실제 컴퓨터의 운영체제에서는 한 번에 하나의 프로그램만이 실행되고 있지 않고, 여러 개의 프로그램이 동시에 실행되고 있다. 실제로는, 운영체제가 여러 개의 프로그램이 동시에 실행될 수 있도록, 스케줄링과 같은 기법으로 운영체제 내부의 시스템 리소스를 실시간으로 관리하고 있기 때문이다. 운영체제에 의해 리소스를 제때 할당받고, 동시에 실행되고 있는 프로그램을 프로세스라고 할 수 있다.
스레드는 프로그램 내에서, 특히 프로세스 내에서 실행되는 작업의 흐름, 작업 단위를 의미한다. 일반적으로 프로세스 내에서는 하나의 스레드가 동작하지만, 프로그램에 따라서는 두 개 이상의 스레드가 동작할 수 있다. 이러한 방식을 멀티스레드 (Multithread)라고 한다.
멀티프로세스와 달리, 멀티스레드에서는 스레드들이 프로세스 내에 있는 메모리를 공유해서 사용할 수 있다. 그리고, 프로세스 간 작업 전환 속도보다 스레드 간 작업 전환 속도가 더 빠르다는 특징이 있다.
스레드가 같은 메모리를 공유해서 사용할 때, 메모리에 두 개 이상의 스레드가 접근하는 상황이 발생하면, 접근한 순서에 따라 메모리에 저장된 값 또는 프로그램의 실행 결과가 달라질 수 있다. 따라서 멀티스레드 프로그램을 작성한다면, 이러한 상황을 피할 수 있는 방법을 반드시 적용해야 한다.