맨위로가기

메시지 전달

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

메시지 전달은 컴퓨터 프로그램 간의 정보 교환 방식으로, 액터 모델 및 파이 계산법과 같은 수학적 모델을 기반으로 한다. 객체 지향 프로그래밍에서 객체 간 제어 및 데이터 교환의 핵심이며, 앨런 케이는 객체보다 메시지 전달의 중요성을 강조했다. 메시지 전달은 동기식과 비동기식 방식으로 구분되며, 분산 객체 시스템에서 널리 사용된다. 운영 체제, 분산 시스템, 고성능 컴퓨팅, 웹 서비스 등 다양한 분야에서 활용되며, 함수 호출 방식과 비교하여 메모리 사용량, 통신 속도, 지역성에서 차이를 보인다.

더 읽어볼만한 페이지

  • 분산 컴퓨팅 구조 - 슈퍼컴퓨터
    슈퍼컴퓨터는 일반 컴퓨터보다 훨씬 높은 성능을 가진 컴퓨터로, 복잡한 계산과 시뮬레이션을 수행하며, 프로세서, 메모리, 스토리지, 네트워크 등으로 구성되어 병렬 처리를 통해 높은 성능을 구현하고, 군사, 기상 예측, 과학 기술 분야, 인공지능 등 다양한 분야에서 활용되고 있다.
  • 분산 컴퓨팅 구조 - 맵리듀스
    맵리듀스는 대용량 데이터 처리를 위해 구글에서 개발한 프로그래밍 모델이자 프레임워크로, Map과 Reduce 함수를 사용하여 데이터를 병렬 처리하며 하둡 등의 오픈 소스 구현을 통해 널리 쓰인다.
  • 프로세스 간 통신 - Ajax
    Ajax는 웹 페이지 전체를 새로고침하지 않고 비동기적으로 서버와 통신하여 웹 애플리케이션의 일부를 업데이트하는 웹 개발 기술로, XMLHttpRequest 객체의 등장으로 가능해졌으며 HTML, CSS, DOM, JavaScript, JSON 등의 기술을 통합하여 동적인 사용자 인터페이스를 구현한다.
  • 프로세스 간 통신 - D-Bus
    D-Bus는 2002년에 시작된 프로세스 간 통신 시스템으로, 시스템 버스와 세션 버스를 통해 정보 공유, 모듈성, 권한 격리를 제공하며, 일대일 요청-응답 및 발행/구독 통신 방식을 지원한다.
메시지 전달
메시지 전달
개요
유형액터 모델
동시성
분산 컴퓨팅
소켓
메모리 공유
세부 사항
설명메시지 전달은 프로그램이 객체나 프로세스에 직접 함수를 호출하거나 공유 메모리에 접근하는 대신 메시지를 보내 객체나 프로세스와 통신하는 통신 형식이다.
특성느슨한 결합
모듈성
명시적 통신
관련 개념
관련 개념동시성
분산 시스템
프로세스 간 통신
액터 모델
메시지 큐
메시지 (컴퓨터)
기본 정보
정의컴퓨터 시스템 내에서 사용자에게 정보를 전달하는 수단
목적사용자에게 오류, 경고, 진행 상황 등 다양한 정보를 알림
유형오류 메시지
경고 메시지
정보 메시지
진행 메시지
특징
내용간결하고 명확하며 이해하기 쉬워야 함
시기적절한 시기에 제공되어야 함
형식일관성 있는 형식으로 제공되어야 함
메시지 전달 (컴퓨터 과학)
개요
정의병렬 프로그래밍에서 프로세스 간 통신을 위한 방법
방식프로세스 간에 메시지를 교환하여 데이터와 신호를 전달
장점메모리 공유 없이 통신 가능
분산 시스템에 적합
동기화 문제 감소
단점메시지 전달 오버헤드 발생
복잡한 메시지 구조 필요
유형
동기 메시지 전달메시지 전송 후 응답을 기다림
비동기 메시지 전달메시지 전송 후 응답을 기다리지 않음
활용 예시
분산 시스템프로세스 간 통신
병렬 프로그래밍데이터 교환 및 동기화
액터 모델액터 간 메시지 전달

2. 역사적 배경

메시지 전달은 컴퓨터에서 특정 동작(예: 프로그램 실행)을 일으키는 기술이다. 전통적인 방식에서는 프로그램 이름을 직접 호출하여 실행했지만, 메시지 전달 방식에서는 객체 모델을 사용하여 일반적인 기능과 구체적인 구현을 분리한다. 즉, 호출하는 프로그램은 메시지를 보내고, 객체가 그 메시지에 맞는 적절한 코드를 선택하여 실행하는 방식이다.[1] 이러한 방식을 사용하는 이유는 크게 캡슐화분산 두 가지로 나눌 수 있다.

