카테고리 보관물: Lectures

CAP 정리(Theorem)

CAP 정리(Theorem)는 분산 시스템(Distributed System)이 가질 수 있는 3가지의 특성(CAP)이다. Wikipedia에 정리된 CAP 정리의 CAP에 대한 정의는 다음과 같다.

Consistency : all nodes see the same data at the same time
Availability : node failures do not prevent survivors from continuing to operate
Partition Tolerance : the system continues to operate despite arbitrary message loss

위 CAP의 정의에서, C, A는 알겠는데, 부분 결함허용(Partition Tolerance)는 생소하다. 부분 결함허용(Partition Tolerance)에 대해서는, http://blog.cloudera.com/blog/2010/04/cap-confusion-problems-with-partition-tolerance/에서 자세히 설명하고 있다.

이 내용은 네트워크 문제등으로, 서비스중인 노드가 분리(partition)될 수 있고, 특정 노드가 분리됨에서 불고하고, 노드가 제공하는 기능은 정상 동작(tolerance)해야 한다는 것이다. 분산 시스템은 위 CAP 정리의 3가지 특성을 다 만족시킬 수 없으므로, 한가지 특성은 포기해야 한다고 하는 Brewer’s CAP Theorem는 꼭 읽어보면 좋겠다. 그리고, 개별 특성에 대해서도 알아둘 필요가 있다.

* 레퍼런스
Brewer’s CAP Theorem

스레드-안전(Thread-safe)과 재진입가능(Reentrant)의 차이

다중 스레드 프로그래밍을 하다 보면, 스레드-안전(Thread-safe)과 재진입가능(Reentrant)이란 용어를 보게 된다. 처음에는 이 두 용어에 대한 개념이 명확하지 않게 느껴지지만, 명확한 차이가 있다. 우선 이 두 개념에 대한 정의를 살펴보자.

1. 스레드-안전(Thread-safe) 정의
스레드 안전은 다중 스레드가 동시에 같은 로직을 실행하는 경우에도 결과가 정확함을 보장한다는 것이다. 따라서 여러 스레드가 클래스에 접근할 때, 실행 환경이 해당 스레드들의 실행을 어떻게 스케줄 하든 어디에 끼워 넣든, 호출하는 쪽에서 추가적인 동기화나 다른 조율 없이도 정확하게 동작하면 해당 클래스는 스레드 안전하다고 말한다.

2. 재진입가능(Reentrant) 정의
재진입가능은 다중 스레드가 동시에 같은 로직을 실행할 수 있도록 구현해서 스레드-안전을 확보하는 형태이다.

위에서 정의한 내용을 토대로, 재진입가능한 로직은 스레드-안전을 확보해서, 스레드-안전을 확보하는 하나의 수단이 된다. 하지만 스레드-안전을 확보하는 수단은 재진입가능한 로직외에도 여러 동기화 기법이 있다.

자바에서 스레드-안전한 로직을 구현하는 방법은 다음과 같다.
– Atomic 시리즈의 클래스 사용
– 뮤텍스 사용
– 세마포어 사용
– 아래의 재진입가능한 로직을 구현한 형태 사용

자바에서 재진입가능한 로직을 구현한 형태는 다음과 같다.
– 암시적인 락 : 기본적으로 자바 객체는 모니터 락을 가지고 있고, 이것으로 재진입가능한 로직의 형태로 사용할 수 있다.
– ReenterantLock과 ReentrantReadWriteLock의 사용

* Reference
– 자바 병렬 프로그래밍

UML – Aggregation

aggregation은 연관관계(association)의 하위 분류로, 집합 관계를 표시한다. 연관관계를 가지는 클래스 객체와 생명 주기가 다른 경우가 aggregation 관계이다.

1. 클래스 다이어그램

2. 코드

2.1 I.java
public class I {
  private ArrayList array;
  public I() {
  }

  public void setArray(ArrayList array) {
    this.array = array;
  }
}
2.2 J.java
public class J {
  private J j;
}

UML – Composition

컴포지션(composition)은 association의 하위 분류로, 집합 관계를 표시한다. 연관 관계를 가지는 클래스 객체와 생명 주기가 같은 경우가 컴포지션 관계이다.

1. 클래스 다이어그램

2. 코드

2.1 G.java
public class G {
private ArrayList< array;
    public G() {
        array = new ArrayList();
    }
}
2.2 H.java
public class H {
  private G g;
}