Thread
스레드란, 프로세스 내에서 동시에 진행되는 작업 혹은 흐름의 단위를 의미하는데 우리는 식당에서 주문(작업)을 하면 주방(프로세스)에서는 요리사(스레드)는 각각의 요리를 준비한다.
프로그램은 하나 이상의 프로세스를 가지고 프로세스는 하나 이상의 스레드를 가진다.
스레드 자원
스레드끼리는 프로세스의 자원을 공유하면서 프로세스의 실행 흐름의 일부가 되기 때문에 동시에 작업이 가능하다.
프로세스는 위와 같이 하나의 프로세스에 복수의 스레드가 작동을하는데 프로세스의 Stack을 할당받아 복사하고 Code, Data, Heap은 프로세스 내의 다른 스레드들과 공유된다. 따라서, 아래와 같이 각각의 스레드는 별도의 Stack을 가지고 있지만 Heap 메모리는 고유하기 때문에 서로 다른 스레드에서 가져와 읽고 쓸 수 있게 된다.
스레드 상태
스레드 상태 | 설명 |
---|---|
NEW | 스레드가 생성은 되었으나, 아직 호출되지 않은 상태 |
RUNNABLE | 스레드가 실행을 기다리는 상태로 실행할 준비가 된 상태 |
BLOCKED | 스레드가 특정 이벤트가 발생하여 대기하는 상태로 CPU를 할당받을 수 없으며 이베트가 발생하여 다시 RUNNABLE 상태로 전환될 때까지 대기 하는 상태이기도 하다. |
TERMINATED | 스레드가 실행하고 완료하고 종료된 상태로 메모리에서 제거가 된다. |
TCB(Thread Control Block)
스레드의 상태정보, 스레드 ID, 스레드 우선순위, 스케줄링 정보 등 다양한 정보를 저장한다. TCB도 스레드가 생성될때 운영체제에 의해 생성되며, 스레드가 실행되고 삭제될때 같이 삭제가 이루어진다. 스레드 간의 자원 공유와 동기화도 TCB를 사용하여 관리가 이루어지는데 이는 동기화 기법을 사용할때, TCB에서 해당 스레드의 뮤텍스나 세마포어 정보를 관리하고, 스레드가 해당 자원에 대한 접근 권한을 획득하거나 반납할 때 TCB의 정보를 업데이트 하게된다.
스레드 컨텍스트 스위칭
스레드 컨텍스트 스위칭은 CPU가 현재 실행 중인 스레드의 상태를 저장하고, 다른 스레드의 상태를 복원하여 실행을 전환하는 과정입니다. 이는 멀티스레딩 환경에서 필수적인 작업으로, 여러 스레드가 CPU를 번갈아가며 사용하게 합니다.
컨텍스트 스위칭 과정
- 현재 스레드의 상태 저장:
- CPU는 현재 실행 중인 스레드의 레지스터, 프로그램 카운터, 스택 포인터 등의 상태 정보를 저장합니다.
- 이 정보는 스레드 제어 블록 (Thread Control Block, TCB)이라는 구조체에 저장됩니다.
- 다른 스레드의 상태 복원:
- CPU는 실행할 다른 스레드의 상태 정보를 TCB에서 읽어옵니다.
- 레지스터, 프로그램 카운터, 스택 포인터 등을 복원합니다.
- 다른 스레드 실행:
- CPU는 복원된 상태 정보를 바탕으로 다른 스레드를 실행합니다.
컨텍스트 스위칭의 오버헤드
컨텍스트 스위칭은 다음과 같은 이유로 오버헤드가 발생할 수 있습니다:
- 저장 및 복원 작업: 현재 스레드의 상태를 저장하고 다른 스레드의 상태를 복원하는 작업이 필요합니다.
- 캐시 미스: 새로운 스레드가 실행될 때 CPU 캐시가 비효율적으로 사용될 수 있습니다.
- 스케줄링: 어떤 스레드를 실행할지 결정하는 스케줄링 작업에도 시간이 소요됩니다.
출처
https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)
https://www.baeldung.com/cs/threads-sharing-resources
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jhc9639&logNo=221707378026