2. 1. 초기 모델

메시지 전달은 컴퓨터에서 동작을 호출(예: 프로그램 실행)하는 기술이다. 기존에는 프로그램을 직접 호출했지만, 메시지 전달은 객체 모델을 사용하여 기능을 구현과 분리한다. 호출 프로그램은 메시지를 보내고, 객체가 적절한 코드를 선택하여 실행한다. 이러한 중간 계층을 사용하는 이유는 캡슐화와 분산으로 나뉜다.

캡슐화는 소프트웨어 객체가 서비스 구현 방식을 모르거나 신경 쓰지 않고 다른 객체의 서비스를 호출할 수 있게 한다. 캡슐화는 코드 로직을 줄이고 시스템 유지 관리를 쉽게 만든다. 예를 들어, 호출할 서브루틴이나 함수를 결정하는 IF-THEN 문 대신, 개발자는 객체에 메시지를 보내고 객체가 유형에 따라 적절한 코드를 선택하게 한다.[1]

컴퓨터 그래픽 분야에서 초기 예시를 찾을 수 있다. 닫힌 도형의 면적 계산 공식은 도형의 종류(삼각형, 사각형, 타원, 원)에 따라 다르다. 전통적인 프로그래밍에서는 도형 종류를 테스트하고 적절한 코드를 호출하는 긴 IF-THEN 문이 필요했다. 객체 지향 방식에서는 `Shape` 클래스를 정의하고 `Rectangle`, `Ellipse` 등의 하위 클래스를 정의한다. (각각 `Square`, `Circle` 하위 클래스를 가질 수 있다.) 모든 `Shape`에 면적 계산 메시지를 보내면, 각 객체는 해당 종류에 맞는 공식을 사용하여 하위 클래스의 메서드를 호출한다.[1]

분산 메시지 전달은 서로 다른 위치와 시간에 다른 컴퓨터에서 실행되는 하위 시스템으로 구성된 시스템을 구축하기 위한 공통 서비스를 제공한다. 분산 객체가 메시지를 보내면 메시징 계층은 다음과 같은 문제를 처리한다.[2]

  • 다른 운영 체제 및 프로그래밍 언어를 사용하는 프로세스를 찾는다.
  • 메시지를 처리할 객체가 실행 중이지 않으면 메시지를 큐에 저장하고 나중에 호출한다. 필요한 경우 결과를 저장한다.
  • 원자성, 일관성, 격리성, 내구성 (ACID) 데이터 테스트를 제어한다.[2]


메시지 전달의 주요 수학적 모델은 액터 모델과 파이 계산법이다.[6][7] 수학적으로 메시지는 객체에게 제어를 전달하는 유일한 수단이다. 객체가 메시지에 응답하면 해당 메시지에 대한 메서드를 갖는다.

앨런 케이는 객체 지향 프로그래밍(OOP)에서 메시지 전달이 객체 자체보다 중요하며, 객체는 종종 과대평가된다고 주장했다. 라이브 분산 객체 프로그래밍 모델은 이러한 관찰을 기반으로 한다. 이는 분산 데이터 흐름 개념을 사용하여 메시지 패턴으로 복잡한 분산 시스템의 동작을 특징짓는다.[8]

2. 2. 액터 모델과 프로세스 계산

메시지 전달의 주요 수학적 모델은 액터 모델과 파이 계산법이다.[6][7] 수학적으로 메시지는 객체에게 제어를 전달하는 유일한 수단이며, 객체가 메시지에 응답하는 경우 해당 메시지에 대한 메서드를 가진다.

병렬 컴퓨팅의 중요한 이론적 기초인 액터 모델과 프로세스 계산은 메시지 전달을 기반으로 한다. 메시지 전달을 사용한 병렬 시스템은 언어 내 기능으로 구현되거나, 언어로부터 일련의 라이브러리 호출로 실현될 수 있다.

2. 3. 객체 지향 프로그래밍의 영향

객체 지향 프로그래밍에서 메시지 전달은 객체가 서로 상호작용하는 방식이다. 호출하는 프로그램은 메시지를 보내고, 객체는 그 메시지에 맞는 코드를 선택하여 실행한다. 이러한 방식은 캡슐화와 분산 처리를 가능하게 한다.[1]

