[스레드(Thread)]
- 프로세스를 구성하는 실행 흐름의 단위로 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
단일 스레드 프로세스 - 실행 흐림이 하나임 프로세스
멀티 스레드 프로세스 - 실행 흐름이 여러 개인 프로세스로 프로세스를 이루는 여러 명령어를 동시 실행이 가능하다.
[스레드의 구성 요소]
- 실행에 필요한 최소한의 정보로 구성된다
스레드 ID
PC(프로그램 카운터)를 비롯한 여러 레지스터 값
스택 등
프로세스를 이루는 스레드들은 프로세스의 자원을 공유하면서 실행된다.
그림처럼 스레드 1, 2, 3 이 병행 실행이 되어도 똑같은 코드, 데이터 영역을 공유하고 있다. 즉 각각의 스레드가 각각의 코드, 데이터 영역을 갖고있지 않다는 얘기다.
이 프로세스가 파일을 열었다면 스레드 1, 2, 3 은 모두 파일에 접근이 가능하다.
Linux 창시자 리누즈 토발즈는 위의 내용과 같이 프로세스와 스레드를 구분할 필요가 없다고 말한다.
그래서 Linux 에선 프로세스와 스레드를 구분해서 사용하지 않고 Task 라는 용어로 사용을 한다.
실제로 CPU 한테 처리해야할 작업을 전달할 때 요즘 OS 에선 프로세스 단위가 아닌 스레드 단위로 전달한다고 한다.
즉, 프로세스마다 사이클을 통해 CPU 를 할당받던 시스템에서 스레드 단위로 CPU 를 할당받는 경우가 많이 있다.
동일한 작업을 수행하는 당일 스레드 프로세스 여러개 실행 (멀티 프로세스)
vs
하나의 프로세스를 여러 스레드로 실행 (멀티 스레드)
프로세스끼리는 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내 자원을 공유하는 큰 차이점이 있다.
(프로세스끼리의 자원 공유를 할 수 있는 방법은 존재하긴 한다. 파일이나 공유 메모리를 통한 프로세스 간 통신(IPC) 이 있다)
프로세스를 fork 하면 코드, 데이터, 힙 영역 등 모든 자원이 복제되어 저장되는 것으로
저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스가 통째로 메모리에 적재된다는 것이다.
즉 각 프로세스는 독립적으로 실행된다.
(fork 에 대한 내용 https://code-jh.tistory.com/36 )
스레드들은 실행을 위해서 꼭 필요한 값들만 가질 뿐 프로세스가 가지는 자원을 공유한다.
각 스레드들의 공유는 협력과 통신에 유리하다.
멀티 프로세스에서 하나의 프로세스가 문제가 발생하더라도 다른 프로세스에 영향을 주진 않지만,
멀티 스레드에선 하나의 스레드가 문제가 발생해도 전체 프로세스에 영향을 준다.