[F-Lab 모각코 챌린지] 8일차 - Thread

F-Lab 모각코 챌린지 8일차 - Thread 스레드와 임계 영역 접근에 대한 학습을 진행하고 정리 하였습니다.

[F-Lab 모각코 챌린지] 8일차 - Thread

Thread

  • 프로세스 내에서 실행되는 작업 단위
  • 프로세스 내의 자원 공유
  • 병렬성을 수행 할 수 있음
    (동시성? 두 개 이상이 동시에 수행되는 것 같이 동작 하는 것

스레드가 만들어진 이유?

초기의 컴퓨터는 단일 처리기(Single processor) 를 사용하여 한 번에 하나의 작업만 처리할 수 있었다. 1960년대 부터 병렬 처리(Parallel processor) 기술이 개발되며 여러개의 처리기를 동시에 사용하여 작업을 처리할 수 있게되었다.

스레드 상태

스레드 상태 설명
New 스레드 객체가 생성되었지만 start() 메서드가 호출되기 전의 상태
Runnable start() 메서드가 호출되어 스레드가 실행 가능한 상태
Running 스레드가 CPU를 할당받아 작업을 수행하는 상태
Blocked 스레드가 다른 스레드에 의해 점유된 리소스의 사용을 기다리는 상태
Waiting 스레드가 다른 스레드에 의해 특정 동작의 완료를 기다리는 상태
Timed Waiting 스레드가 특정 시간 동안 대기하는 상태
Terminated 스레드의 실행이 완료된 상태

스레드 우선순위

  • 스레드 스케쥴러(Thread Scheduler) 에 의해 사용되며 운영체제에 따라 동작 방식이 다를 수 있음.
  • 우선순위 만으로 스레드의 실행 순서를 완전히 보장하지는 않음
    (스레드 스케쥴러는 우선순위를 참고하지만, 운영체제의 스케줄링 정책과 상황에 따라 실행될 스레드가 결정됨)
  • 우선순위가 높을수록 CPU 시간 할당을 더 많이 받을 가능성이 있음

Java 에서 스레드 우선순위를 설정하는 방법

Thread thread1 = new Thread();
thread1.setPriority(Thread.MIN_PRIORITY);

Thread thread2 = new Thread();
thread2.setPriority(Thread.NORM_PRIORITY);

Thread thread3 = new Thread();
thread3.setPriority(Thread.MAX_PRIORITY);

스레드 동기화

공유 자원에 동시에 접근 할 때 발생 할 수 있는 문제를 해결하기 위해 사용되는 개념

Mutual Exclusion: 상호 배제

  • 한 스레드가 공유 자원을 사용하는 동안 다른 스레드는 해당 자원에 접근 할 수 없도록 막는다.
  • 이를 통해 동시에 여러 스레드가 접근하는 것을 방지하여 일관성과 안정성을 보장

Synchronization: 동기화

  • synchronized 키워드를 사용하여 동기화 블럭을 지정 할 수 있음
    동기화 키워드를 적용하면 해당 변수, 블록, 메서드는 모니터 락(Monitor Lock) 을 획득하게 되며, 다른 스레드에서는 해당 영역을 접근하지 못하고 대기하게 됨

Dead Lock: 교착상태

둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상

Hold and Wait: 점유와 대기

최소 하나의 자원을 점유하고 있는 경우, 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해서는, 대기 프로세스가 있어야 한다

Non-preemption: 비선점

다른 프로세스에 할당된 자원은 사용이 끝날 때 까지 강제로 뺏을 수 없어야함

Critical Section: 임계 영역

임계 영역은 동시에 접근하면 문제가 발생 할 수 있는 코드 영역을 말함

Mutex: 뮤텍스

Key 라는 개념이 존재함. 이 Key 를 가진 스레드 혹은 스레드만이 공유 자원에 접근 근을 허용함

뮤텍스는 이진 세마포어 형태로 구현되며, 임계 영역에 접근하는 스레드는 Key를 획득하고 작업을 완료 한 후 Key 할당을 해제하여 다른 스레드에서 접근 가능하도록 함

Semaphore: 세마포어

공유 리소스에 접근 할 수 있는 최대 허용치 만큼 동시 스레드 접근을 허용함

  • Binary Semaphore: 이진 세마포어
    - 0, 1 값만을 가지는 세마포어
    - Mutex 라고 부르기도 함
  • Counting Semaphore: 카운팅 세마포어
    - 정수 값을 가지는 세마포어
    - 지정된 개수의 스레드가 동시에 자원에 접근 할 수 있도록 제어하는 데 사용
    - 스레드가 자원에 접근 할 때 마다 값을 감소. 만약 값이 0 이라면 다른 스레드는 해당 임계 영역에 접근 할 수 없음
    - 자원 사용이 완료되면 카운팅 세마포어의 값을 증가시켜 다른 대기중인 스레드가 접근 할 수 있도록 허용함