멀티 스레드 환경에서 함수형 프로그래밍이 안전한 이유

기석·2022년 8월 18일
1

멀티 스레드 환경의 문제점

  • 레이스 컨디션

멀티쓰레드 환경에서는 실행 순서를 보장할 수 없고 자원을 공유하기 때문에 서로의 자원을 동시에 접근해 처리할 때 레이스 컨디션 문제가 발생할 수 있다.

이미지 출처: 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(뮤텍스 - 자원에 대한 동시접근 불가)
  1. Hold and Wait(점유하고 기다리기)

  2. No Preemption(자원 뺏어오지 못함)

  3. Circular Wait(순환 형태 대기)

출처: 교착상태(deadlock)와 그 해결방안을 알아보자.

함수형 프로그래밍을 적용한다면?

순수함수

  • 오직 입력에 의해서만 출력이 정해진다.
  • 함수의 실행이 외부의 상태를 변경시키지 않는 함수
  • 부가 효과(Side-Effect)가 없다

No Mutual State

  • 서로 공유하는 자원이 없다는 것이 병렬 처리에서 큰 이점
  • 공유자원으로 인한 레이스 컨디션, 데드락 문제가 자연스럽게 해결
  • 객체지향이어도 공유 자원이 없다면 똑같이 스레드에서 안전

더 읽을거리

profile
블로그 이사갔어요 https://kiseoky.tistory.com

0개의 댓글