캡슐화는 객체가 다른 객체의 내부 구현을 알 필요 없이 서비스를 요청할 수 있게 해준다. 예를 들어, 도형의 면적을 계산할 때, 개발자는 객체에 면적 계산 메시지를 보내기만 하면 된다. 그러면 객체는 자신의 종류(사각형, 타원 등)에 맞는 메서드를 호출하여 면적을 계산한다.[1]

분산 메시지 전달은 서로 다른 위치와 시간에 실행되는 시스템을 구축하는 데 유용하다. 메시징 계층은 운영 체제 및 프로그래밍 언어 차이, 메시지 큐잉, ACID 등의 트랜잭션 요구 사항을 처리한다.[2]

객체 지향에서 메시지는 객체에 제어를 넘기는 것을 의미한다. 객체가 메시지에 응답하면 해당 메시지에 대한 메서드를 가지고 있는 것이다. 순수한 객체 지향에서는 메시지 전달이 동적 디스패치 방식으로 작동한다. 같은 객체에 같은 메시지를 두 번 보내면, 보통 그 메서드가 두 번 호출된다. 객체는 자신의 메서드에서 다른 객체에 메시지를 보낼 수 있으며, 궁극적 지연 바인딩(extreme late binding)이 가능하다.

앨런 케이는 객체 지향 프로그래밍에서 객체보다 메시지가 더 중요하다고 강조했다.[10] 라이브 분산 객체 프로그래밍 모델은 이러한 관점을 참고하여 만들어졌다.

일부 언어에서는 객체가 메시지를 처리할 메서드가 없는 경우, 다른 객체에게 메서드 호출을 위임할 수 있다.

1977년, 칼 휴잇은 계산 제어 구조가 "메시지 패싱의 패턴"으로 볼 수 있다고 주장했다.

3. 주요 특징

메시지 전달은 컴퓨터에서 특정 동작(예: 프로그램 실행)을 요청하는 방식이다. 기존에는 프로그램 이름을 직접 호출했지만, 메시지 전달 방식에서는 객체 모델을 사용하여 요청을 보낸다. 그러면 객체가 그 요청에 맞는 코드를 스스로 선택하여 실행한다. 이러한 방식은 캡슐화분산이라는 두 가지 큰 장점을 가진다.
캡슐화 덕분에 각 객체가 어떻게 동작하는지 다른 객체가 알 필요 없이 서로에게 요청을 보낼 수 있다. 예를 들어, 도형 면적을 계산할 때, 기존 방식에서는 도형 종류(사각형, 원 등)에 따라 다른 계산식을 사용해야 했다. 하지만 객체 지향 프로그래밍에서는 각 도형 객체에 "면적 계산"이라는 메시지만 보내면, 각 객체가 스스로 올바른 계산식을 선택해 결과를 알려준다.[1]
분산 메시지 전달은 서로 다른 위치, 심지어 다른 컴퓨터에서 실행되는 프로그램들이 서로 통신할 수 있게 해준다. 이때 메시징 계층은 다음과 같은 복잡한 문제들을 처리한다.


  • 서로 다른 운영 체제나 프로그래밍 언어를 사용하는 프로그램 간의 통신
  • 메시지를 받을 프로그램이 당장 실행 중이 아니더라도 메시지를 보관했다가 나중에 전달
  • 데이터의 원자성, 일관성, 격리성, 내구성 보장 (ACID)[2]


메시지 전달은 보내는 쪽(송신자)이 받는 쪽(수신자)에게 정보를 전달하는 방식이다. 알림, 원격 프로시저 호출(RMI), 신호, 데이터 패킷 등이 그 예시이다. 메시지 전달 시스템을 설계할 때는 다음과 같은 사항들을 고려해야 한다.

  • 메시지가 확실하게 전달되어야 하는가?
  • 메시지가 보내진 순서대로 도착해야 하는가?
  • 메시지를 한 번에 한 곳에 보내는가, 여러 곳에 보내는가? (멀티캐스트 또는 브로드캐스트)
  • 메시지를 보내는 쪽과 받는 쪽이 동시에 작업을 처리해야 하는가? (동기)


액터 모델, 프로세스 계산과 같은 병렬 컴퓨팅 이론은 메시지 전달을 기반으로 한다. 메시지 전달을 사용하는 병렬 시스템은 프로그래밍 언어 자체에서 지원하기도 하고, 별도의 라이브러리를 통해 구현되기도 한다.

