- Terms

원래, 마샬이란 말을 지키거나, 축제 준비를 위하여 물건들을 가지런히 하는 것을 가리킨다.

의식에서, 마샬링이란 여러 벌의 코트 팔들이 하나의 구도를 이루도록 배열하는 것이다. 군에서의, 마샬링은 전투준비를 위해 군대를 모으고 정렬시키는 것을 의미한다.

컴퓨터 프로그래밍에서, 마샬링은 하나 이상의 프로그램 또는 연속되어 있지 않은 저장 공간으로부터 데이터를 모은 다음, 데이터들을 메시지 버퍼에 집어넣고, 특정 수신기나 프로그래밍 인터페이스에 맞도록 그 데이터를 조직화하거나, 미리 정해진 다른 형식으로 변환하는 과정을 말한다.

마샬링은 대체로, 어떤 한 언어로 작성된 프로그램의 출력 매개변수들을, 다른 언어로 작성된 프로그램의 입력으로 전달해야 하는 경우에 필요하다.

 - HelloPC

 

마샬링(marshalling)은 클라이언트가 사용하고자 하는 객체의 형태에 관계없이 같은 방식으로 인터페이스 함수를 사용할 수 있게 하는 메카니즘이다.

마샬링은 두 가지의 단계를 포함한다.

서버의 인터페이스 포인터를 다른 프로세스의 클라이언트에서 사용할 수 있게 한다.
클라이언트가 인터페이스의 함수에 실은 함수 인자들을 정확하게 서버로 전달해야 한다.
원칙적으로 클라이언트는 in-proc서버만을 사용할 수 있다. 원격에 있는 서버를 사용하기 위해서는 그 서버를 대행하면서, 클라이언트와 같은 프로세스에서 실행될 수 있는 프록시나 핸들러가 필요하다.

프록시는 원격의 서버를 순수하게 대행한다는 의미이지만, 핸들러는 대행을 할 수도 있고, 자신이 구현할 수도 있는 혼합형태이다. 어쨌든 둘 다 원격의 객체와 클라이언트의 연결을 위한 대행의 역할을 한다.

클라이언트가 서버의 함수를 호출할 때 넘겨지는 인자, 그리고 서버 함수의 리턴값은 프로세스의 경계를 넘어서 유효해야 한다. 이 측면 또한 마샬링이 개입되는 곳이다.

인자의 형태에 따라 다른 형태의 마샬링이 일어난다. DWORD같이 간단한 타입은 직접 복사가 된다. 그러나 어떤 영역을 가리키는 포인터가 넘어갈 때는 그 영역 전체가 프로세스 경계를 넘어 복사되어야 한다.

 커스텀 마샬링과 표준 마샬링

커스텀 마샬링의 경우 객체는 프록시/스텁에 자신의 인터페이스(인자)에 대한 마샬링 정책을 명확하게 정의해야 한다. 커스텀 마샬링은 주로 효율을 높이기 위한 목적으로 사용된다.

OLE는 또한 표준 마샬링을 지원한다. 즉 표준 프록시와 표준 스텁을 제공하는데, 이 둘간에는 표준 RPC를 통해 통신한다.

표준 프록시와 표준 스텁은 각각의 인터페이스를 처리하는 작은 코드인 인터페이스 마샬러의 집합이다. 그래서 프록시는 프록시 매니저로, 스텁은 스텁 매니저로 불린다. 또한 마샬러는 인터페이스 프록시, 인터페이스 스텁이라고 불린다. 용어의 혼동을 피하기 위해 인터페이스 프록시는 facelet으로, 인터페이스 스텁은 stublet으로 부른다.

 마샬링 기본 메카니즘
클라이언트는 CoGetClassObject를 실행하여 원격 서버를 실행하고, 원격 서버는 CoRegisterClassObject함수를 통해 마샬링을 시작하게 된다. 이 과정을 통해 일단 서버의 IClassFactory가 클라이언트에 넘겨진다.

이 과정을 자세히 살펴보면 다음과 같다.

CoRegisterClassObject안에서 COM은 객체에게 클라이언트 프로세스에 포함될 프록시의 CLSID를 요구한다. 만일 객체가 CLSID를 제공하지 않을 때는 COM은 표준 마샬링 프록시를 사용한다.
COM은 객체에게 마샬링 패킷을 요구한다. 마샬링 패킷은 프록시가 객체와 연결할 때 필요한 정보들을 담고 있다. 객체가 제공하지 않으면 역시 COM은 표준 패킷을 사용한다.

COM은 프록시 CLSID와 마샬링 패킷을 클라이언트에 넘긴다.

클라이언트의 프로세스에서 COM은 1에서 얻어진 CLSID로 프록시를 생성하고, 2에서 얻어진 마샬링 패킷을 가져온다.

이제 프록시는 클라이언트가 CoGetClassObject에서 요구한 인터페이스의 포인터를 넘긴다. 클라이언트는 이 포인터(보통 IClassFactory)로 실제 객체를 생성할 수 있다.
1,2과정은 CoMarshalInterface함수가 담당하고, 3과정은 Service Control Manager가 담당한다. 4,5과정은 CoUnmarshalInterface가 담당한다.
 

- Document

