[35일차] | 컴퓨터 밑바닥의 비밀 | 책너두

Heechan Kang·2024년 5월 26일
0
post-thumbnail

5.4.4 획득-해제 의미론

  • 획득-해제 의미론(acquire-release semantics)은 스레드 간의 동기화를 위한 방법이다.
    • 획득 의미론은 메모리 읽기에 대한 것으로, 최적화시에도 Load 작업 뒤에있는 명령어는 Load 작업 이전으로 이동하지 않는다는 것이다.
    • 해제 의미론은 메모리 쓰기에 대한 것으로, 최적화시에도 Store 작업 앞에있는 명령어는 Store 작업 이후로 이동하지 않는다는 것이다.

5.4.5 C++에서 제공하는 인터페이스

  • 잠금 없는 프로그래밍을 CPU 차원의 기계명령어를 사용해서 구현한다면, 다른 플랫폼에서의 동작을 보장 할 수 없다.

  • 따라서, 언어 수준에서 제공하는 인터페이스를 사용해야 한다.

    • C++에서는 atomic 키워드를 통해 이러한 인터페이스를 제공한다.

      include <atomic>
      
      std::atomic_thread_fence(std::memory_order_acquire);
      std::atomic_thread_fence(std::memory_order_release);
    • 첫 예시에도 이와 같은 방식으로 획득-해제 의미론을 적용 할 수 있다.

      std::atomic<bool> is_enemy_coming(false);
      int enemy_num = 0;
      
      void king_thread()
      {
        enemy_num = 100000;
      
        std::atomic_thread_fence(std::memeory_order_release);
      
        is_enemy_coming.store(true, std::memory_order_release);
      }
      
      void other_thread()
      {
        int n;
        if(is_enemy_coming.load(std::memory_order_relaxed))
        {
          std::atomic_thread_fence(std::memory_order_acquire);
      
          n = enemy_num;
        }
      }

5.4.6 다른 CPU, 다른 천성

  • CPU의 아키텍처마다 다른 특성을 가지고있다
    • x86 아키텍처는 강한 메모리 모델로, 별도의 획득-해제 의미론을 추가하지 않아도 이전과 같은 문제가 발생하지 않는다.

5.4.7 누가 명령어 재정렬에 관심을 가져야 하는가: 잠금 없는 프로그래밍

  • 위와 같은 명령어 재정렬 문제는 '잠금 없는 프로그래밍'을 할 떄에만 신경쓰면 된다.
    • 싱글 스레드 환경에서는 이러한 문제를 고려할 필요가 없다.

5.4.8 잠금 프로그래밍과 잠금 없는 프로그래밍

  • 잠금(lock): 다중 스레드 환경에서 공유 자원에 대한 접근을 제어하는 방법
    • 상호 배제(mutual exclusion): 한 스레드가 공유 자원을 사용할 때, 다른 스레드는 접근할 수 없도록 하는 것
    • 스핀락(spinlock): 다른 스레드가 잠금을 획득할 때까지 계속해서 잠금을 시도하는 것
  • 잠금 없는 프로그래밍은 전체 시스템 성능 향상 목적이 아닌, 낭비되는 시간을 줄이기 위한 목적으로 사용된다.

5.4.9 명령어 재정렬에 대한 논쟁

  • 리누스 토발스는 명령어 재정렬이 수많은 버그의 원인이라고 지적했다.
  • 이처럼 아직 명령어 재정렬에 대한 많은 논쟁이 있다.
  • 정리
    • 성능을 위해, CPU는 반드시 프로그래머가 작성한 순서대로 엄격하게 코드를 실행할 필요는 없다.
    • 프로그램이 단일 스레드인 경우, 명령어의 비순차적 실행을 볼수 없으므로, 이러한 문제를 고려할 필요가 없다.
    • 메모리 장벽의 목적은 한 코어의 명령어 실행 순서가 다른 코어가 볼떄에도 보장되도록 하는 것이다.
    • 멀티 스레드의 잠금 없는 프로그래밍을 사용할 필요가 없다면, 명령어 재정렬을 걱정 할 필요가 없다.
profile
안녕하세요!

0개의 댓글