마이크로커널운영 체제나 고성능 컴퓨팅에서의 MPI는 메시지 전달을 활용하는 예시이다. 그래프 모델상의 베이즈 추정 등에도 메시지 전달 개념이 사용된다.

메시지 전달은 호출 규약과 비교할 수 있다. 호출 규약에서는 함수를 호출할 때 필요한 정보를 레지스터나 매개변수 목록을 통해 전달한다. 메시지 전달 방식은 메모리 사용량, 통신 속도, 지역성에서 차이를 보인다. 메시지 전달은 모든 정보를 메시지 안에 복사하므로 더 많은 메모리가 필요하지만, 호출 규약은 주소만 전달하면 되므로 더 빠를 수 있다. 단, 분산 시스템에서는 메시지 전달 방식이 필수적이다.

3. 1. 동기식 vs 비동기식 메시지 전달

동기식 메시지 전달은 동시에 실행되는 객체들 사이에서 발생하며, 자바스몰토크와 같은 객체 지향 프로그래밍 언어에서 사용된다.[1] 이는 동기 함수 호출과 유사하게, 보내는 프로세스가 받는 프로세스가 완료될 때까지 기다리는 방식이다.[3] 이러한 방식은 일부 애플리케이션에서는 비효율적일 수 있는데, 크고 분산된 시스템에서 특정 하위 시스템이 중단된 경우에도 전체 시스템이 작동해야 하기 때문이다.

예를 들어, 100대의 데스크톱 컴퓨터가 동기식 메시지 전달만을 사용하여 이메일을 주고받는 사무실을 상상해 보자. 한 직원이 컴퓨터를 끄면, 다른 99대의 컴퓨터는 해당 직원이 컴퓨터를 다시 켜서 이메일을 처리할 때까지 멈출 수 있다.

비동기식 메시지 전달은 요청 객체가 메시지를 보낼 때 수신 객체가 다운되거나 사용 중일 수 있는 상황을 허용한다. 이는 함수 호출이 완료될 때까지 기다리지 않고 즉시 반환되는 함수 호출과 유사하다. 메시지는 수신 프로세스가 요청할 때까지 큐에 저장되고, 수신 프로세스는 메시지를 처리한 후 결과를 큐로 보내 원래 프로세스(또는 지정된 다음 프로세스)가 가져갈 수 있도록 한다.[3]

비동기 메시징은 동시 실행되지 않을 수 있는 시스템에 대한 데이터 저장 및 재전송 기능이 필요하며, 이는 일반적으로 미들웨어(메시지 지향 미들웨어)에서 처리된다.

비동기 통신에 필요한 버퍼가 가득 차면 문제가 발생할 수 있다. 보낸 사람을 차단할지 아니면 향후 메시지를 삭제할지 결정해야 하는데, 보낸 사람을 차단하면 교착 상태가 발생할 수 있고, 메시지를 삭제하면 통신의 신뢰성이 보장되지 않는다.

동기 통신은 동기화기를 사용하여 비동기 통신 위에 구축할 수 있다. 예를 들어, α-동기화기는 송신자가 항상 수신자로부터 승인 메시지를 기다리도록 보장하여 송신자가 승인이 수신된 후에만 다음 메시지를 보내도록 한다. 반면, 비동기 통신도 동기 통신 위에 구축될 수 있는데, 현대적인 마이크로커널은 일반적으로 동기 메시징 기본 요소만 제공하고, 비동기 메시징은 헬퍼 스레드를 사용하여 구현할 수 있다.

3. 2. 분산 객체

분산 객체를 지원하는 시스템에는 에메랄드, ONC RPC, CORBA, 자바 RMI, DCOM, SOAP, .NET 리모팅, CTOS, QNX 뉴트리노 RTOS, OpenBinder, D-Bus 등이 있다.[4] 이들은 메시지 전달 추상화를 통해 메시지 전송 구현에 사용될 수 있는 기본 상태 변경을 숨기므로 "공유 없음" 시스템이라고도 불린다.

메시지 전달 시스템은 분산 객체 또는 로컬 객체를 사용한다. 분산 객체를 사용하는 경우 송신자와 수신자는 서로 다른 컴퓨터, 운영 체제, 프로그래밍 언어를 사용할 수 있다. 이때 버스 계층은 데이터를 한 시스템에서 다른 시스템으로 변환하고, 네트워크를 통해 데이터를 송수신하는 등의 세부 사항을 처리한다.[4] 원격 프로시저 호출(RPC) 프로토콜은 유닉스에서 초기 사례였다. 이러한 유형의 메시지 전달에서는 송신자나 수신자가 객체 지향 프로그래밍을 사용할 필요가 없으며, 절차적 언어 시스템은 래핑되어 메시지를 송수신할 수 있는 대규모 객체로 취급될 수 있다.[4]

