스레드(thread)는 프로세스를 구성하는 실행의 흐름 단위이다.
하나의 프로세스는 여러 개의 스레드를 가질 수 있고, 이를 이용하면 하나의 프로세스에서 여러 부분을 실행할 수 있다.
만약 여러 개가 아닌 하나의 스레드를 가지고 실행하는 프로세스는 단일 스레드 프로세스라고 볼 수 있다.
스레드는 각자 다른 스레드 ID, 레지스터 값, 스택으로 구성되어 있기에 각기 다른 코드를 실행 할 수 있다.
이때 스레드는 실행에 필요한 정보(레지스터나 스택)를 갖고 프로세스 자원을 공유하며 실행 된다.
다시 말해, 스레드는 각자 스레드ID, 레지스터 값, 스택을 갖고 있지만, 코드,데이터,힙 영역은 공유한다.
프로세스가 실행되는 프로그램이면 스레드는 프로세스를 구성하는 실행의 흐름 단위이다. 많은 운영체제는 CPU에 처리할 작업을 전달할 때 스레드 단위로 전달한다.
컴퓨터는 실행 과정에서 여러 프로세스가 실행될 수 있다.
또한, 그 프로세스를 구성하는 스레드는 여러 개가 있을 수 있다.
이때 여러 프로세스를 실행하는 것을 멀티프로세스(multiprocess)라고 하고, 여러 스레드로 프로세스를 실행하는 것을 멀티스레드(multithread)라고 한다.
그렇다면, 같은 작업을 하는 단일 스레드 프로세스를 여러 개 실행하는 것과 하나의 프로세스를 여러 개의 스레드로 실행하는 것은 무엇이 다를까?
"hello, os"를 출력하는 프로그램이 있을 때 프로그램을 세 번 fork하여 실행하면 "hello, os"가 세 번 출력된다. 또한, 하나의 프로그램에서 "hello, os"를 출력하는 스레드를 세개 만들어서 실행해도 똑같이 "hello, os"가 세 번 출력된다. 결과는 같은데 과연 어떤 것이 다를까?
하나의 프로세스에서 스레드는 각자 다른 스레드ID, 레디스터 값, 스택을 갖지만, 코드,데이터,힙 영역은 공유한다고 했다.
하지만 프로세스를 여러 개를 실행하게 되면, 공유하는 메모리 없이 통째로 메모리에 적재되게 된다. 프로세스를 fork하여 동일한 프로세스 두 개를 실행하면 코드 영역, 데이터 영역, 힙 영역 등을 비롯한 모든 자원이 복제된다는 얘기다.
이는 매우 큰 메모리 낭비이다. 동일한 작업을 위해 여러 개의 프로그램들을 실행하면 중복되는 내용들이 많기 때문이다.
서로 다른 프로세스들은 자원을 공유하지 않기 때문에 서로가 남남처럼 독립적으로 실행되지만, 스레드는 프로세스의 자원을 공유하기 때문에 협력과 통신에 유리하다.
하지만 스레드의 이런 장점은 때로 단점이 되기도 한다. 멀티프로세스에서는 하나의 프로세스가 문제가 생겨도 다른 프로세스에 별 다른 영향이 없지만, 멀티스레드에서 하나의 스레드가 문제가 생기면 다른 스레드에도 문제가 생길 가능성이 크다.
프로세스간에는 기본적으로 자원을 공유하지 않지만, 프로세스끼리 자원을 공유하고 데이터를 주고받을 수 있다. 이를 프로세스 간 통신(IPC: Inter-Process Communication)이라고 부른다. 보통 IPC라고 부른다.
예를 들어 프로세스A에서 "hello.txt" 파일에 새로운 값을 쓰고 프로세스B는 이를 읽는다면, 두 프로세스는 "hello.txt" 파일 안의 데이터를 주고받으므로 이를 파일을 통한 프로세스 간 통신으로 볼 수 있다.
또 프로세스들은 공유하는 메모리 영역을 두어 데이터를 주고받을 수 있다. 이를 공유 메모리(shared memory)라고 한다.
이 외에도 프로세스들은 소켓, 파이프 등을 통해 통신할 수 있다.