멀티쓰레드 프로그램의 성능 평가 기준

02 January 2015

안정성 (safety)

안전성이란 객체를 망가뜨리지 않는 것. 올바른 프로그램의 필수 조건.

  • 객체가 망가진다는 것은, 객체가 설계자의 의도와는 다른 상태가 되는 것을 의미한다. 예를 들어, 객체의 필드가 예상 외의 값을 취하는 것 (마이너스 통장이 아닌…ㅋㅋ 계좌의 잔고가 마이너스가 된다던가.)
  • 여러개의 쓰레드가 이용해도 안정성이 유지되는 클래스를 thread-safety 클래스라고 한다.
  • 자바 클래스 라이브러리에는 thread-safety한 클래스와 그렇지 않는 클래스가 있으므로, 멀티쓰레드 프로그램에서 라이브러리를 사용할 때에는 API 레퍼런스를 확인하여 주의해야 한다. 예를 들어, java,util.Vector 클래스는 thread-safety 하고, java.util.ArrayList는 그렇지 못하다.

생존성/활동성 (liveness)

필요한 처리가 이뤄질 것 / 필수조건

  • 생존성(활동성)이란 필요한 처리가 언젠가는 반드시 이뤄지는 것. 올바른 프로그램의 필수 조건.
  • 안전성이 확보되었더라도 생존성이 확보되지 않은 프로그램은 아무런 소용이 없음. (프로그램이 실행 도중에 멈춰버린다면…? 멈췄기 때문에 객체가 망가지지는 않겠지만, 멈췄기 때문에 더 이상 실행이 되지 않음.)
  • 안전성과 생존성은 서로 trade-off 관계에 있음. 예를 들어, 안전성만 중시하다가 생존성을 잃을 수 있음. 전형적인 사례가 데드락.

재사용성 (reusability)

클래스를 재사용 할 수 있을 것 / 필수 조건은 아니지만, 프로그램의 품질을 높이는데 중요한 조건.

  • 멀티쓰레드 프로그램에서는 쓰레드 상호 배타 제어의 구조나 방침을 클래스 안에 잘 숨기면 재사용성이 높은 프로그램이 된다.
  • java.util.concurrent 패키지에서는 멀티쓰레드 프로그래밍에 편리한 재사용성이 높은 클래스를 제공하고 있다.

성능 (performance)

고속/대량으로 처리할 수 있을 것 / 필수 조건은 아니지만, 프로그램의 품질을 높이는데 중요한 조건.

  • 성능의 지표가 되는 요소들은 아래과 같이 여러가지가 있음.
  • 이들 요소가 서로 trade-off 관계에 있을 수 있음.

그 밖에

  • throughput : 단위 시간당 처리 수. 단위 시간당 많은 처리가 가능하면 작업 처리량이 높은 것임.
  • responsiveness : 요청을 한 뒤 반응이 나타날 때까지 걸리는 시간이 짧을 수록 응답성이 좋은 것임.
  • latency : 요청을 한 뒤 반응이 나타날 때까지 걸리는 시간. 응답성이 높다 = 대기시간이 짧다.
  • capacity : 동시에 처리할 수 있는 수. 예를 들어, 서버가 동시에 처리할 수 있는 클라이언트 수나 동시에 처리할 수 있는 파일의 수
  • efficiency, scalability, degradation 등등등 …

References: “Java 언어로 배우는 디자인 패턴 입문 - 멀티쓰레드편” Introduction 02

Parameter / Argument 차이 멀티쓰레드 프로그램 구현 방법 (Thread, Runnable) / ThreadFactory