4. 함수 호출과의 비교

메시지 전달은 컴퓨터에서 특정 동작(예: 프로그램 실행)을 일으키는 한 가지 방법이다. 일반적인 함수 호출 방식과 달리, 메시지 전달은 객체 모델을 사용하여 무엇을 할지(일반적인 기능)와 실제로 어떻게 할지(구체적인 구현)를 분리한다. 프로그램을 호출하는 쪽에서는 메시지를 보내고, 객체는 그 메시지에 맞는 코드를 스스로 선택하여 실행한다. 이렇게 중간 단계를 두는 이유는 크게 캡슐화분산 처리 때문이다.

캡슐화는 어떤 객체가 다른 객체에게 서비스를 요청할 때, 그 서비스가 실제로 어떻게 처리되는지 알 필요 없이 요청할 수 있어야 한다는 개념이다. 캡슐화 덕분에 코드의 양이 줄고, 시스템을 관리하기가 더 쉬워진다. 예를 들어, 어떤 서브루틴이나 함수를 호출할지 결정하기 위해 IF-THEN 문을 길게 쓰는 대신, 개발자는 그냥 객체에게 메시지를 보내면 된다. 그러면 객체는 자신의 종류에 맞는 코드를 알아서 선택한다.[1]

컴퓨터 그래픽 분야에서 이러한 방식이 초기에 사용된 예를 볼 수 있다. 그래픽 객체를 다루는 것은 꽤 복잡하다. 예를 들어, 닫힌 도형의 넓이를 계산하려면, 그 도형이 삼각형인지, 사각형인지, 타원인지, 원인지에 따라 다른 공식을 써야 한다. 기존 프로그래밍 방식에서는 도형의 종류를 확인하고, 거기에 맞는 코드를 실행하는 긴 IF-THEN 문이 필요했다. 하지만 객체 지향 방식에서는 `Shape`이라는 클래스를 만들고, `Rectangle` (사각형)이나 `Ellipse` (타원) 같은 하위 클래스를 정의한다. (그리고 `Rectangle`은 `Square`를, `Ellipse`는 `Circle`을 하위 클래스로 가질 수 있다.) 그런 다음, 각 `Shape` 객체에게 넓이를 계산하라는 메시지를 보내면, 각 객체는 자신의 종류에 맞는 공식을 사용하여 하위 클래스의 메서드를 호출한다.[1]

분산 메시지 전달은 서로 다른 위치, 다른 시간에, 심지어 다른 컴퓨터에서 실행되는 여러 하위 시스템으로 구성된 시스템을 만들 때 유용하다. 개발자는 메시징 계층을 통해 다음과 같은 복잡한 문제들을 쉽게 처리할 수 있다.[2]


  • 메시지를 보낸 곳과 다른 운영 체제나 프로그래밍 언어를 사용하는 프로세스를 찾는다.
  • 메시지를 처리할 객체가 지금 실행 중이 아니면, 메시지를 보관해 뒀다가 나중에 객체가 준비되면 실행한다. 필요한 경우, 결과를 저장해 뒀다가 보내는 쪽에서 받을 준비가 되면 전달한다.
  • 원자성, 일관성, 격리성, 내구성 (ACID) 같은 분산 트랜잭션의 다양한 요구 사항을 관리한다.[2]


메시지 전달은 호출 규약과 비교할 수 있다. 기존의 `Call` 방식에서는 보통 하나 이상의 레지스터나 매개변수 목록을 통해 "호출 대상"(callee)에게 인수를 전달한다.

메시지 전달과 함수 호출 방식은 메모리 사용량, 통신 속도, 지역성 측면에서 차이가 있다. 메시지 전달에서는 모든 인수를 메시지에 복사해야 하므로 추가 메모리가 필요하다. 반면, 함수 호출에서는 각 인수의 주소(4~8바이트)만 전달하면 되므로 추가 메모리가 거의 필요 없고, 레지스터를 사용하면 전송 시간도 0이다. 그러나 분산 시스템에서는 호출자의 주소가 원격에서는 의미가 없으므로 주소 전달 방식을 사용할 수 없다.[4]

4. 1. 오버헤드

