Skip to content

Latest commit

 

History

History
110 lines (61 loc) · 3.57 KB

README.md

File metadata and controls

110 lines (61 loc) · 3.57 KB

Ch13 - 동시성

객체는 처리의 추상화다. 스레드는 일정의 추상화다.

동시성

결합을 없애는 전략. 무엇과 언제를 분리한다.

응답 시간과 작업 처리량 개선

(참고. EJB - 분산 애플리케이션을 지원하는 컴포넌트 기반의 객체)

동시성 방어 원칙

단일 책임 원칙

메서드/클래스/컴포넌트를 변경할 이유가 하나여야 한다.

→ 동시성과 관련 코드는 다른 코드와 분리해야 한다.

따름 정리: 자료 범위를 제한하라

임계영역을 synchronized 키워드로 보호하라.

임계영역의 수를 줄여야 한다.

→ 자료를 캡슐화하고 공유 자료를 최대한 줄여라

따름 정리: 자료 사본을 사용하라

객체를 읽기 전용으로 사용할 수 있음

따름 정리: 스레드는 가능한 독립적으로 구현하라

다른 스레드와 자료를 공유하지 않는다.

→ 독자적인 스레드로, 가능하면 다른 프로세서에서, 돌려도 괜찮도록 자료를 독립적인 단위로 분할하라

라이브러리 이해

언어가 제공하는 클래스 검토. (lock, semaphore..)

실행모델을 이해

한정된 자원 - 다중 스레드 환경에서 사용하는 자원

상호 배제 - 한 번에 한 스레드만 공유 자료나 공유 자원을 사용할 수 있는 경우

기아 - 스레드가 오랫동안 혹은 영원히 자원을 기다림

데드락 - 여러 스레드가 서로가 끝나기를 기다림

라이브락 - 락을 거는 단게에서 각 스레드가 서로를 방해.

  • 생산자-소비자 생산자 스레드 → 정보를 버퍼 or 대기열에 넣음 소비자 스레드 → 대기열에서 정보를 가져와 사용
  • 읽기-쓰기 읽기 스레드 → 공유 자원 사용 쓰기 스레드 → 공유 자원 갱신 처리율 문제 처리율을 강조하면 기아 현상이 생길 수 있음 갱신을 허용하면 처리율에 영향을 미침
  • 식사하는 철학자들 (Dining Philosophers) 양손 포크를 쥐었을 때만 식사를 할 수 있음.

→ 각 상황에 대한 알고리즘과 각 해법을 이해해야 함.

동기화하는 메서드 사이에 존재하는 의존성을 이해

권장: 공유 객체 하나에는 메서드 하나만 사용

여러 메서드가 필요한 경우

→ 클라이언트 혹은 서버에서 잠금,

→ 연결 서버를 생성(잠금을 수행하는 중간 단계를 생성)

동기화하는 부분을 작게 만들기

임계영역을 줄이면서도 동기화하는 부분을 작게 만들어야 한다.

올바른 종료 코드는 구현하기 어렵다

종료 코드를 개발 초기부터 고민하고 동작하게 초기부터 구현하라.

이미 나온 알고리즘을 검토하라

스레드 코드 테스트하기

문제를 노출하는 테스트 케이스 작성

프로그램 설정과 시스템 설정과 부하를 바꿔가며 자주 돌려라.

테스트가 실패하면 원인을 추적하라

[구체적 지침]

  • 말이 안 되는 실패는 잠정적인 스레드 문제로 취급

  • 다중 스레드를 고려하지 않은 순차 코드부터 제대로 돌게 만들자

  • 다중 스레드를 쓰는 코드 부분을 다양한 환경에 쉽게 끼워 넣을 수 있도록 스레드 코드를 구현

  • 다중 스레드를 쓰는 코드 부분을 상황에 맞춰 조정할 수 있게 작성 프로세서 수보다 많은 스레드 돌려보기

  • 다른 플랫폼에서 돌려보기

  • 코드에 보조 코드를 넣어 돌리기. 강제로 실패를 일으키게 하기