[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 이라면 다른 스레드는 해당 임계 영역에 접근 할 수 없음
- 자원 사용이 완료되면 카운팅 세마포어의 값을 증가시켜 다른 대기중인 스레드가 접근 할 수 있도록 허용함