분산 또는 비동기 메시지 전달은 프로시저 호출에 비해 추가적인 오버헤드가 있다. 메시지 전달에서 인수는 새 메시지로 복사되어야 한다.[4] 일부 인수는 수 메가바이트의 데이터를 포함할 수 있으며, 이 모든 데이터는 복사되어 수신 객체로 전송되어야 한다.

전통적인 프로시저 호출은 메모리 사용량, 전송 시간 및 지역성 측면에서 메시지 전달과 다르다. 인수는 일반적으로 추가 저장 공간이나 전송 시간이 필요하지 않은 범용 레지스터 또는 인수의 주소를 포함하는 매개변수 목록(몇 비트)으로 수신자에게 전달된다. 시스템은 별도의 주소 공간을 사용하므로 분산 시스템에서는 주소 전달이 불가능하다.

메시지 전달에서는 모든 인수가 새로운 메시지 안에 복사하기에 충분한 메모리를 추가로 필요로 한다. 이는 원본 인수의 크기에 관계없이 적용된다. 따라서 만약 인자 중 하나가 웹 페이지를 기술하는 10,000 옥텟의 HTML 문자열이라면, 수신 프로그램(로컬 프로그램이 아니라면)에 완전히 복사되어야 하고, 더 나아가 전송되어야 할 것이다.

반대로, call 방식의 경우, 각각의 인자에 대해 4~8바이트의 주소만 필요하다. 게다가 범용 레지스터의 경우 추가 저장 공간이 0이며, 전송 시간도 0이다. 물론 이는 분산 시스템에서는 불가능하다. 호출자(caller)의 주소 공간에 있는 (절대) 주소는 원격 프로그램에서 일반적으로 의미가 없기 때문이다. 단, 만약 호출 대상이 미리 호출자의 메모리의 정확한(적어도 일부) 복사본을 가지고 있다면, 상대 주소를 사용할 수 있을 것이다.

4. 2. 휘발성

메시지 처리기는 일반적으로 둘 이상의 송신자로부터 메시지를 처리한다.[5] 이는 해당 상태가 단일 송신자 또는 클라이언트 프로세스의 동작과 관련이 없는 이유로 변경될 수 있음을 의미한다. 이는 메서드가 호출되는 객체의 전형적인 동작과는 대조적이다. 후자는 메서드 호출 사이에 동일한 상태를 유지할 것으로 예상된다. 즉, 메시지 처리기는 휘발성 객체와 유사하게 동작한다.

5. 응용 분야

메시지 전달은 다양한 응용 소프트웨어 분야에서 활용된다.

운영 체제에서 메시지는 운영 체제가 관리하는 장치나 다른 프로세스, 스레드로부터의 입력을 응용 프로그램에 전달하기 위해 사용된다. 사용자가 화면의 특정 위치를 마우스로 클릭하면, 운영 체제는 이 정보를 메시지 형태로 해당 응용 프로그램에 전달하고, 응용 프로그램은 이 메시지를 받아 필요한 처리를 수행한다. 이러한 방식은 이벤트 드리븐 프로그래밍의 일종으로, 메시지 루프라는 구조를 통해 구현된다.

분산 시스템에서는 서로 다른 컴퓨터에서 실행되는 프로그램들이 메시지를 주고받으며 통신하며, 원격 프로시저 호출(RPC)이나 SOAP과 같은 기술이 여기에 해당한다. 이를 통해 서로 다른 운영 체제나 프로그래밍 언어를 사용하는 프로그램 간의 통신이 가능해진다.

병렬 컴퓨팅에서도 메시지 전달은 중요한 역할을 한다. 액터 모델이나 프로세스 계산과 같은 이론적 모델은 메시지 전달을 기반으로 하며, MPI와 같은 라이브러리를 통해 실제 시스템에 구현된다.

웹 서비스에서도 SOAP 등을 통해 메시지 전달 방식이 활용된다.

5. 1. 운영 체제

마이크로소프트 윈도우 등 운영 체제에서 메시지는 운영 체제에서 실행되는 응용 프로그램에 운영 체제가 관리하는 장치 또는 다른 프로세스나 스레드에서 입력을 전달하기 위해 전송되는 데이터 묶음이다. 메시지를 주고받는 것을 통지라고도 한다.

운영 체제는 메시지를 메시지 큐에 보관하고, 응용 프로그램은 메시지 큐에 보관된 메시지를 받아 그것을 기반으로 처리를 수행한다. 예를 들어 "화면 좌표 (10, 20) 위치를 마우스로 왼쪽 클릭"이라는 정보를 운영 체제가 감지한 경우, 운영 체제는 해당 정보를 메시지 큐에 보관한다. 응용 프로그램은 해당 메시지를 받아 대응하는 처리를 수행한다.

