멀티 스레드 환경의 문제점
멀티쓰레드 환경에서는 실행 순서를 보장할 수 없고 자원을 공유하기 때문에 서로의 자원을 동시에 접근해 처리할 때 레이스 컨디션 문제가 발생할 수 있다.
이미지 출처: https://www.software-testing-tutorials-automation.com/2017/09/what-is-race-condition-in-software.html
해결방법
- Mutex, Semaphore 등 상호 배제
- 두 처리 단위(프로세스, 스레드)가 임계 구역에 동시에 접근하지 못하도록 막는 기법(점유)
- Lock
- 현재의 임계 구역에 들어갈 권한을 얻어온다.
- 만일 다른 프로세스/스레드가 임계 구역을 수행 중이라면 종료할때까지 대기
- unLock
- 현재의 임계 구역을 모두 사용했음을 알린다.
- 대기중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있다
상호 배제의 단점
- 교착 상태 유발 가능
- 공유 자원 관리로 인한 오버헤드
교착 상태
상호 배제를 적용하면 서로의 자원을 동시에 접근하려 할 때 교착 상태(Deadlock)
에 빠질 수 있다.
이미지 출처:https://ko.wikipedia.org/wiki/식사하는철학자들문제
데드락의 발생조건 4가지
1. Mutual Exclusion(뮤텍스 - 자원에 대한 동시접근 불가)
-
Hold and Wait(점유하고 기다리기)
-
No Preemption(자원 뺏어오지 못함)
-
Circular Wait(순환 형태 대기)
출처: 교착상태(deadlock)와 그 해결방안을 알아보자.
함수형 프로그래밍을 적용한다면?
순수함수
- 오직 입력에 의해서만 출력이 정해진다.
- 함수의 실행이 외부의 상태를 변경시키지 않는 함수
- 부가 효과(Side-Effect)가 없다
No Mutual State
- 서로 공유하는 자원이 없다는 것이 병렬 처리에서 큰 이점
- 공유자원으로 인한 레이스 컨디션, 데드락 문제가 자연스럽게 해결
- 객체지향이어도 공유 자원이 없다면 똑같이 스레드에서 안전
더 읽을거리