![](https://t1.daumcdn.net/keditor/emoticon/niniz/large/012.gif)
🧑🏻💻 오늘 TIL 3줄 요약
- 순서에 의존하는 시간적 결합을 끊어낸다면, 코드의 유연성 과 생산성을 상승시킬 수 있다.
- 여러 비동기 작업들이 리소스를 공유할 상황을 만들지 말고, 액터를 이용해 동시성을 구현하자.
- 아키텍처에서 액터와 칠판, 마이크로서비스를 활용하면 거의 모든 종류의 동시성 문제를 예방 할 수 있지만, 배포하고 관리하기 까다롭다 는 점 그러나 시스템을 더 잘게 쪼개서 ETC 측면의 이득을 볼 수 있다는 득과 실이 존재한다.
TIL (Today I Learned)
- 2022. 3. 29.
📕 오늘 읽은 범위
- 6장. 동시성
🙂 책에서 기억하고 싶은 내용
- ‘동시성(병행성) concurrency’은 둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것이다.
그리고 ‘병렬성 parallelism’이란 실제로 동시에 실행되는 것이다. _p.241
- 애플리케이션이 실제 세상을 다루기 원한다면 동시성은 필수다. 세상은 비동기적이기 때문이다. 사용자와 상호작용하고, 데이터를 불러오고, 외부 서비스를 호출하는 일을 동시에 해야 한다. 만약 이를 순차적으로 하나를 끝낸 다음에 다음 일을 하는 식으로 수행한다면, 시스템은 거북이처럼 느리게 느껴질 것이고 프로그램을 구동하는 하드웨어의 성능도 최대로 활용하지 못할 것이다. _p.242
Topic33. 시간적 결합 깨뜨리기
- 소프트웨어의 설계 요소로서 시간은 우리가 신경 써야 할 측 면이 두 가지 있는데, 동시성(동시에 일어나는 일들)과 순서(시간의 흐름 속 에서 일들의 상대적인 위치)다. _p.243
- Tip56. 작업 흐름 분석으로 동시성을 개선하라. _p.244
- 활동 다이어그램을 사용하면 동시에 수행할 수 있는데도 아직 동시에 하고 있지 않은 활동들을 찾아내서 병렬성을 극대화할 수 있다. _p.245
- 우리는 시간이 걸리지만, 우리 코드가 아닌 곳에서 시간이 걸리는 활동을 찾고 싶다. 데이터베이스를 조회할 때나 외부 서비스에 접근할 때, 사용자 입력을 기다릴 때 같이 우리 프로그램이 다른 작업이 끝나기를 기다려야 하는 상황 말이다. _p.24
- 동시성은 소프트웨어 동작 방식이고, 병렬성 은 하드웨어가 하는 것이다. _p.247
Topic34. 공유 상태는 틀린 상태
" 종업원1이 현재 파이 조각 수를 조회하고, 1을 얻는다. 그러고는 고객에게 파 이를 약속한다. 하지만 이 시점에 종업원2도 작업을 시작한다. 역시 파이 조 각 수를 조회하여 1을 얻고, 고객에게 똑같은 약속을 한다. 둘 중 하나가 마 지막 남은 파이 조각을 획득하고, 다른 종업원은 일종의 예외 상태에 빠진다. (아마 허리를 여러 번 굽혀야 할 것이다.) "
--> 위 동작은 원자적 atomic 이지 않기 때문에 발생하는 일이다. 실제 값이 그 사이 바뀔 수 있다. _p.251
- 세마포어 semaphore는 단순히 한 번에 한 사람만이 가질 수 있는 무언가다. 여 러분은 세마포어를 만들어서 다른 리소스의 사용을 제어하는 데 쓸 수 있다. _p.251
- 전통적으로는 세마포어를 획득하는 작업을 ‘P’로, 반환하 는 작업을 ‘V’로 불렀지만,4 요즘은 ‘잠금lock/잠금 해제unlock’, ‘획득claim/반환release’ 등으로 부른다. _p.252
- Tip58. 불규칙한 실패는 동시성 문제인 경우가 많다. _p.257
- 대부분의 언어에는 공유 리소스에 독점적으로 접근하는 것을 도와주는 라이 브러리가 있다. 상호 배제 mutual exclusion를 의미하는 뮤텍스 mutex라고 부르기도 하고, 모니터 monitor나 세마포어라고 부르기도 한다. 모두 라이브러리로 제공 된다. _p.257
- 언어 자체에 동시성 지원이 들어 있는 언어도 있다. 예를 들어 러스트 Rust는 데이터의 소유권이라는 개념을 강제한다. 변경 가능한 데이터 조각 은 어느 한 시점에 단 하나의 변수나 매개 변수만 참조를 가질 수 있다. _p.257
Topic35. 액터와 프로세스
- 액터 actor와 프로세스를 사용하면 흥미로운 방식으로 동시성을 구현할 수 있 다. 공유 메모리 접근을 동기화하느라 고생할 필요도 없다. _p.258
- ‘액터’는 자신만의 비공개 지역 상태 state를 가진 독립적인 가상 처리 장치 virtual processor다. 각 액터는 우편함 mailbox을 하나씩 보유하고 있다. 액터가 잠자고 있을 때 우편함에 메시지가 도착하면 액터가 깨어나면서 메시지를 처리한다. 처리가 끝나면 우편함의 다른 메시지를 처리한다. 만약 우편함 이 비어 있으면 다시 잠든다.
메시지를 처리할 때 액터는 다른 액터를 생성하거나, 알고 있는 다른 액 터에게 메시지를 보내거나, 다음 메시지를 처리할 때의 상태가 될 새로운 상태를 생성할 수 있다. _p.259
- ‘프로세스’는 본래 더 일반적인 가상 처리기로, 보통 운영 체제가 동시성을 지원하기 위하여 구현한다. 프로세스를 사용할 때 마치 액터처럼 동작하 도록 관례를 만들어 제한적으로만 사용할 수도 있는데, 이번 항목에서 이 야기하는 프로세스란 바로 이렇게 제한한 것을 말한다. _p.259
- 액터들은 아무것도 공유하지 않으면서 비동기적으로 동시에 실행된 다. 물리적인 프로세서가 넉넉하다면 각각 액터를 하나씩 돌릴 수 있다. 프 로세서가 하나뿐이라면 실행 환경이 액터마다 컨텍스트를 전환해 가면서 실 행시킬 수 있다. 어느 쪽이든 액터에서 실행되는 코드는 동일하다. _p.260
- Tip59. 공유 상태 없는 동시성을 위하여 액터를 사용하라. _p.260
- 얼랭 Erlang 언어와 런타임은 액터 구현의 좋은 사례다. (중략...) 얼랭의 프로세스는 가볍기 때문에 컴퓨터 한 대에서 수백만 개를 실행시킬 수 있고, 프로세 스끼리 메시지를 보내서 통신한다. 프로세스들은 각각 격리되어 있어서 상태를 공유하지 않는다.
Topic36. 칠판
- Tip60. 칠판으로 작업 흐름을 조율하라. _p.270
- 아키텍처에서 액터와 칠판, 마이크로서비스를 활용하면 애플리케이션에서 생길 수 있는 모든 종류의 동시성 문제를 예방할 수 있을 것이다. 하지만 거 기에는 비용이 따른다. 이런 접근 방식을 사용하면 많은 동작이 간접적으로 일어나므로 분석이 더 힘들다. (중략...) 유용한 기법을 하나 소개하겠다. 특정한 비즈니스 작업처리를 시작할 때 고유한 ‘추적 아이디 trace id’를 만들어서 붙이는 것이다. 그리고 해당 작업에 관여하는 모든 액터로 아이디를 전파하면, 나중에 로그 파일을 뒤져서 어떤 일이 일어났는지 재구성해 볼 수 있을 것이다. _p.270
🤔 오늘 읽은 소감은?
- 이전 챕터에서 우리는 코드의 유연함을 위해 결합도를 낮추는 방법들에 대해 알아보았다. 이번 장에서는 '시간적 결합 temporal coupling'의 개념을 다루고 있는데, 우리는 무의식적으로 절차나 과정을 설계하고(알고리즘 순서도를 보아라) 그런 방식에 익숙해지다보면 시간 순서에 얽매어 있는 즉, 시간 의존도가 높은 코드를 작성할 수 있다는 것이다. 그래서 시간이나 순서에 의존하는 시간적 결합을 끊어낸다면 작업 흐름 분석, 아키텍처, 설계, 배포 등에서 유연성을 높이고, 응답속도도 개선할 수 있을 것이다.
- 어떤 일을 동시에 처리했을 때 생길 수 있는 상황들을 '진열장의 파이'등과 같은 꽤 흥미로운 비유를 사용하여 이해하기 쉽게 설명하고 있다. 세마포어나 뮤텍스 같은 개념들은 결국 몇가지 비동기 작업들이 공유 리소스를 사용할 때 생길 수 있는 문제들을 해결할 수 있는 방안인데, 이 장에서는 애초에 리소스를 공유하지 않도록 액터의 사용을 권장하고 있다. 액터의 개념은 이 책에서 처음 접한 개념이었는데 제법 흥미로웠다.
😅 궁금한 내용이 있거나, 잘 이해되지 않는 내용
- 파이버 fiber
스레드보다 더 가벼운 실행 흐름을 만드는 도구다. 운영 체제의 스케줄러를 사용하지 않아서 사용자 수준 스레드라고도 부른다.
https://ko.wiki-pedia.org/wiki/파이버_(컴퓨터_과학)
- 세마포어 semaphore & 뮤텍스 mutex
https://jhnyang.tistory.com/101
https://heeonii.tistory.com/14
'도서 > 실용주의프로그래머_#bookclub#TIL' 카테고리의 다른 글
실용주의 프로그래머 #17일차 (0) | 2022.04.04 |
---|---|
실용주의 프로그래머 #15일차 (0) | 2022.04.04 |
실용주의 프로그래머 #9일차 (0) | 2022.03.28 |
실용주의 프로그래머 #7일차 (0) | 2022.03.24 |
실용주의 프로그래머 #6일차 (0) | 2022.03.24 |