용어 , 개념

Ada·2023년 8월 21일

Akka

목록 보기
1/32

동시성 vs 병렬성

동시성은 동시에 실행되지 않더라도 같은 시간에 진행되고 있음을 말합니다.
병렬 처리는 실행 시작이 정말로 동시적일 수 있 때 발생합니다.

Deadlock, Starvation, Live-Lock

교착 상태란 공유 자원에 대한 요구가 엉켜서 자원 관리를 잘못하여 프로세스나 스레드가 자원의 락을 획득하기 위해 무한 대기 하는 것을 말합니다.

기아 상태는 스레드들에게 우선 순위를 부여하여 공유 자원에 접근할 때, 우선순위가 낮은 스레드가 소외되어 아무일도 하지 못하는 상태를 말합니다.

데드락은 공유 자원에 대한 요구가 엉켜서 모든 프로세스가 락을 획득하기 위해 기다리고 있는 것이지만 기아상태는 우선순위가 낮은 스레드가 공유 자원에 접근하기 위해 대기하고 있는데 자꾸 우선순위가 높은 스레드가 접근을 해서 자꾸 밀리게 되어 아무런 처리를 못하게 됩니다.

라이브락은 데드락과 비슷한 결과를 가져오지만 다른 과정을 통해 발생하는 문제입니다. 데드락은 공유 자원의 락을 획득하기 위해 모든 스레드가 무한 대기하기 때문에 발생하는 문제라면 라이브락은 스레드들이 동시에 실행되면서 락의 해제와 획득을 반복적으로 하면서 정상적으로 동작하는 것처럼 보이지만 사실상 아무것도 못하고 무한 동작중인 상황을 말합니다.

Actor System

액터는 상태와 동작을 캡슐화 하는 객체이며 수신자의 메일박스에 있는 메시지를 교환하여 독점적으로 통신합니다.
어떤 의미에서 액터는 객체 지향 프로그래밍의 가장 엄격한 형태입니다.

계층구조

액터 시스템에서는 작업이 충분히 작아질 때까지 분할되고 위임된다는 것입니다.
그렇게 함으로써 작업 자체가 명확하게 구조화 되며 결과 액터가 어떤 메시지를 처리해야 하는지, 일반적으로 어떻게 반응해야 하는지, 실패를 어떻게 처리해야 하는지에 대해 추론할 수 있습니다.

액터 특징

액터는 State , Behavior , Mailbox , Child Actors 및 Supervisor Strategy 의 컨테이너입니다 . 이 모든 것은 Actor Reference 뒤에 캡슐화됩니다 .

한 가지 주목할 만한 측면은 액터가 명시적인 수명 주기를 가지고 있다는 것입니다. 액터는 더 이상 참조되지 않을 때 자동으로 소멸되지 않습니다.

액터 모델의 이점을 활용하려면 액터 객체를 외부로부터 보호해야 합니다. 따라서 액터는 제한 없이 자유롭게 전달할 수 있는 객체인 액터 참조를 사용하여 외부로 표현됩니다.

이렇게 내부 및 외부 객체로 분할하면 다른 곳에서 참조를 업데이트할 필요 없이 액터를 다시 시작하고, 실제 액터 객체를 원격 호스트에 배치하고, 액터가 실행 중인 위치와 관계없이 액터에 메시지를 보내는 등 원하는 모든 작업에 대한 투명성이 가능합니다.

그러나 가장 중요한 측면은 액터가 이 정보를 공개하지 않는 한 액터 내부를 들여다보고 외부에서 상태를 파악하는 것이 불가능하다는 것입니다.

액터는 각각 고유한, 가벼운 스레드를 가지고 있으며 이 스레드는 시스템의 나머지 부분으로부터 완전히 보호됩니다.
그렇기 때문에 액터 코드를 작성할 땐 동시성에 대해 전혀 걱정하지 않아도 됩니다.

동작(Behavior)

동작은 해당 시점에 메시지에 대한 반응으로 취할 조치를 정의하는 기능을 의미합니다.
이 동작은 시간이 지남에 따라 변경될 수 있습니다.

메시지는 액터 참조로 전송될 수 있습니다.

액터 참조는 매개변수화 되며 지정된 유형의 메시지만 보낼 수 있습니다.
액터 참조와 해당 유형 매개변수 간의 연결은 액터 참조가 생성될 때 이루어져야 합니다.
이를 위해 각 동작은 처리할 수 있는 메시지 유형으로 매개 변수화됩니다.
후속 동작은 이전 동작과 동일한 유형의 메시지를 처리해야 합니다. 이것은 이 액터를 참조하는 액터 참조를 무효화하지 않기 위해 필요합니다.

메일 박스

액터의 목적은 메시지 처리이며 발신자와 수신자를 연결하는 부분이 액터의 메일 박스 입니다.

각 액터는 발신자가 메시지를 대기시키는 하나의 메일 박스를 갖고 있으며 대기 순서는 전송 작업의 시간 순서대로 입니다.

즉, 여러 액터에서 보낸 메시지가 스레드 간 액터를 분산시키는 작업으로 인해 런타입에 정의된 순서를 갖기 못할 수 있습니다.
반면에 동일한 액터에서 동일한 대상으로 여러 메시지를 보내면 동일한 순서로 메시지가 대기열에 추가됩니다.

메일 박스 구현에는 여러가지 방법이 있지만 기본값은 선입선출(FIFO)입니다.

일부 메시지를 다른 메시지보다 빠른 우선순위를 갖게 하려면 메일 박스의 지정된 위치의 큐에 추가됩니다.

Akka가 다른 액터 모델 구현과 다른 중요한 기능은
현재 동작이 항상 다음 대기열에서 제거된 메시지를 처리해야 한다는 것입니다.

참고
https://cheetile.tistory.com/entry/OS-%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%AC%B8%EC%A0%9C-Race-Condition-Deadlock-Starvation-Livelock

https://doc.akka.io/docs/akka/current/actors.html#

profile
백엔드 프로그래머

0개의 댓글