개발자 99% 커뮤니티에서 수다 떨어요!
오늘 TIL 3줄 요약
결코 절망하지 말지어다(nil desperandum!)
동시성은 소프트웨어 동작 방식이고, 병렬성은 하드웨어가 하는 것이다.
불규칙한 실패는 동시성 문제인 경우가 많다.
TIL (Today I Learned) 날짜
2022.03.29 - 2022.03.30
오늘 읽은 범위
6장. 동시성
책에서 기억하고 싶은 내용을 써보세요.
공유 상태에 빠진 예시
레스토랑에서 서로 다른 테이블의 손님이 서로 다른 웨이터에게 동시에 진열장에 하나 남은 애플파이를 주문했을 때 서로 다른 웨이터는 진열장에 남은 하나의 애플파이를 보고 동시에 주문을 받았을 때
서로 다른 사람이 핸드폰 한개만 살 수 있는 돈이 남은 공동 은행 계좌의 돈으로 동시에 핸드폰을 사기로 결정했을 때
공유 상태는 틀린 상태다
여기서 문제는 두 프로세스가 같은 메모리 영역에 쓰기가 가능하다는 점이 아니다.
문제는 어느 프로세스도 자신이 보는 메모리가 일관되어 있음을 보장할 수 없다는 점이다.
진열장의 값을 자신의 메모리로 복사하는 것이다. 만약 진열장의 값이 바뀐다면 종업원의 메모리, 즉 결정에 사용한 메모리는 시효가 지난 것이다.
이것은 모두 파이 조각을 가져오고 갱신하는 동작이 원자적(atomic)이지 않기 때문이다.
실제 값이 그사이에 바뀔 수 있다.
어떻게 원자적으로 바꿀 수 있을까?
세마포어 및 다른 상호 배제 방법
리소스를 트랜잭션으로 관리하라
여러 리소스와 트랜잭션
트랜잭션이 없는 갱신
세마포어(semaphore)는 단순히 한 번에 한 사람만이 가질 수 있는 무언가다
여러분은 세마포어를 만들어서 다른 리소스의 사용을 제어하는 데 쓸 수 있다.
코드로 살펴보자. 전통적으로는 세마포어를 획득하는 작업을 'P'로 , 반환하는 작업을 'V'로 불렀지만, 요즘은 '잠금lock/잠금 해제unlock', '획득claim/반환release'등으로 부른다.
공유 메모리는 동시성 문제의 원인으로 많이 지목받는다. 하지만 사실 수정 가능한 리소스를 공유하는 애플리케이션 코드 어디에서나 동시성 문제가 발생할 수 있다.
불규칙한 실패는 동시성 문제인 경우가 많다.
대부분의 언어에는 공유 리소스에 독점적으로 접근하는 것을 도와주는 라이브러리가 있다.
상호 배제(mutual exclusion)을 의미하는 뮤텍스(mutex)라고 부르기도 하고, 모니터(monitor)나 세마포어라고 부르기도 한다.
언어 자체에 동시성 지원이 들어 있는 언어도 있다.
러스트(Rust) : 데이터의 소유권이라는 개념을 강제한다. 변경 가능한 데이터 조각은 어느 한 시점에 단 하나의 변수나 매개 변수만 참조를 가질 수 있다.
액터(actor)와 프로세스를 사용하면 흥미로운 방식으로 동시성을 구현할 수 있다.
공유 메모리 접근을 동기화하느라 고생할 필요도 없다.
액터의 동작방식
각 액터는 우편함(mailbox)을 하나씩 보유하고 있다.
액터가 잠자고 있을 떄 우편함에 메시지가 도착
액터가 깨어나면서 메시지를 처리.
메시지를 처리할 때
액터는 다른 액터를 생성하거나,
알고 있는 다른 액터에게 메시지를 보내거나,
다음 메시지를 처리할 때의 상태가 될 새로운 상태를 생성할 수 있다.
메시지 처리가 끝나면 우편함의 다른 메시지를 처리. 만약 우편함이 비어 있으면 다시 잠든다.
액서의 정의에서 찾아볼 수 없는 것 몇가지
액터를 관리하는 것이 하나도 없다.
시스템이 저장하는 상태는 오직 메시지 그리고 각 액터의 지역 상태뿐이다.
모든 메시지는 일방향이다. 답장이란 개념은 없다.
액터는 각 메시지를 끝날 때까지 처리하고 중간에 다른 일을 하지 않는다.
즉, 한 번에 하나의 메시지만 처리한다.
액터들은 아무것도 공유하지 않으면서 비동기적으로 동시에 실행된다.
공유 상태 없는 동시성을 위하여 액터를 사용하라
액터모델에서는 동시성을 다루는 코드를 쓸 필요가 없다. 공유된 상태가 없기 때문이다.
명시적으로 처음부터 끝까지 "이걸 한 다음 저걸 하라"는 코드를 쓸 필요도 없다.
액터가 수신하는 메시지에 따라 알아서 실행되기 때문이다.
컴퓨터 기반의 칠판 시스템은 원래 음성 인식, 지식 기반 추론 시스템 등 해결해야 할 문제의 규모가 크고 복잡한 인증 지능 애플리케이션에서 사용되었다.
칠판으로 작업 흐름을 조율하라
카프카(kafka)나 NATS 같은 메시징 시스템은 단순히 데이터를 A에서 B로 보내는 것보다 훨씬 많은 일을 한다.
이벤트 로그의 형태로 영속성을 제공
패턴 매칭 형태로 메시지를 가져오는 것 지원
메시징 시스템을 칠판으로도 사용할 수 있고, 여러 액터를 실행하는 플랫폼으로도 사용할 수 있다는 것이다.
아키텍처에서 액터와 칠판, 마이크로서비스를 활용하면 애플리케이션에서 생길 수 있는 모든 종류의 동시성 문제를 예방할 수 있을 것이다. -> 하지만 거기에는 비용이 따른다!
시스템에서 처리하는 메시지나 정보를 추적할 수 유용한 기법
-> 특정한 비즈니스 작업처리를 시작할 때 고유한 '추적 아이디(trace id)'를 만들어서 붙이는 것
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
공유 상태는 틀린 상태다 앞부분의 내용을 정리하다가 조작을 잘못하여 내용이 날아갔다.
순간적으로 너무 화가 났지만 '결코 절망하지 말지어다!' 를 떠올리며 화가 난 마음을 바로 진정시키고 그 전에 정리했던 내용은 다시 살펴보며 정리할 수 있다는 기회로 생각하고 정리해 나갔다.
개발 및 운영의 상황에서 동시성으로 인한 문제가 발생했을 때도 이해되지 않는 상황에, 재현이 되지 않는 상황에 화가나거나 절망하게 된다면 크게 심호흡을 한번 내쉬며 마음을 차분히 가라앉히고 '결코 절망하지 말지어다!' 를 3번은 되뇌이며 생각한 뒤 상황을 객관적으로 보고 판단하여 문제상황을 해결해 나가야겠다고 생각했다.
궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
파이버(fiber) : 스레드보다 더 가벼운 실행 흐름을 만드는 도구다. 운영 체제의 스케줄러를 사용하지 않아서 사용자 수준 스레드라고도 부른다. 자세한 내용은 위키백과를 참고하라
(https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%B4%EB%B2%84_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99))
액터(actor) : 자신만의 비공개 지역 상태(state)를 가진 독립적인 가상 처리 장치(virtual processor)다.
오늘 읽은 다른사람의 TIL
김성현 님의 TIL - https://hyuuny.tistory.com/69