ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스레드와 잠금장치
    @19.1 ~ /동시성 모델 2020. 7. 4. 11:04

    스레드와 잠금장치를 이용하는 프로그래밍은 마치 포드 모델 T와 비슷하다

    그차로 A라는 장소에서 B라는 장소까지 운전해서 갈 수는 있지만 원시적이고 어려운 운전이 될 것이며,

     새로운 기술과 비교하면 안전성도 떨어지고 위험하기까지 하다

    하지만 많은 문제점에도 스레드와 잠금장치는 많은 동시성 소프트웨어를 작성할 때 기본 선택이 되고 있다

     

    스레드와 잠금장치는 실제 하드웨어가 동작하는 방식을 그대로 옮긴것과 크게 다르지 않다

    이들은 너무 단순하여 대부분의 언어가 어떠한 형태로든 이런 기능을 제공하고 있다

     

    상호배제란?

    잠금장치를 사용하는 것은 특정한 데이터에 접근하는 스레드가 한 번에 하나만 존재하도록 강제한다

    경쟁조건이나 데드락처럼 상호배제가 정상 동작하지 못하게 만드는 상태에 대해서도 알고 있을 것이다

    하지만 공유 메모리를 다룰 때는 이런것들보다 더 중요하고 근본적으로 고민해야하는 문제가 있는데

    그게 바로 메모리 모델이다

    경쟁 조건이나 데드락이 이상한 문제를 낳는 것처럼 보인다면 메모리 모델이라는 것은 얼마나 기괴한 문제를 낳는지 모른다

     

    보통은 읽기 -> 수정 -> 쓰기 순으로 데이터가 변경되는데
    이때 동기화가 되지않으면 스레드간 서로 순서가 뒤죽박죽되어 데이터가 이상해진다

     

    메모리 가시성

    한 스레드가 메모리에 가한 변화가 다른 메모리에 보이는 경우를 정의한다

    메모리에서 읽는 스레드와 쓰는 스레드가 동기화되지 않으면 메모리 가시성이 보장되지 않는다

    여기서 흔히 간과하는 사실은 스레드가 모두 동기화 되어야 한다는 사실이다

    값을 변경하는 스레드를 동기화하는 것만으로는 부족하다 읽기 스레드가 동기화 되지 않으면 오래된 값을 보게 될 수 있다

     

     

    앞의 내용을 보면 멀티스레드 호나경에서 안전성을 보장하는 유일한 방법이 모든 동기화하는 것 뿐이라고 생각하더라도 나무랄 생각은 없다

    하지만 그렇게 하는 것은 몹시 어렵다는 점이다

    우선 효율성이 극도로 떨어지게 된다. 대부분 스레드가 블로킹 상태가 되버린다

    그리고 데드락 위험이 있다.

    데드락의 위험성은 어떤 스레드가 둘 이상의 잠금장치를 손에 넣으려고 할 때 반드시 존재하게 된다

    '@19.1 ~ > 동시성 모델' 카테고리의 다른 글

    동시성 혹은 병렬성?  (0) 2020.07.01
Designed by Tistory.