[운영체제] Thread-safe

hyyyynjn·2021년 9월 23일
1

면접대비

목록 보기
13/31
post-thumbnail

Q. Thread-safe 하다는 의미와 설계하는 법을 설명해보세요.

두 개 이상의 스레드가 Race Condition에 들어가거나 같은 객체에 동시에 접근해도 연산결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미한다.

자바에서 Thread-safe한 설계를 위해서

  • java.util.concurrent 패키지 하위 클래스를 사용한다.
  • 인스턴스 변수를 두지 않는다.
  • Singleton 패턴을 사용한다. (참고)
    • Singleton 패턴
      애플리케이션이 시작되고 하나의 클래스 인스턴스를 보장하고, 전역적인 접근점을 제공하는 패턴이다.
    • 멀티스레드 환경에서 동기화 처리를 하지 않으면 여러개가 생성될 수 있다.
    • 일반적으로 구현하는 Singleton Pattern은 Thread-safe하지 않는다)
  • 동기화(syncronized) 블록에서 연산을 수행한다.

Thread-safe

멀티 스레드 프로그래밍에서 어떤 함수나, 변수, 혹은 객체가 어떤 스레드로부터 동시에 접근이 이루어져도 문제가 생기지 않는다는 것을 의미한다.

  • 여러곳에서 동시에 접근하더라도 그 결과가 올바르다는 것을 의미합니다

Thread-safe 구현 방법

  • 📌재진입성 (Re-entrancy)
    어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.
  • 📌상호 배제 (Mutual Exclusion)
    공유 자원을 사용할 경우, 해당 자원에 대한 접근을 Semaphore와 같은 LOCK으로 통제한다.
    • 임계구역 (Critical Section)을 정의한다. 해당 임계구역은 한번에 하나의 스레드만 접근할 수 있도록 해야한다.
    • Java에서는 syncronized를 사용하여 임계구역을 정의한다.
  • 📌스레드 지역 저장소 (Thread-Local Storage)
    공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소를 사용함으로써 동시 접근을 막는다.
    이 방식은 동기화 방법과 관련되어있고, 공유 상태를 피할 수 없을 경우 사용한다.
  • 📌원자 연산 (Atomic Operation)
    공유 자원에 접근할 때, 원자 연산 또는 원자적으로 정의된 접근 방법을 사용하여 상호 배제를 구현할 수 있다.
  • 📌불변 객체 (Immutable Object)
    객체 생성 이후에 값을 변경할 수 없도록 만든다. (예. String)

Atomic

프로그래밍에서 데이터의 변경이 동시에 일어난 것처럼 보이게 하는 것을 의미한다.
데이터의 값을 변경하는 것은 항상 변경에 대한 시간이 필요하다. Atomic한 데이터에 변경이 이루어지는 시간에 LOCK을 걸어 다른 접근을 막는다.

  • 프로퍼티가 atomic 하다는 의미
    멀티 스레드 환경에서 데이터에 접근할 때, 해당 데이터의 변경 전/후 상황에서만 접근하는 것을 보장한다는 의미이다.
    즉, 데이터의 변경이 이루어지는 순간에는 접근이 불가능하다.
  • Non-Atomic
    반환된 값에 대해 보장하지 않는다. 정확하거나 쓰레기 값일 수 있다.

0개의 댓글