본문 바로가기
CS

[CS] Thread Safe

by pearhyunjin 2024. 6. 10.

멀티 스레드 프로그래밍

멀티스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것이다.

  • 장점
    • 멀티 프로세스에 비해 메모리 자원소모가 줄어든다.
    • Heap 영역을 통해서 스레드 간의 통신이 가능하기 때문에 프로세스 간의 통신이 간단해진다.
    • 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 훨씬 빠르다.
  • 단점
    • 힙 영역에 있는 자원을 사용할 때 동기화를 해야한다.
    • 동기화를 위해서 락을 과도하게 사용하면 성능 저하가 발생할 수도 있다.
    • 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 영향을 받아 종료하게 될 수도 있다.

 


 

스레드 안전 Thread-Safety

  • 스레드 안전(Thread-Satety)란 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 말한다.
  • 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 옳바르게 나오는 것을 말한다.
Thread-sate하다라는 의미는 두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과는 정합성이 보장될 수 있게 메모리 가시성이 확보된 상태이다.

 

 

스레드 안전을 지키기 위한 4가지 방법

 

1) Mutual Exclusion( 상호 배제 )

  • 공유 자원에 하나의 Thread만 접근할 수 있도록 세마포어 / 뮤텍스로 락을 통제하는 방법이다.
  • 일반적으로 많이 사용하는 방법이다.

 

2) Atomic Operation (원자 연산)

  • 공유 자원에 접근할 때는 원자 연산을 이용하거나 원자적으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.
  • Atomic
    • 공유 자원 변경에 필요한 연산을 원자적으로 분리한 뒤에 실제로 데이터의 변경이 이루어지는 시점에 Lock을 걸고, 데이터를 변경하는 시간 동안 다른 쓰레드의 접근이 불가능하도록 하는 방법이다.

 

3) Thread-Local Storage (스레드 지역 저장소)

  • 공유 자원의 사용을 최대한 줄이고 각가의 쓰레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법이다.
  • 일반적으로 공유 상태를 피할 수 없을 때 사용하는 방식이며, 전역 변수 사용을 자제하라는 뜻으로 생각하면 된다.

 

4) Re-entrancy (재진입성)

  • 쓰레드 호출과 상관 없이 프로그램에 문제가 없도록 작성하는 방법이다.
  • 어떤 함수가 한 스레드에 의해 호출되어 실행 중이라면 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 옳바르게 주어져야 한다.
  • 쓰레드끼리 독립적으로 동작할 수 있도록 코드를 작성하는 것으로 생각하면 된다.

 


 

* https://developer-ellen.tistory.com/205#%EB%A-%--%ED%-B%B-%--%EC%-A%A-%EB%A-%--%EB%--%-C%--%ED%--%--%EB%A-%-C%EA%B-%B-%EB%-E%--%EB%B-%-D

'CS' 카테고리의 다른 글

[CS] TCP 신뢰성  (0) 2024.06.17
[CS] 네트워크 - 3 way handshake, 4 way handshake  (0) 2024.06.13
[CS] 운영체제 - Blocking, Non-Blocking  (0) 2024.06.06
[CS] 자료구조 - Stack <-> Queue  (0) 2024.05.30
[CS] 자료구조 - Hash Table 충돌  (0) 2024.05.27