응용 프로그램은 항상 운영 체제로부터의 메시지를 대기하는 이벤트 드리븐 방식의 프로그램으로 되어 있으며, 이 일련의 프로그램 기구를 메시지 루프라고 한다. 메시지 큐를 정기적으로 감시·확인하는 폴링 방식으로 메시지 루프가 구현되기도 한다.

5. 2. 분산 시스템

메시지 전달 시스템은 분산 객체 또는 로컬 객체를 사용한다. 분산 객체를 사용하는 경우 송신자와 수신자는 서로 다른 컴퓨터에서 서로 다른 운영 체제를 사용하고, 서로 다른 프로그래밍 언어를 사용하는 등 다양한 환경에 있을 수 있다. 이 경우 버스 계층은 데이터를 한 시스템에서 다른 시스템으로 변환하고, 네트워크를 통해 데이터를 송수신하는 등의 세부 사항을 처리한다. 원격 프로시저 호출(RPC) 프로토콜은 유닉스에서 초기 사례였다. 이러한 유형의 메시지 전달에서는 송신자나 수신자가 객체 지향 프로그래밍을 사용할 필요가 없다. 절차적 언어 시스템은 래핑되어 메시지를 송수신할 수 있는 대규모 객체로 취급될 수 있다.[4]

분산 객체를 지원하는 시스템에는 에메랄드, ONC RPC, CORBA, 자바 RMI, DCOM, SOAP, .NET 리모팅, CTOS, QNX 뉴트리노 RTOS, OpenBinder, D-Bus 등이 있다. 분산 객체 시스템은 메시지 전달 추상화가 메시지 전송 구현에 사용될 수 있는 기본 상태 변경을 숨기기 때문에 "공유 없음" 시스템이라고도 불린다.

분산 또는 비동기 메시지 전달은 프로시저 호출에 비해 추가적인 오버헤드가 있다. 메시지 전달에서 인수는 새 메시지로 복사되어야 한다. 일부 인수는 수 메가바이트의 데이터를 포함할 수 있으며, 이 모든 데이터는 복사되어 수신 객체로 전송되어야 한다.

전통적인 프로시저 호출은 메모리 사용량, 전송 시간, 지역성 측면에서 메시지 전달과 다르다. 인수는 일반적으로 추가 저장 공간이나 전송 시간이 필요하지 않은 범용 레지스터 또는 인수의 주소를 포함하는 매개변수 목록(몇 비트)으로 수신자에게 전달된다. 시스템은 별도의 주소 공간을 사용하므로 분산 시스템에서는 주소 전달이 불가능하다.

웹 브라우저 및 웹 서버는 메시지 전달을 통해 통신하는 프로세스의 예이다. URL은 프로세스 내부를 노출하지 않고 리소스를 참조하는 예이다.

서브루틴 호출 또는 메서드 호출은 호출된 계산이 종료될 때까지 종료되지 않는다. 반대로, 비동기 메시지 전달은 요청 메시지가 전송된 후 상당한 시간이 지난 후에 응답이 도착할 수 있다.

일반적으로 메시지 처리기는 둘 이상의 송신자로부터 메시지를 처리한다.[5] 이는 해당 상태가 단일 송신자 또는 클라이언트 프로세스의 동작과 관련이 없는 이유로 변경될 수 있음을 의미한다. 이는 메서드가 호출되는 객체의 전형적인 동작과는 대조적이다. 후자는 메서드 호출 사이에 동일한 상태를 유지할 것으로 예상된다. 즉, 메시지 처리기는 휘발성 객체와 유사하게 동작한다.

메시지 전달은 하나 또는 많은 수신자(receiver|리시버영어)에게 송신자(sender|센더영어)가 데이터를 전달할 수 있는 통신 방법이다. 통보의 형태로 원격 메서드 호출(), 신호, 데이터 패킷 등이 있다. 메시지 전달 기구를 설계할 때, 다음과 같은 방침에서 설계 방침을 선택한다.

  • 개별 메시지의 송수신을 확실하게 수행할지 여부
  • 메시지가 송신된 순서대로 수신될 것을 보증할지 여부
  • 메시지 교환은 일대일, 일대다(멀티캐스트 또는 브로드캐스트), 다대일(클라이언트-서버 모델)인가
  • 통신의 동기가 필요한가


