Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
TIL 6장. 동시성
#pragmatic
2년 전
1,050
1

오늘 TIL 3줄 요약

  • 결코 절망하지 말지어다(nil desperandum!)

  • 동시성은 소프트웨어 동작 방식이고, 병렬성은 하드웨어가 하는 것이다.

  • 불규칙한 실패는 동시성 문제인 경우가 많다.

TIL (Today I Learned) 날짜

2022.03.29 - 2022.03.30

오늘 읽은 범위

6장. 동시성

책에서 기억하고 싶은 내용을 써보세요.

공유 상태는 틀린 상태

  • 공유 상태에 빠진 예시

    1. 레스토랑에서 서로 다른 테이블의 손님이 서로 다른 웨이터에게 동시에 진열장에 하나 남은 애플파이를 주문했을 때 서로 다른 웨이터는 진열장에 남은 하나의 애플파이를 보고 동시에 주문을 받았을 때

    2. 서로 다른 사람이 핸드폰 한개만 살 수 있는 돈이 남은 공동 은행 계좌의 돈으로 동시에 핸드폰을 사기로 결정했을 때

  • 공유 상태는 틀린 상태다

비-원자적 갱신

  • 여기서 문제는 두 프로세스가 같은 메모리 영역에 쓰기가 가능하다는 점이 아니다.
    문제는 어느 프로세스도 자신이 보는 메모리가 일관되어 있음을 보장할 수 없다는 점이다.

  • 진열장의 값을 자신의 메모리로 복사하는 것이다. 만약 진열장의 값이 바뀐다면 종업원의 메모리, 즉 결정에 사용한 메모리는 시효가 지난 것이다.
    이것은 모두 파이 조각을 가져오고 갱신하는 동작이 원자적(atomic)이지 않기 때문이다.
    실제 값이 그사이에 바뀔 수 있다.

  • 어떻게 원자적으로 바꿀 수 있을까?

    1. 세마포어 및 다른 상호 배제 방법

    2. 리소스를 트랜잭션으로 관리하라

      • 여러 리소스와 트랜잭션

      • 트랜잭션이 없는 갱신

  • 세마포어(semaphore)는 단순히 한 번에 한 사람만이 가질 수 있는 무언가다
    여러분은 세마포어를 만들어서 다른 리소스의 사용을 제어하는 데 쓸 수 있다.

  • 코드로 살펴보자. 전통적으로는 세마포어를 획득하는 작업을 'P'로 , 반환하는 작업을 'V'로 불렀지만, 요즘은 '잠금lock/잠금 해제unlock', '획득claim/반환release'등으로 부른다.

  • 공유 메모리는 동시성 문제의 원인으로 많이 지목받는다. 하지만 사실 수정 가능한 리소스를 공유하는 애플리케이션 코드 어디에서나 동시성 문제가 발생할 수 있다.

  • 불규칙한 실패는 동시성 문제인 경우가 많다.

  • 대부분의 언어에는 공유 리소스에 독점적으로 접근하는 것을 도와주는 라이브러리가 있다.
    상호 배제(mutual exclusion)을 의미하는 뮤텍스(mutex)라고 부르기도 하고, 모니터(monitor)나 세마포어라고 부르기도 한다.

  • 언어 자체에 동시성 지원이 들어 있는 언어도 있다.
    러스트(Rust) : 데이터의 소유권이라는 개념을 강제한다. 변경 가능한 데이터 조각은 어느 한 시점에 단 하나의 변수나 매개 변수만 참조를 가질 수 있다.

