ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 읽기 / 쓰기 락
    @ 17. 1 ~ 18/C# 멀티스레드 2018. 6. 27. 23:01

    읽기 / 쓰기 락

    일반적으로 여러 읽기는 쓰기보다 빠르다.

    병렬적으로 발생하는 이런 읽기를 허용하는 것은 엄청나게 코드의 확장성을 개선한다.

    (읽기 쓰기 모두 락을 걸면 읽기도 쓰기도 모두 느려진다)


    RWL은 다음과 같은 기본적 사항을 요구한다.

    1. 스레드가 락을 획득할때 읽기인지 쓰기인지 명시해야한다.

    2. 최대 하나의 쓰기가 일정 시간에 락을 소유할 수 있다.(배제모드)

    3. 쓰기가 있는 한 어떤 읽기도 락을 소유할 수 없다.

    4. 어떤 수의 읽기도 주어진 시간에 락을 소유할 수 있다.(공유모드)


    예를 들어 32개의 CPU를 완벽히 장착한 서버를 갖고 있다고 하고 각 CPU는 항상 동시적으로 하나의 요청을 수행한다는 것을 가정한다.

    높은 성능으로 장착된 서버에서 주어진 시간에 수행할 수 있는 것보다 더 많은 일을 할 가능성이 많다.

    이런 스레드에서 동작하는 작업량이 공유 데이터읽는데 시간의 6%를 사용하고 

    같은 공유 데이터를 쓰는데 0.25%를 사용한다면 공유 락을 사용하면 처리량에 엄청난 증가를 확인할 수 있다.


    모든 락이 배재적이면 각 스레드 시간의 6.25%는 임계 영역의 내부에서 사용된다.

    32 * 0.0625(6.25%)를 계산하면 2다.

    따라서 주어진 시간에 임계 영역에 있기를 원하는 두 개의 스레드를 기대한다.

    단위 시간에 결국 한개의 락만 들어갈 수 있고 항상 나머지 하나는 끝나기를 기다리는 스레드를 가진다는 의미다.

    결국 또 다른 스레드가 끝나자마자 두 개 더 많은 스레드는 영역에 있으려고 하고 결국에는 모든 32개의 스레드는 락을 기다린다.

    이게 락 수송으로 알려진 현상이다.


    닷넷 프레임워크의 가벼운 읽기 / 쓰기 락

    System.Threading 네임스페이스에 ReaderWriterLock과 ReaderWriterLockSlim등 닷넷 프레임 워크에는 두개의 읽기/ 쓰기 락이 존재한다.

    Slim은 가볍고 더 좋은 성능을 낸다.(ReaderWriterLock은 모니터 획득 비용의 6배가량 들고 형편없이 동작한다)


    공유는 여러 스레드가 동시에 공유 모드의 락을 획득할 수 있는 전형적인 읽기 락 모드이고

    배제는 다른 모드에 있는 어떤 다른 스레드도 동시에 락을 획득하는것이 허용되지 않는 전형적인 상호 배제모드이다


    모든 반복 획득은 허용되지 않는다. 우선 락을 종료하지 않고 같은 스레드에서 같은 락에 대해 두번 호출할 수 없음을 의미한다.

    또한 공유락이 소유되었을때 배제 락을 획득하는것도 허용되지 않는다.


    '@ 17. 1 ~ 18 > C# 멀티스레드' 카테고리의 다른 글

    메모리 락과 락없는 프로그래밍  (0) 2018.07.03
    스레드 풀 스레드 관리  (0) 2018.06.30
    스레드 로컬 저장소  (0) 2018.06.21
    스레드 동기화란?  (0) 2018.03.05
    동시성 컬렉션 사용  (0) 2017.08.20
Designed by Tistory.