동시성(1)

동시성이 필요한 이유

책너두 5기 25일차

로버트 C. 마틴의 클린코드 p. 226~ p.229

내용 정리

13. 동시성

동시성과 깔끔한 코드는 양립하기 어렵다.

동시성이 필요한 이유?

동시성은 결합(coupling)을 없애는 전략이다. 무엇(what)언제(when)을 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 밀접하다.

무엇(what)언제(when)를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다. 따라서 시스템을 이해하기 쉽고 문제를 분리하기도 쉽다.

예시: 서블릿(Servlet)

서블릿은 웹 혹은 EJB 컨테이너 아래서 돌아가는데 컨테이너는 동시성을 부분적으로 관리한다. 웹 요청이 들어올 때마다 웹 서버는 비동기식으로 서블릿을 실행한다. 원칙적으로 각 서블릿 스레드는 다른 서블릿 스레드와 무관하게 자신만의 세상에서 돌아간다. 서블릿 프로그래머는 동시성을 정확히 구현하도록 각별한 주의와 노력을 기울여야 한다. 그럼에도 서블릿 모델이 제공하는 구조적 이점은 아주 크다.

물론 구조적 개선만을 위해 동시성을 채택하는 것은 아니다. 응답 시간과 작업 처리량(throughput)개선을 위해서도 불가피할 수 있다. 예를 들어 한 번에 한 사용자를 1초동안 처리하는 시스템이 있다면 사용자가 늘어날 수록 응답 속도는 늦어진다. 많은 사용자를 동시에 처리하면 응답 시간을 높일 수 있다.

미신과 오해

동시성은 항상 성능을 높여준다.

동시성은 때로 성능을 높여준다. 대기 시간이 아주 길어 여러 스레드가 프로세서를 공유할 수 있거나, 여러 프로세서가 동시에 처리할 독립적인 계산이 충분히 많은 경우에만.

동시성을 구현해도 설계는 변하지 않는다.

다르다. 일반적으로 무엇언제를 분리하면 시스템 구조가 크게 달라진다.

웹 또는 EJB컨테이너를 사용하면 동시성을 이해할 필요가 없다.

어떻게 동작하는지, 동시 수정이나 데드락 등과 같은 문제를 피할 수 있는지 알아야한다.

동시성은 다소 부하를 유발한다.

옳은 명제.

동시성은 복잡하다.

옳은 명제.

일반적으로 동시성 버그는 재현하기 어렵다.

옳은 명제. 그래서 진짜 결함으로 간주되지 않고 일회성 문제로 여겨 무시하기 쉽다.

동시성을 구현하려면 흔히 근본적인 설계 전략을 재고해야 한다.

옳은 명제.

읽고 나서

PintOS에서 멀티쓰레드와 관련된 공부를 했었다. 그때는 운영체제의 관점에서 프로세서가 어떻게 순차적으로 일을 처리하는 지와 관련된 이야기였다면, 이번에는 코드의 관점이다. 우선 여기 장에선 책에 나온대로 동시성이 무엇인지 파악하는 단계이니 이해하는데 충실해야겠다.