개발자 99% 커뮤니티에서 수다 떨어요!
오늘 TIL 3줄 요약
세상은 비동기적이기 때문에 사용자와 상호작용하고, 데이터를 불러오고, 외부 서비스를 호출하는 일을 동시에 해야한다.
'동시성(concurrency)'은 둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것이다. 그리고 '병렬성(parallelism)'이란 실제로 동시에 실행되는 것이다.
'공유 상태(shared state)'를 경계하라
TIL (Today I Learned) 날짜
2022. 05. 24
오늘 읽은 범위
6장. 동시성
책에서 기억하고 싶은 내용을 써보세요.
'동시성(concurrency)'은 둘 이상의 코드 조각이 실행될 때 동시에 실행 중인 것처럼 행동하는 것이다. 그리고 '병렬성(parallelism)'이란 실제로 동시에 실행되는 것이다.
시스템의 규모가 어느 정도를 넘어가면 동시성을 고려하지 않고 코드를 작성하기란 거의 불가능하다. 동시성이 겉으로 드러날 때도 있지만 라이브러리 안에 묻혀 있는 경우도 있다.
세상은 비동기적이기 때문에 사용자와 상호작용하고, 데이터를 불러오고, 외부 서비스를 호출하는 일을 동시에 해야 한다.
'시간적 결합(temporal coupling)'은 당면한 문제 해결에 꼭 필요하지 않은 일 처리 순서를 코드가 강제할 때 생긴다.
시간에는 우리가 신경 써야 할 측면이 두 가지 있는데, 동시성(동시에 일어나는 일들)과 순서(시간의 흐름 속에서 일들의 상대적인 위치)다.
많은 프로젝트에서 설계 과정의 일환으로 애플리케이션의 작업 흐름을 모델화하고 분석하는 작업이 필요하다. 우리는 동시에 일어나도 되는 게 뭐고, 반드시 순서대로 일어나야 하는 건 어떤 것인지 찾아내길 원한다. '활동 다이어그램(activity diagram)' 같은 표기법을 사용해서 작업 흐름을 기록하는 것이 한 방법이다.
동시성은 소프트웨어 동작 방식이고, 병렬성은 하드웨어가 하는 것이다. 컴퓨터 한 대에 있든 아니면 연결된 여러 대에 있든 우리에게 여러 개의 프로세서가 있다면, 그리고 작업을 프로세서들에게 나누어 줄 수 있다면 전체 소요 시간을 단축할 수 있다.
세마포어(semaphore)는 단순히 한 번에 한 사람만이 가질 수 있는 무언가다. 여러분은 세마포어를 만들어서 다른 리소스의 사용을 제어하는 데 쓸 수 있다.
공유 메모리는 동시성 문제의 원인으로 많이 지목받는다. 하지만 사실 수정 가능한 리소스를 공유하는 애플리케이션 코드 어디에서나 동시성 문제가 발생할 수 있다.
'액터'는 자신만의 비공개 지역 상태(state)를 가진 독립적인 가상 처리 장치(virtual processor)다. 각 액터는 우편함(mailbox)을 하나씩 보유하고 있다. 액터가 잠자고 있을 때 우편함에 메시지가 도착하면 액터가 깨어나면서 메시지를 처리한다. 처리가 끝나면 우편함의 다른 메시지를 처리한다. 만약 우편함이 비어 있으면 다시 잠든다.
'프로세스'는 본래 더 일반적인 가상 처리기로, 보통 운영 체제가 동시성을 지원하기 위하여 구현한다. 프로세스를 사용할 때 마치 액터처럼 동작하도록 관례를 만들어 제한적으로만 사용할 수도 있는데, 이번 항목에서 이야기하는 프로세스란 바로 이렇게 제한한 것을 말한다.
액터의 정의에서 찾아볼 수 없는 것이 몇 가지 있다.
액터를 관리하는 것이 하나도 없다.
시스템이 저장하는 상태는 오직 메시지 그리고 각 액터의 지역 상태뿐이다.
모든 메시지는 일방향이다
액터는 각 메시지를 끝날 때까지 처리하고 중간에 다른 일을 하지 않는다.
액터 모델에서는 동시성을 다루는 코드를 쓸 필요가 없다. 공유된 상태가 없기 때문이다. 명시적으로 처음부터 끝까지 "이걸 한 다음 저걸 하라"는 코드를 쓸 필요도 없다. 액터가 수신하는 메시지에 따라 알아서 실행되기 때문이다.
얼랭(Erlang)언어와 런타임은 액터 구현의 좋은 사례다.
칠판은 동시 협력 처리 시스템이다. 칠판 시스템은 서로 다른 요구사항들을 캡슐화하여 해당 캡슐에 대한 적절한 처리를 할 수 있다. 결과에 대한 피드백 또한 마찬가지다. 칠판 시스템은 작업 흐름을 원활하게 조율이 가능하도록 만든다.
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
동시성과 병렬성을 구분짓는 것이 6장에서 가장 흥미로운 주제라고 생각되었다. 무엇보다 활동 다이어그램의 경우 이것은 프로그래밍에 국한되지 않고 다른 영역에서도 얼마든지 활용할 수 있는 것이라고 느껴졌다. 동시에, 다른 작업을 해당 활동 다이어그램으로 구분지어보는 것 또한 나의 프로그래밍 습관의 형성에 도움이 많이 될 것 같다는 생각이 들었다.
전반적으로 6장의 예시들은 일상 생활에서의 사례들을 예시로 들어 설명한 부분이 많았기에 아직 경험이 적은 나에게는 보다 쉽게 이해할 수 있었던 것 같다. 그럼에도 불구하고 동시성과 시간적 결합에 대해서는 한편으로는 이해가 가지만 실제로 코드로 구현되었을때 어떤 문제를 일으키는가, 유지 보수에 있어서 어떤 어려움을 가져오는가에 대해서는 아직은 잘 모르겠다.
실제로도 동시에 여러 프로그램을 작동하고, 여러 주변 장치들을 연결해서 작업할 경우 메모리 참조 오류 혹은 공유 데이터 문제로 프로그램이 강제 종료되거나 했던 경험들이 있어서 공유 상태에 대해서는 어느정도 이해는 되나 액터 모델과 칠판 시스템, 메시지 시스템에서는 전혀 감이 잡히지가 않는다. 나중에 더 찾아보고 공부해봐야겠다. 메모메모....
궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
칠판 시스템과 메시지 시스템에 대해서는 아직도 이해가 잘 되지 않는다. 액터 모델에서 동시성을 다루는 코드를 쓸 필요가 없다는건 이해되지만 액터 모델을 어떻게 활용해야하는가에 대해서는 아직 경험해보지 못한 영역이라 실제 현업에서 어떻게 활용해야할지는 다음 기회에....
오늘 읽은 다른사람의 TIL