Thread, 스레드
스레드란 프로세스 안에서 실행되는 여러 흐름 단위를 말한다. 스레드를 이용하면 하나의 프로세스 내에서도 병렬적(동시적)으로 처리할 수 있다. 즉, 여러 개의 처리 루틴을 가질 수 있다.
프로세스는 대부분 독립적인 메모리 공간과 자원을 할당 받지만, 그에 비해 스레드는 다른 스레드와 많은 부분을 공유한다.
독립적으로 가지고 있는 부분
- program counter(PC) : 하나의 스레드 실행에 있어서 다음으로 실행될 명령어 위치
- register set
- stack 영역
다른 스레드와 공유하는 부분
- code 영역, data 영역, heap 영역
- OS 자원
Stack만 따로 할당 받는 이유?
스레드는 독립적인 동작을 수행하기 위해 존재한다. 즉, 독립적으로 함수를 호출할 수 있어야 하기 때문에 지역변수, 매개변수 등을 저장하는 Stack은 독립적으로 할당 받아야 한다.
프로그램의 실행
일반적으로 하나의 프로그램은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 가진다. 즉, 프로세스가 생성되면 기본적으로 하나의 main 스레드가 생성된다.
사실 자바의 메인 메소드 역시 하나의 실행 흐름으로, 메인 thread에 해당한다. 이는 main() 메소드에서 다음 코드를 치면 확인이 가능하다.
Thread.currentThread().getName()
위와 같이 thread 이름이 “main”임을 알 수 있다.
이처럼 스레드를 이용하면 여러 동작을 병렬적으로 수행할 수 있다.
단순 반복 코드를 실행할 때에도 여러 개의 스레드를 만들어서 분리 시킨 뒤 결과 데이터를 받아 합치면 그만큼 시간을 절약할 수 있다. 특히 짧은 시간 내에 많은 사용자를 처리해야 하는 대용량 시스템이나, CPU 활용을 극대로 해서 처리해야 하는 복잡한 연산 작업 등에 많이 쓰인다.
JAVA에서 스레드의 생명 주기
스레드의 생명 주기란, 프로그램이 실행되어 메모리에 프로세스가 올라오고, 스레드가 생성된 시점부터, 실행되고, 대기하고, 종료되는 시점까지의 주기를 말한다.
이는 다음과 같이 정리해볼 수 있다.
NEW(탄생) | 스레드가 생성되고 아직 호출(start())되지 않은 상태이다. |
RUNNABLE(준비, 실행) | start()가 호출되어 실행되기 위해 기다리는 상태로, CPU를 할당받을 수 있는 상태이며 Runnable pool에 모여 있다. run() 하면 RUNNING(CPU 점유)된다. |
WAITING(대기) | 일시 정지. 다른 스레드의 통지를 기다린다. |
TIMED_WAITING(시간 대기) | 일시 정지. 주어진 시간 동안 기다린다. |
BLOCK(봉쇄) | 스레드가 특정 이벤트(I/O 요청 등)가 발생하여 CPU를 할당받지 못하며, 이벤트가 발생하여 다시 RUNNABLE 상태로 전환될 때까지 대기한다. |
TERMINATED(종료) | 스레드가 실행을 완료하고 종료된 상태로, 더 이상 실행될 수 없으며 메모리에서 제거된다. |
TCB, Thread Control Block
❓ TCB, Thread Control Block
각 스레드마다 운영체제에서 유지하는 스레드에 대한 정보를 담고 있는 자료구조이다. 그림에서 볼 수 있듯이 스레드가 프로세스 내에 위치한 것처럼 TCB는 PCB 안에 들어 있다.
TCB에는 다음과 같은 정보가 담겨 있다.
- Thread ID
- Next thread block
- Thread State
- CPU Information
- Thread Priority
TCB는 PCB처럼 스레드가 생성될 때 운영체제에 의해 생성되며, 스레드가 실행을 마치고 소멸될 때 함께 소멸된다.
실제 자바 클래스에서 메인 스레드에 대한 정보를 출력하면 다음과 같다.
TCB 활용 : 스레드 간 자원 공유 및 동기화
뮤텍스(mutual exclusion)나 세마포어(semaphore)와 같은 동기화 기법을 사용할 때, TCB에서 해당 스레드의 뮤텍스나 세마포어 정보를 관리하고, 스레드가 해당 자원에 대한 접근 권한을 획득하거나 반납할 때 TCB 정보를 업데이트 한다.
❓
뮤텍스, mutex
임계 구역에 1개의 스레드만 들어갈 수 있는 동기화 기법
세마포어, semaphore
counter를 두어 허용 가능한 스레드 수를 제한함으로서, 임계 구역에 여러 스레드가 들어갈 수 있게 하는 동기화 기법
CPU의 스레드 관리
하나의 프로그램을 실행할 때 여러 개의 스레드를 사용하여 실행하는 멀티 스레드를 이용할 수 있다. 멀티 스레드 환경에서 CPU는 스레드를 동시적, 병렬적으로 실행하기 위해 쉼없이 다음 실행할 스레드를 Scheduling하고 Context Switching을 수행한다.
각각의 과정은 프로세스와 유사하다.
JAVA의 Thread Scheduling
운영 체제에서 다중 스레드를 관리하며, CPU를 사용할 수 있는 스레드를 선택하고 CPU를 할당하는 작업이다. 스레드의 우선순위, 실행 시간, 입출력 요청 등의 정보를 고려하여 CPU를 사용할 스레드를 선택한다. 프로세스 스케줄링 알고리즘과 유사하게 동작한다.
자바의 Thread는 Priority와 Round Robin 방식으로 스케줄링한다.
Priority | Priority 값이 높은 스레드를 우선적으로 실행한다. 기본 값이 5이고, 개발자가 setPriority()를 통해 컨트롤이 가능하다. |
RR, Round Robin | Time Slice를 정해서 하나의 스레드를 정해진 시간 만큼만 실행시키고, 다시 다른 스레드를 돌아가며 실행시킨다. JVM이 컨트롤한다. |
Context Switching
CPU 스케줄링을 바탕으로, 멀티 스레드 환경에서 스레드 간의 실행을 전환하는 기술이다.
프로세스의 Context Switching과의 다른 점은, 스레드 Context Switching은 하나의 프로세스 내의 스레드를 교환한다는 점이다. 또한 공유자원이 많기 때문에 스레드보다 오버헤드가 굉장히 적다.
🤫 면접 TIP!
프로세스와 스레드는 무엇인가
프로세스 - 프로그램이 실행되어 메모리에 올라간 인스턴스
스레드 - 프로세스 내부에서 실행되는 흐름 단위
하나의 프로세스는 적어도 하나의 스레드를 가지고 있습니다.
프로세스와 스레드의 차이점
둘의 가장 큰 차이점은 공유 자원의 유무입니다.
프로세스는 각각 CPU 시간, 주소 공간, 메모리 공간을 별도로 할당 받지만, 스레드는 메모리 공간 중에서 stack 영역만 따로 할당 받고 대부분은 공유한다는 특징을 가집니다.
참고자료
Thread의 모든 것! (스레드 생성, 생명주기, 정보, 상태, 스케줄링, 주요 메소드, synchronized)
참조문서 : https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html1. 쓰레드란?자바의 메인메소드 역시 하나의 실행흐름으로서, 메인 쓰레드에 해당한다. 이것은 main() 메소드에서 Thread.currentThread().getNam
sjh836.tistory.com
[Java] 자바 쓰레드 생성(Thread, Runnable)
이 글은 "자바 온라인 스터디" 공부한 내용을 정리하여 쓴 글입니다. Process vs Thread 자바의 쓰레드를 설명하기 이전에 프로세스와 쓰레드의 차이에 대해 간략하게나마 알 필요가 있습니다. Process
math-coding.tistory.com
'Computer Science > Operating System' 카테고리의 다른 글
멀티 프로세스와 멀티 스레드 (0) | 2024.04.15 |
---|---|
JAVA의 Thread (0) | 2024.04.15 |
CPU Scheduling, 스케줄링 (1) | 2024.04.15 |
인터럽트(Interrupt)와 시스템 콜(System Call) (0) | 2024.04.15 |
Process, 프로세스 (0) | 2024.03.28 |