스레드는 프로세스보다 작은 크기의 실행 단위이다.
프로세스보다 작은 시행 단위 필요
프로세스의 생성 및 소멸에 따른 오버헤드 감소
빠른 컨텍스트 스위칭
프로세스 사이의 통신에 대한 어려움 해소
개념 정리
개발자 - 작업을 만드는 단위
운영체제 - 실행단위, CPU를 할당하는 스케줄링 단위
스레드는 코드, 데이터, 힙, 스택에 담긴 주소공간을 가진 실체로, 운영체제에 의해 제어됨
스레드마다 TCB(Thread Control Block)구조체를 두고, 스레드 ID, 스케줄링 우선순위 등 스레드 정보를 관리하며, 생성, 소멸, 스케줄링 등 스레드를 독립된 단위로 다룸
코드
public class Sample extends Thread {
public void run() {
System.out.println("thread run.");
}
public static void main(String[] args) {
Sample sample = new Sample();
sample.start(); // start()로 쓰레드를 실행한다.
}
}
Sample 스레드를 만들고, sample.start()로 스레드 실행
멀티스레딩은 여러 스레드를 동시에 실행시킴으로서, CPU나 입출력 장치 등 컴퓨터 자원의 활용률을 높이고 사용자에게 빠른 응답 제공
스레드의 상태 변이는 다음과 같음

스레드 상태 제어
스레드는 스케줄링 주체에 따라 2종류로 구분
커널 레벨 스레드
TCB가 커널에 의해 커널 공간에 만들어지고 커널에 의해 스케줄되는 스레드
시스템 호출을 통해서만 만들어짐
즉, 커널 코드에 의해 만들어져, 커널에 의해 그 존재가 인지되고, 커널에 의해 스케줄링 되는 스레드 이다.
사용자 레벨 스레드
스레드 라이브러리에 의해, 사용자 공간에 생성되고, 관리되고, 스케줄되는 스레드
두 개 이상의 스레드가 공유 자원에 접근하여 동시에 변경하려고 할 때 예기치 않은 결과인 경쟁 상태를 초래할 수 있음
스레드 동기화란 다수의 스레드가 공유 데이터를 동시에 접근하는 충돌 상황에서 공유 데이터가 훼손되지 않도록 스레드의 실행을 제어하는 기법
임계 구역이란 사용자가 작성한 프로그램 중 공유 데이터에 접근하는 코드 부분
다수의 스레드로부터 공유 데이터의 훼손을 막기 위해, 임계구역은 반드시 한 스레드만 배타적 독점적으로 실행하도록 관리되어야 함
-> 이를 상호배제(Mutual Exclusion)라고 함
상호배제는 멀티스레드가 실행되는 환경에서, 한 스레드가 임계구역 전체를 배타적으로 실행하도록 보장하는 기법
공유 데이터를 다루는 멀티스레드 프로그램에서 임계구역 전후에 상호배제 코드가 작성됨
임계구역 전에는 entry 코드(임계구역 진입코드), 임계구역 후에는 exit 코드(임계구역 진출코드)가 있음
임계구역에 대한 상호배제는 임계구역에 오직 한 태스크만 들어가게 하는 방책
뮤택스는 잠김/열림 중 한 상태를 가지는 락 변수를 이용하여, 한 태스크만 임계구역에 진입시키고 다른 스레드들을 큐에 대기시키는 기법
메서드 동기화 스타일
public synchronized void increment() {
count++;
}
블록 동기화 스타일
public void increment() {
synchronized (lock) {
count++;
}
}
동기화된 코드 블록이 서로 다른 자원을 대기하며 교착 상태에 빠지지 않도록 주의해야 함
세마포어는 n개의 자원을 다수의 스레드가 공유하여 사용하도록 돕는 자원 관리 기법
이진 세마포어: 자원이 1개인 경우
카운터 세마포어: 자원이 여러 개인 경우
→ 레이스 컨디션을 방지
해당 내용은 명품 운영체제 책을 참고하여 작성한 내용입니다.