d Com Comparison

Embed Size (px)

Citation preview

  • 8/13/2019 d Com Comparison

    1/22

    DCOM-CORBA Comparison

    Operating Systems II

    Reference: P. Chung et al., DCOM and CORBA: side by side, step by

    step,and layer by layer, C++ Report.

    http://www.research.att.com/~ymwang/papers/HTML/DCOMnCORBA/S.html

  • 8/13/2019 d Com Comparison

    2/22

    DCOM vs CORBA 2

    A COM object can have multiple interfaceseach representing a different view of the

    objectA COM client interacts with a COM object by

    obtaining a pointer to one of the object'sinterfaces

    and invoking methods through that pointer

    as if the object is in the client's address space

  • 8/13/2019 d Com Comparison

    3/22

    DCOM vs CORBA 3

    The core of CORBA is the Object RequestBroker (ORB) that acts as the softwarebus over which objects interact with each

    other transparently

    The client of a CORBA object acquires anobject-reference and

    uses it as a handle to make calls

    as if it is in the client's local address space.

    The ORB is responsible for facilitating the call

  • 8/13/2019 d Com Comparison

    4/22

    DCOM vs CORBA 4

    Both DCOM and CORBA provides client-server relations between objects

    The interface to a server is describedusing an IDL in both cases

    CORBA supports multiple inheritance at

    IDL level, DCOM does notDCOM however allows multiple interfaces to

    an object

  • 8/13/2019 d Com Comparison

    5/22

    DCOM vs CORBA 5

    Communication

    CORBA and DCOM uses RPC style ofcommunication

    The client makes a call to the client stub(called proxy in DCOM)

    The stub marshals the parameters and sends it tothe server

    At the server end, a server skeleton (calledstub in DCOM) demarshals the message andmakes the call

  • 8/13/2019 d Com Comparison

    6/22

    DCOM vs CORBA 6

    Sample application

    A Grid server maintains a two-dimensionalgrid of integers

    Two views to the grid:View One:

    Two methods: get and set to get and set gridpoint

    View Two:

    One method: reset to reset all grid points to agiven value

  • 8/13/2019 d Com Comparison

    7/22

    DCOM vs CORBA 7

    The DCOM implementation uses twointerfaces, one for each view

    Interfaces IGrid1 and IGrid2The CORBA implementation uses multiple

    inheritance

    Interface grid1 supports get and setInterface grid2 supports reset

    Interface grid inherits from grid1 and grid2

  • 8/13/2019 d Com Comparison

    8/22

    DCOM vs CORBA 8

    // uuid and definition of IGrid1

    [ object,

    uuid(3CFDB283-CCC5-11D0-BA0B-00A0C90DF8BC),

    helpstring("IGrid1 Interface"),

    pointer_default(unique)

    ]

    interface IGrid1 : IUnknown {

    import "unknwn.idl";

    HRESULT get([in] SHORT n, [in] SHORT m, [out] LONG *value);

    HRESULT set([in] SHORT n, [in] SHORT m, [in] LONG value);};

    // uuid and definition of IGrid2

    [ object,

    uuid(3CFDB284-CCC5-11D0-BA0B-00A0C90DF8BC),

    helpstring("IGrid2 Interface"),pointer_default(unique)

    ]

    interface IGrid2 : IUnknown {

    import "unknwn.idl";

    HRESULT reset([in] LONG value);

    };

    DCOM IDL

    Each interface and

    class has GUIDs

  • 8/13/2019 d Com Comparison

    9/22

    DCOM vs CORBA 9

    // uuid and definition of type library

    [ uuid(3CFDB281-CCC5-11D0-BA0B-00A0C90DF8BC),

    version(1.0),

    helpstring("grid 1.0 Type Library)

    ]

    library GRIDLib

    { importlib("stdole32.tlb");

    // uuid and definition of class

    [ uuid(3CFDB287-CCC5-11D0-BA0B-00A0C90DF8BC),

    helpstring("Grid Class")

    ]

    // multiple interfacescoclass CGrid

    { [default] interface IGrid1;

    interface IGrid2;

    };

    };

    DCOM IDL (continued)

    multiple views for Grid

  • 8/13/2019 d Com Comparison

    10/22

    DCOM vs CORBA 10

    interface grid1

    {

    long get(in short n, in short m);

    void set(in short n, in short m, in long value);

    };

    interface grid2

    {

    void reset(in long value);

    };

    // multiple inheritance of interfaces

    interface grid: grid1, grid2

    {

    };

    CORBA IDL

  • 8/13/2019 d Com Comparison

    11/22

    DCOM vs CORBA 11

    DCOM server class definition (cgrid.h)

    #include "grid.h" // IDL-generated interface header file

    class CGrid : public IGrid1, public IGrid2 {

    public:// IUnknown

    STDMETHODIMP QueryInterface(REFIID riid, void** ppv);

    STDMETHODIMP_(ULONG) AddRef(void)

    { return InterlockedIncrement(&m_cRef); }

    STDMETHODIMP_(ULONG) Release(void)

    { if (InterlockedDecrement(&m_cRef) == 0){ delete this; return 0; }

    return 1; }

    // IGrid1

    STDMETHODIMP get(IN SHORT n, IN SHORT m,

    OUT LONG *value);

    STDMETHODIMP set(IN SHORT n, IN SHORT m,IN LONG value);

    // IGrid2

    STDMETHODIMP reset(IN LONG value);

    // create and destroy methods, and private declarations are not shown

    }

  • 8/13/2019 d Com Comparison

    12/22

    DCOM vs CORBA 12

    CORBA server class definition (grid_i.h)

    #include "grid.hh" // IDL-generated interface header file

    class grid_i : public gridBOAImpl {

    public:

    virtual CORBA::Long get(CORBA::Short n, CORBA::Short m,

    CORBA::Environment &env);

    virtual void set(CORBA::Short n, CORBA::Short m,CORBA::Long value, CORBA::Environment &env);

    virtual void reset(CORBA::Long value,

    CORBA::Environment &env);

    grid_i(CORBA::Short h, CORBA::Short w);

    virtual ~grid_i();

    private:

    CORBA::Long **m_a;

    CORBA::Short m_height, m_width;

    };

  • 8/13/2019 d Com Comparison

    13/22

    DCOM vs CORBA 13

    #include "cgrid.h"

    STDMETHODIMP CGrid::QueryInterface(REFIID riid, void** ppv) {

    if (riid == IID_IUnknown || riid == IID_IGrid1)

    *ppv = (IGrid1*) this;else if (riid == IID_IGrid2) *ppv = (IGrid2*) this;

    else { *ppv = NULL; return E_NOINTERFACE; }

    AddRef(); return S_OK;

    }

    STDMETHODIMP CGrid::get(IN SHORT n, IN SHORT m, OUT LONG* value) {

    *value = m_a[n][m];

    return S_OK;

    }

    extern HANDLE hevtDone;

    CGrid::~CGrid () {

    for (int i=0; i < m_height; i++)

    delete[] m_a[i];

    delete[] m_a;

    SetEvent(hevtDone);}

    DCOM Server Implementation

    create, set, reset method

    implementations are not shown

  • 8/13/2019 d Com Comparison

    14/22

    DCOM vs CORBA 14

    #include "grid_i.h"

    CORBA::Long grid_i::get(CORBA::Short n, CORBA::Short m,

    CORBA::Environment &) {return m_a[n][m];

    }

    void grid_i::set(CORBA::Short n, CORBA::Short m,

    CORBA::Long value, CORBA::Environment &) {

    m_a[n][m] = value;}

    void grid_i::reset(CORBA::Long value, CORBA::Environment &) {

    short n, m;

    for (n = 0; n < m_height; n++)

    for (m = 0; m < m_width; m++)

    m_a[n][m]=value;

    return;

    }

    // create and delete not shown

    CORBA Server Implementation

  • 8/13/2019 d Com Comparison

    15/22

    DCOM vs CORBA 15

    HANDLE hevtDone;

    void main()

    {

    // Event used to signal this main thread

    hevtDone = CreateEvent(NULL, FALSE, FALSE, NULL);

    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

    CClassFactory* pcf = new CClassFactory;

    hr = CoRegisterClassObject(CLSID_CGrid, pcf,

    CLSCTX_SERVER, REGCLS_MULTIPLEUSE , &dwRegister);

    // Wait until the event is set by CGrid::~CGrid()WaitForSingleObject(hevtDone, INFINITE);

    CloseHandle(hevtDone);

    CoUninitialize();

    }

    DCOM Server main program

  • 8/13/2019 d Com Comparison

    16/22

    DCOM vs CORBA 16

    int main()

    {

    // create a grid object using the implementation class grid_i

    grid_i ourGrid(100,100);

    try {

    // tell Orbix that we have completed the server's initialization:

    CORBA::Orbix.impl_is_ready("grid");

    } catch (...) {cout

  • 8/13/2019 d Com Comparison

    17/22

    DCOM vs CORBA 17

    #include "grid.h"

    void main(int argc, char**argv)

    {

    IGrid1 *pIGrid1;

    IGrid2 *pIGrid2;

    LONG value;

    CoInitialize(NULL); // initialize COM

    CoCreateInstance(CLSID_CGrid, NULL, CLSCTX_SERVER,

    IID_IGrid1, (void**) &pIGrid1);

    pIGrid1->get(0, 0, &value);

    pIGrid1->QueryInterface(IID_IGrid2, (void**) &pIGrid2);pIGrid1->Release();

    pIGrid2->reset(value+1);

    pIGrid2->Release();

    CoUninitialize();

    }

    DCOM client program

  • 8/13/2019 d Com Comparison

    18/22

    DCOM vs CORBA 18

    CORBA client program

    #include "grid.hh"

    void main (int argc, char **argv)

    {

    grid_var gridVar;

    CORBA::Long value;

    // bind to "grid" object; Orbix-specific

    gridVar = grid::_bind(":grid");

    value = gridVar->get(0, 0);

    gridVar->reset(value+1);

    }

  • 8/13/2019 d Com Comparison

    19/22

    DCOM vs CORBA 19

    Registration

    In both CORBA and DCOM the serversneed to be registered

    This establishes the mapping between theinterface name and the path name (inCORBA), and the CLSID and the path

    name in DCOMDCOM uses registry (which is supported by

    the Window o/s)

    CORBA uses implementation repository

  • 8/13/2019 d Com Comparison

    20/22

    DCOM vs CORBA 20

    Observations

    DCOM: Client calls COM library'sCoCreateInstance() with CLSID_Grid andIID_IGrid1

    CORBA: Client calls client stub's bind

    DCOM: The client can get another interface

    (IID_IGrid2) of the same object usingQueryInterface

  • 8/13/2019 d Com Comparison

    21/22

    DCOM vs CORBA 21

    DCOM Middle layer

    Upon receiving CoCreateInstance() call, COM librarydelegates the task to Service Control Manager (SCM)

    SCM tries to map CLSID_Grid to its server path name by

    consulting the registryIf an instance does not exist, SCM creates an instance

    When the instance is created, COM creates an interface stub forIID_Grid1 interface

    Then SCM ferries the marshalled pointer back to the client side;

    COM on the client side creates a proxy for the interface andassociates it the with the RPC channel to the stub

    COM library returns to the client an IID_IGrid1 pointer to theinterface proxy pIGrid1

  • 8/13/2019 d Com Comparison

    22/22

    DCOM vs CORBA 22

    CORBA middle layer

    Upon receiving bind() call, the client stub delegates thetask to ORB

    ORB consults the implementation repository andactivates the server

    Server instantiates all supported objects and creates aninstance of the skeleton

    When the ORB ferries the object reference back to theclient side, it creastes an instance of the proxy class andregisters it in a proxy object table with its correspondingobject reference

    Client stub returns to the client an object reference asgridVar