액터 모델, 프로세스 계산과 같은 병렬 컴퓨팅의 중요한 이론적 기초는 메시지 전달을 기반으로 한다. 메시지 전달을 사용한 병렬 시스템은 언어 내 기능으로 메시지 전달을 하는 경우와 언어로부터 일련의 라이브러리 호출로 실현하는 경우가 있다.

전자의 예로는 많은 분산 객체 시스템이 포함된다. 후자의 예로는 커널과 서버 블록 간에 메시지를 주고받는 마이크로커널운영 체제나, 고성능 컴퓨팅에서의 MPI가 있다. 메시지 전달 개념은 그래프 모델상의 베이즈 추정 등에서도 사용되고 있다.

ONC RPC, CORBA, Java RMI, DCOM, SOAP, .NET Remoting, WCF, CTOS, QNX Neutrino RTOS, OpenBinder|오픈바인더영어, D-Bus와 같은 원격 메서드 호출 또는 그와 유사한 것은 메시지 전달 시스템이다. 메시지 전달 시스템은 공유가 없는 시스템이라고 불린다. 왜냐하면 메시지 전달 방식의 시스템은 메시지라는 추상화를 통해 그 하위에 존재하는 상태 변화나 구현 등을 숨기기 때문이다.

메시지 전달 모델은 데이터를 단말(액터, 프로세스, 스레드 등)로 전송하는 통지 방식으로, 프로그래밍 언어에서 전형적으로 정의된다. 이러한 메시징은 SOAP에 의해 웹 서비스에서 사용되고 있다. 이 개념은 패킷보다 크고, 임의로 신뢰성, 내구성, 안전성, 트랜잭션을 추가한 것을 제외하면 높은 수준의 메시지 데이터그램과 유사하다. 메시지는 또한 일반적으로 같은 방향의 프로세스 간 통신에 사용된다. 일반적으로 사용되는 다른 기술은 스트림 또는 파이프로, 이러한 데이터는 초보적인 데이터 항목의 일련으로 전송된다(가상 회선의 고등 수준에서는).

5. 3. 고성능 컴퓨팅

메시지 전달을 사용한 병렬 시스템은 언어 내 기능으로 메시지 전달을 하는 경우와 언어로부터 일련의 라이브러리 호출로 실현하는 경우가 있다. 후자의 예로는 고성능 컴퓨팅에서의 Message Passing Interface가 있다.[1]

5. 4. 웹 서비스

메시지 전달 모델은 데이터를 단말(액터, 프로세스, 스레드 등)로 전송하는 통지 방식이며, 프로그래밍 언어에서 전형적으로 정의된다. 이러한 메시징은 SOAP에 의해 웹 서비스에서 사용되고 있다.[2] 이 방식은 패킷보다 크고, 임의로 신뢰성, 내구성, 안전성, 트랜잭션을 추가한 것을 제외하면 높은 수준의 메시지 데이터그램과 유사하다. 메시지는 일반적으로 같은 방향의 프로세스 간 통신에도 사용된다.

6. 비판적 관점

죄송합니다. 주어진 원본 소스(`커뮤니케이팅 시퀜셜 프로세스`, `SOAP`)만으로는 "메시지 전달"의 "비판적 관점" 섹션 내용을 작성하기에 충분한 정보가 없습니다. 원본 소스에 해당 내용이 명시적으로 드러나 있지 않기 때문에, 주어진 지침에 따라 원본 소스만을 기반으로 내용을 생성하는 것은 불가능합니다.

7. 결론

커뮤니케이팅 시퀜셜 프로세스SOAP는 메시지 전달과 관련된 중요한 개념이다.

참조

[1] 서적 Smalltalk-80 The Language Addison Wesley
[2] 서적 The Essential Client/Server Survival Guide https://archive.org/[...] Wiley Computer Publishing
[3] 서적 The Essential Client/Server Survival Guide https://archive.org/[...] Wiley Computer Publishing
[4] 서적 The Essential Client/Server Survival Guide https://archive.org/[...] Wiley Computer Publishing
[5] 웹사이트 Process of Hide messages https://emailspedia.[...] 2022-04-13
[6] 간행물 Elements of interaction: Turing award lecture 1993-01
[7] 간행물 A Universal Modular Actor Formalism for Artificial Intelligence IJCAI
[8] 웹사이트 prototypes vs classes was: Re: Sun's HotSpot http://lists.squeakf[...] 2014-01-02
[9] 웹인용 Using Message Passing to Transfer Data Between Threads - The Rust Programming Language https://doc.rust-lan[...]
[10] 문서 prototypes vs classes was: Re: Sun's HotSpot http://lists.squeakf[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com