액터와 프로세스

  • 액터(actor)와 프로세스를 사용하면 흥미로운 방식으로 동시성을 구현할 수 있다.
    공유 메모리 접근을 동기화하느라 고생할 필요도 없다.

  • 액터의 동작방식

    1. 각 액터는 우편함(mailbox)을 하나씩 보유하고 있다.

    2. 액터가 잠자고 있을 떄 우편함에 메시지가 도착

    3. 액터가 깨어나면서 메시지를 처리.
      메시지를 처리할 때

      액터는 다른 액터를 생성하거나,
      알고 있는 다른 액터에게 메시지를 보내거나,
      다음 메시지를 처리할 때의 상태가 될 새로운 상태를 생성할 수 있다.

    4. 메시지 처리가 끝나면 우편함의 다른 메시지를 처리. 만약 우편함이 비어 있으면 다시 잠든다.

액터는 언제나 동시성을 띤다

  • 액서의 정의에서 찾아볼 수 없는 것 몇가지

    1. 액터를 관리하는 것이 하나도 없다.

    2. 시스템이 저장하는 상태는 오직 메시지 그리고 각 액터의 지역 상태뿐이다.

    3. 모든 메시지는 일방향이다. 답장이란 개념은 없다.

    4. 액터는 각 메시지를 끝날 때까지 처리하고 중간에 다른 일을 하지 않는다.
      즉, 한 번에 하나의 메시지만 처리한다.

  • 액터들은 아무것도 공유하지 않으면서 비동기적으로 동시에 실행된다.

  • 공유 상태 없는 동시성을 위하여 액터를 사용하라

드러나지 않는 동시성

  • 액터모델에서는 동시성을 다루는 코드를 쓸 필요가 없다. 공유된 상태가 없기 때문이다.

  • 명시적으로 처음부터 끝까지 "이걸 한 다음 저걸 하라"는 코드를 쓸 필요도 없다.
    액터가 수신하는 메시지에 따라 알아서 실행되기 때문이다.

칠판

  • 컴퓨터 기반의 칠판 시스템은 원래 음성 인식, 지식 기반 추론 시스템 등 해결해야 할 문제의 규모가 크고 복잡한 인증 지능 애플리케이션에서 사용되었다.

  • 칠판으로 작업 흐름을 조율하라

메시지 시스템과 칠판의 유사성

  • 카프카(kafka)나 NATS 같은 메시징 시스템은 단순히 데이터를 A에서 B로 보내는 것보다 훨씬 많은 일을 한다.

    1. 이벤트 로그의 형태로 영속성을 제공

    2. 패턴 매칭 형태로 메시지를 가져오는 것 지원

  • 메시징 시스템을 칠판으로도 사용할 수 있고, 여러 액터를 실행하는 플랫폼으로도 사용할 수 있다는 것이다.

  • 아키텍처에서 액터와 칠판, 마이크로서비스를 활용하면 애플리케이션에서 생길 수 있는 모든 종류의 동시성 문제를 예방할 수 있을 것이다. -> 하지만 거기에는 비용이 따른다!

  • 시스템에서 처리하는 메시지나 정보를 추적할 수 유용한 기법
    -> 특정한 비즈니스 작업처리를 시작할 때 고유한 '추적 아이디(trace id)'를 만들어서 붙이는 것

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

공유 상태는 틀린 상태다 앞부분의 내용을 정리하다가 조작을 잘못하여 내용이 날아갔다.
순간적으로 너무 화가 났지만 '결코 절망하지 말지어다!' 를 떠올리며 화가 난 마음을 바로 진정시키고 그 전에 정리했던 내용은 다시 살펴보며 정리할 수 있다는 기회로 생각하고 정리해 나갔다.

개발 및 운영의 상황에서 동시성으로 인한 문제가 발생했을 때도 이해되지 않는 상황에, 재현이 되지 않는 상황에 화가나거나 절망하게 된다면 크게 심호흡을 한번 내쉬며 마음을 차분히 가라앉히고 '결코 절망하지 말지어다!' 를 3번은 되뇌이며 생각한 뒤 상황을 객관적으로 보고 판단하여 문제상황을 해결해 나가야겠다고 생각했다.

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

오늘 읽은 다른사람의 TIL

1 comment