
이전 글에서 소개했던 프로세스들은 한 프로세스가 하나의 스레드로 프로그램을 실행한다고 가정하였다.
그러나 현대에는 한 프로세스가 여러 개의 스레드를 사용한다.
현대 컴퓨터는 여러 개의 CPU 코어를 사용하기 때문에, 스레드를 여러 개 만들면 병렬 처리를 할 수 있다. (그래도 문맥 교환 때문에 100% 병렬 처리는 아니다)
이번에는 하나의 프로세스에서 여러 개의 실행 단위로 쪼갤 수 있는 스레드에 대해 알아보자.
스레드는 CPU 사용의 기본 단위이다.
스레드 하나를 실행하기 위해 CPU 코어 하나가 필요하다.
스레드를 3개 사용하는 프로세스가 CPU 코어 1개로 실행 된다면, 스레드 3개에 대한 문맥 교환이 일어나면서 동시성(Concurrency)이 구현된다.
스레드를 3개 사용하는 프로세스가 CPU 코어 3개로 실행 된다면, 문맥 교환 없이 스레드 3개가 같은 시간에 병렬적으로 실행된다.(parallel)
스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 열린 파일과 같은 자원들을 공유한다.
스택 섹션, 프로그램 카운터, 레지스터만 각각 따로 가진다.

현대 CPU는 하나의 칩 안에 여러 개의 코어를 사용하는 멀티 코어의 구조를 가진다.
멀티 스레딩 프로그래밍은 이러한 CPU 코어를 효율적으로 사용하고 병행성을 향상시키는 기법을 제공한다.

코어는 하나의 스레드만 실행할 수 있기 때문에, 특정 시간에 하나의 스레드만 실행할 수 있다.
총 4개의 스레드들을 문맥 교환 하면서 실행한다.
동시성(Concurrency)이 구현된다.
멀티 코어의 경우를 생각해보자

여러 개의 코어가 동일한 시간에 여러 개의 스레드를 각각 동시에 실행한다.
따라서, 일부 스레드가 병렬(Parallel)적으로 실행될 수 있다.
동시성은 여러 개의 작업을 아주 빠르게 번갈아가면서 수행하여 마치 동시에 실행되는 것처럼 느껴지도록 하는 것이다.
병렬성은 여러 개의 작업을 실제로 동일한 시간에 수행한다.
한 프로세스의 스레드가 fork()를 호출하면 새로운 프로세스는 모든 스레드를 복제할까? 아니면 한 개의 스레드만 복제할까?
일반적으로 fork()를 호출한 스레드만 복제된다.
몇몇의 UNIX 운영체제에서는 모든 스레드를 복제하는 것과 하나의 스레드만 복제하는 두 가지 버전의 fork()를 제공한다.