원래, 마샬이란 말을 지키거나, 축제 준비를 위하여 물건들을 가지런히 하는 것을 가리킨다. 의식에서, 마샬링이란 여러 벌의 코트 팔들이 하나의 구도를 이루도록 배열하는 것이다. 군에서의, 마샬링은 전투준비를 위해 군대를 모으고 정렬시키는 것을 의미한다.
컴퓨터 프로그래밍에서, 마샬링은 하나 이상의 프로그램 또는 연속되어 있지 않은 저장 공간으로부터 데이터를 모은 다음, 데이터들을 메시지 버퍼에 집어넣고, 특정 수신기나 프로그래밍 인터페이스에 맞도록 그 데이터를 조직화하거나, 미리 정해진 다른 형식으로 변환하는 과정을 말한다.
마샬링은 대체로, 어떤 한 언어로 작성된 프로그램의 출력 매개변수들을, 다른 언어로 작성된 프로그램의 입력으로 전달해야 하는 경우에 필요하다.
마샬링(marshalling)은 클라이언트가 사용하고자 하는 객체의 형태에 관계없이 같은 방식으로 인터페이스 함수를 사용할 수 있게 하는 메카니즘이다.
마샬링은 두 가지의 단계를 포함한다.

1) 서버의 인터페이스 포인터를 다른 프로세스의 클라이언트에서 사용할 수 있게 한다.
2) 클라이언트가 인터페이스의 함수에 실은 함수 인자들을 정확하게 서버로 전달해야 한다.
원칙적으로 클라이언트는 in-proc서버만을 사용할 수 있다. 원격에 있는 서버를 사용하기 위해서는 그 서버를 대행하면서, 클라이언트와 같은 프로세스에서 실행될 수 있는 프록시나 핸들러가 필요하다.
프록시는 원격의 서버를 순수하게 대행한다는 의미이지만, 핸들러는 대행을 할 수도 있고, 자신이 구현할 수도 있는 혼합형태이다. 어쨌든 둘 다 원격의 객체와 클라이언트의 연결을 위한 대행의 역할을 한다.
클라이언트가 서버의 함수를 호출할 때 넘겨지는 인자, 그리고 서버 함수의 리턴값은 프로세스의 경계를 넘어서 유효해야 한다. 이 측면 또한 마샬링이 개입되는 곳이다.
인자의 형태에 따라 다른 형태의 마샬링이 일어난다. DWORD같이 간단한 타입은 직접 복사가 된다. 그러나 어떤 영역을 가리키는 포인터가 넘어갈 때는 그 영역 전체가 프로세스 경계를 넘어 복사되어야 한다.

< 커스텀 마샬링과 표준 마샬링 >
커스텀 마샬링의 경우 객체는 프록시/스텁에 자신의 인터페이스(인자)에 대한 마샬링 정책을 명확하게 정의해야 한다. 커스텀 마샬링은 주로 효율을 높이기 위한 목적으로 사용된다.
OLE는 또한 표준 마샬링을 지원한다. 즉 표준 프록시와 표준 스텁을 제공하는데, 이 둘간에는 표준 RPC를 통해 통신한다.
표준 프록시와 표준 스텁은 각각의 인터페이스를 처리하는 작은 코드인 인터페이스 마샬러의 집합이다. 그래서 프록시는 프록시 매니저로, 스텁은 스텁 매니저로 불린다. 또한 마샬러는 인터페이스 프록시, 인터페이스 스텁이라고 불린다. 용어의 혼동을 피하기 위해 인터페이스 프록시는 facelet으로, 인터페이스 스텁은 stublet으로 부른다.

< 마샬링 기본 메카니즘 > 클라이언트는 CoGetClassObject를 실행하여 원격 서버를 실행하고, 원격 서버는 CoRegisterClassObject함수를 통해 마샬링을 시작하게 된다. 이 과정을 통해 일단 서버의 IClassFactory가 클라이언트에 넘겨진다.
이 과정을 자세히 살펴보면 다음과 같다.

1) CoRegisterClassObject안에서 COM은 객체에게 클라이언트 프로세스에 포함될 프록시의 CLSID를 요구한다. 만일 객체가 CLSID를 제공하지 않을 때는 COM은 표준 마샬링 프록시를 사용한다.
2) COM은 객체에게 마샬링 패킷을 요구한다. 마샬링 패킷은 프록시가 객체와 연결할 때 필요한 정보들을 담고 있다. 객체가 제공하지 않으면 역시 COM은 표준 패킷을 사용한다.
3) COM은 프록시 CLSID와 마샬링 패킷을 클라이언트에 넘긴다.
4) 클라이언트의 프로세스에서 COM은 1에서 얻어진 CLSID로 프록시를 생성하고, 2에서 얻어진 마샬링 패킷을 가져온다.
5) 이제 프록시는 클라이언트가 CoGetClassObject에서 요구한 인터페이스의 포인터를 넘긴다. 클라이언트는 이 포인터(보통 IClassFactory)로 실제 객체를 생성할 수 있다.

1,2과정은 CoMarshalInterface함수가 담당하고, 3과정은 Service Control Manager가 담당한다. 4,5과정은 CoUnmarshalInterface가 담당한다.

'Program' 카테고리의 다른 글

아스키(ASCII) 코드 표  (0) 2009.12.22
WML - 기본 Tag  (0) 2009.12.16
input tag  (0) 2009.12.16
[마틴파울러]Refactoring에서 나온 관련 좋은 문구  (0) 2009.12.15

+ Recent posts