Thread safe와 동기화 객체

hoo00nn·2020년 12월 26일
1
post-thumbnail

Thread-safe 란?

스레드 안전(thread safety)은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의한다.

Thread-safe를 지키기 위한 방법

  1. Re-entrancy
  • 어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.
  1. Thread-local storage
  • 공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다.
  • 이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다.
  1. Mutual exclusion
  • Thread에 lock이나 semaphore를 걸어서 공유자원에는 하나의 thread만 접근 가능하게 한다.
  1. Atomic operations
  • 데이터 변경시 atomic하게 데이터에 접근하도록 만듭니다.

atomic : 프로그래밍에서 데이터의 변경이 동시에 일어난 것처럼 보이게 하는 것을 의미한다. 데이터의 값을 변경하는 것은 항상 그 시간이 필요하다. atomic 한 데이터의 변경이 이루어지는 시간에는 lock 을 건다. 그래서 데이터를 변경하는 시간동안에는 접근이 이루어지지 않게한다.

그래서 프로퍼티가 *atomic 하다는 것은 멀티 스레드 환경에서 데이터가 반드시 변경전과 후의 상황에서만 접근하는 것을 보장한다. 즉, 데이터의 변경이 이루어지고 있는 순간에는 접근이 불가능하다.

  1. Immutable Object
  • 객체 생성 이후에 값을 변경할 수 없도록 만듭니다.

스레드 동기화란 ?

스레드의 동기화는 두 가지 관점에서 볼 수 있다.

  • 실행순서의 동기화
  • 메모리 접근의 대한 동기화

실행순서의 동기화

스레드의 실행순서를 정의하고, 반드시 이 순서를 따르도록 하는 것이다.

메모리 접근에 대한 동기화

데이터 영역과 힙 영역과 같이 한 순간에 하나의 쓰레드만 접근하도록 하는 것이 메모리 접근에 대한 동기화이다.

만약 두 개의 쓰레드가 동시에 데이터에 접근하여 변경한다면 계산 결과가 덮여씌워 지는 등 여러 문제가 발생할 수 있다.

동기화를 위한 두 가지 방법

유저 모드 동기화와 커널 모드 동기화가 있다.

유저 모드 동기화

  1. 유저 모드 동기화 (User Mode Synchronize)
  • 동기화가 진행되는 과정에서 커널의 힘을 빌리지 않는 (커널 코드가 실행되지 않는) 동기화 기법이다.
  • 따라서 동기화를 위해서 커널 모드로의 전환이 불필요해 성능상의 이점이 있다.
  • 그러나 그만큼 기능상의 제한도 있다.
  • Ex) 크리티컬 섹션 기반의 동기화, 인터락 함수 기반의 동기화

커널 모드 동기화

  1. 커널 모드 동기화 (Kernel Mode Synchronize)
  • 커널에서 제공하는 동기화 기능을 활용하는 방법이다.
  • 따라서 동기화에 관련된 함수가 호출될 때마다 커널 모드로의 변경이 필요하고, 이는 성능의 저하로 이어지게 된다.
  • 하지만 그만큼 유저 모드 동기화에서 제공하지 못하는 기능을 제공받을 수 있다.
  • Ex) 뮤텍스 기반의 동기화, 세마포어 기반의 동기화, 이름있는 뮤텍스 기반의 프로세스 동기화, 이벤트 기반의 동기화
profile
😀 신기술에 관심이 많고, 함께 성장하고 함께 개발하고 싶은 개발자가 되고 싶습니다. 😀

0개의 댓글