스레드(thread)
: 프로세스를 구성하는 실행 흐름의 단위
단일 스레드 프로세스
: 실행 흐름이 하나인 프로세스멀티 스레드 프로세스
: 실행 흐름이 여러 개인 프로세스 (프로세스를 이루는 여러 명령어 동시 실행 가능)스레드의 메모리 공간은 스택
,코드
,데이터
,힙
로 나눌 수 있는데
스레드는 프로세스내에서 각각 스택
만 할당받고 프로세스 내에 있는 코드,데이터,힙
을 (프로세스의 자원) 공유하여 사용한다.
전통적인 관점에서 보면 하나의 프로세스는 한 번에 하나의 일만 처리했다.
하지만 스레드
라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다.(프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있게 된 것)
즉 스레드는 프로세스를 구성하는 메모리내에서 각기 다른 스레드ID,프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기에 스레드마다 각기 다른 코드를 실행할 수 있고 이러한 최소한의 정보를 유지한 채 프로세스 자원을 공유하며 실행된다는 것이다.
정리하면 프로세스와 스레드의 관계는 프로세스가 실행되는 프로그램이라면 스레드는 프로세스를 구성하는 실행의 흐름단위 이다.
동일한 작업을 수행하는 단일 스레드 프로세스 여러개
vs
하나의 프로세스를 여러 스레드로 실행
무엇이 더 효율적일까?
멀티 프로세스를 위해 프로세스를 fork하면 코드/데이터 힙 영역 등 모든 자원이 복제되어 저장되는데 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재된다
이는 메모리를 많이 차지한다는 뜻이다.
❗참고❗
fork 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서
동시에 프로세스끼리 자원을 공유하지 않는 방법이 있는데
이를 쓰기 시 복사(copy on write) 기법이라고 한다.
그럼 멀티 스레드가 더 좋은가?
멀티 스레드의 스레드들은 각기 다른 스레드ID ,프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지는 자원을 공유한다.
그렇기에 메모리 부분에서 더 효율적이며 스레드는 프로세스의 자원을 공유하면서 협력과 통신에 유리하다는 장점도 있다.
하지만 자원을 공유하고 있기 때문에 하나의 스레드의 문제가 생기면 프로세스 전체에도 문제가 생길 수 있다는 단점도 공존한다.
프로세스의 정보가 커널의 PCB에 저장된다면 스레드의 정보는 TCB(thread control block)에 저장된다.
즉 TBC는 스레드에 대한 정보를 담고 있는 자료구조이다.
TCB의 구성 요소
- 스레드 ID
- 레지스터 값
- 스레드 상태 (실행 상태)
- 스케줄링 큐용 다양한 포인터
- 프로세스 제어 블록(PCB)을 포함하는 포인터