COM & Threading „The Basics“

Slides:



Advertisements
Ähnliche Präsentationen
Locking In CFML. Locking in CFML - Warum - Wie - Wobei - Wann } soll gelockt werden? Locking verstehen.
Advertisements

Be.as WEB Technologie
Datenbankzugriff über ISAPI-Webservererweiterungen
Schaffung von Rechtsbewusstsein
der Universität Oldenburg
Beim Start eines Prozesses in Windows NT, 2000 wird a der Programmtext aus der exe-Datei ab der dort angegebenen Adresse gespeichert.
SQL Server 2005.NET Integration Sebastian Weber Developer Evangelist Microsoft Deutschland GmbH.
COM-Programmierung mit Visual Basic 6
Konzepte und Programmierung
DI Christian Donner cd (at) donners.com
Kapselung , toString , equals , Java API
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
SAP R/3 - Speichermanagement
Sequenzdiagramm.
On a Buzzword: Hierachical Structure David Parnas.
Threads Richard Göbel.
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Ein Beispiel in Java.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Programmieren mit JAVA
Programmieren mit JAVA
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
JAVA RMI.
COM (Component Object Model) / DCOM (Distributed COM)
Introducing the .NET Framework
Vortrag III Hier in der Vorlesungszeit! Anwesenheitspflicht Jede Gruppe hat 6 Minuten! Stellt eure GUI vor –was ihr besonderes gemacht habt –Spektakuläre.
Packages Vortrag : Cornelia Hardt 23. November 1999.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Handling und Erstellung von: DLL, EXE, COM, DCOM
Erstellen von COM-Servern in Visual FoxPro 9.0 deutschsprachige FoxPro User Group Rainer Becker Microsoft Visual FoxPro 9.0 Roadshow COM.
Erstellen von WebServices mit Visual FoxPro 9.0
Was umfaßt die CORBA Core Spezifikation? Welche zusätzlichen Komponenten muß ein ORB Produkt beinhalten? Core: CORBA Objekt Modell CORBA Architektur OMG.
JavaScript.
Informatik Grundlagen, WS04, Seminar 11
Flash und ein bisschen AS3-Code Wie einfache Interaktionen funktionieren.
SQL Server 2005 CLR-Integration
Mit 3 Schichte zum Erfolg
Game Development mit LUA Integration und Kommunikation von LUA mit C++ Referat von Paul van Hemmen Seminar: Reusable Content in 3D und Simulationssystemen.
Entwicklung verteilter Anwendungen II, SS 13 Prof. Dr. Herrad Schmidt SS 2013 Kapitel 5 Folie 2 Windows Communication Foundation (WCF) s.a.
Grundlagen der Informatik 4 Lehrstuhl für Betriebssysteme 1 Wie werden Funktionen realisiert? Beispiel: int maximum(int x, int y) { int j = x; if (y >
Welchen Problemen ist man bei heterogener, verteilter Programmierung ausgesetzt? Hardware: nicht einheitliche, inkompatible Systeme, verschiedene Leistungsfähigkeit.
Tutorium PG Verbesserung Blatt 5 Beim instanziieren eines Fahrrades muss es möglich sein, alle benötigten Attribute dem Konstruktor zu übergeben.
Aufgaben Version 1: Es soll eine Wetterstation mit folgenden zwei Anzeigen implementiert werden: Aktuelle Wetterbedingungen mit Temperatur und.
Objectives Verstehen was unterDelegate verstanden wird
Manfred Helber Microsoft Senior PreSales Consultant.
MTS Microsoft Transaction Server Martin Basziszta
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Parallelisierung für Multiprozessor-Maschinen Teil 2.
Parallelisierung für Multiprozessor-Maschinen
Persistenz: Objekt-Lebensdauer In RDBMS wird Lebensdauer von Werten durch ihren Typ festgelegt: Instanzen von Relationstypen sind persistent, alle anderen.
CODA - Installation Installation der Binärdateien –Venus: Client-Programm –Vice: Server-Programm –Für Windows existiert eine Alpha-Version (Coda Client.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Tutorium Software-Engineering SS14 Florian Manghofer.
S INGLETON P ATTERN IN M ATLAB By Giuseppe
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Einführung in die Programmierung
Implementieren von Klassen
 Präsentation transkript:

COM & Threading „The Basics“ Frank Lange Michael Willers Microsoft GmbH

Agenda Warum COM-Threading? Wie funktioniert’s? Wo gibt’s weitere Info’s?

Warum COM-Threading? Ein einfaches Beispiel Zwei Threads innerhalb eines Prozesses erzeugen das gleiche COM-Object. Ist der COM-Server eine DLL (in-proc) dann greifen die Methoden beider Objektinstanzen auf die gleichen globalen Daten zu. Sofern der Zugriff nicht threadsafe ist “krachts”, wenn beide Threads auf die globalen Daten zugreifen. Object (Instanz 1) Thread 1 Globale Daten Object (Instanz 2) Thread 2

Warum COM-Threading? Was bedeutet Threading Model?!

Warum COM-Threading? “Brauchen“ Sie performante Objekte? Im “Multithread-Betrieb” können in “bestimmten” Situationen keine direkten Methodenaufrufe erfolgen. In diesen Situationen ist Marshalling notwendig; Aufrufe werden langsamer! Wann ist das Marshalling notwendig?

Wie funktioniert‘s? Allgemeines, I Standardmäßig “schützt” COM die Objekte vor dem Zugriff konkurrierender Threads (SingleThreading). Zugriffe werden synchronisiert (Standard!) Client braucht nicht darauf zu achten, ob das Objekt threadsafe ist Bei “echtem” Multithreading muß der Entwickler dafür sorgen, daß die Objekte threadsafe sind !!! Threading wird mit Apartments realisiert.

Wie funktioniert‘s? Was bedeutet Apartment? Ein Apartment ist eine Gruppe von Objekten innerhalb eines Prozesses. Apartments werden benutzt, um eine Zuordnung zwischen Threads und Objekten herzustellen. Ein Prozeß kann ein oder mehrere Apartments beinhalten.

Wie funktioniert‘s? Beispiele für Apartments Apartment A Apartment B Apartment C Prozess X Prozess Y

Wie funktioniert‘s? Was bedeutet Apartment? Single-threaded apartments (STAs) pro Apartment nur ein einziger Thread beliebig viele STAs pro Prozess Der innerhalb eines Prozesses zuerst erzeugte STA heißt main STA Multithreaded apartments (MTAs) beliebig viele Threads pro MTA ein Prozess kann nur genau ein MTA beinhalten

Wie funktioniert‘s? Allgemeines, II Jeder Thread, der mit COM-Objekten arbeitet, muß vorher CoInitialize oder CoInitializeEx aufrufen. Mit diesem Aufruf “betritt” der Thread ein Apartment Jedes Objekt befindet sich in einem Apartment Objekte in unterschiedlichen Apartments können nicht “direkt” aufgerufen werden. In diesem Fall ist Marshalling notwendig! gilt auch innerhalb eines Prozesses!

Wie funktioniert‘s? Objekte, Threads und Apartments main STA Thread 1 Marshalling STA Thread 2 Prozess Marshalling MTA Thread 3 Thread 4

Wie funktioniert‘s? Aufrufe in andere Apartments “Ziel-Apartment” ist ein STA… Aufrufe werden an den “one and only” Thread des STA weitergeleitet und nacheinander abgearbeitet (serially) Aufruf wird mit einer Nachricht realisiert, die an ein von COM erzeugtes “hidden window” gesendet wird (message queuing!) “Ziel-Apartment” ist ein MTA… Aufrufe geschehen quasi “gleichzeitig” (concurrency) via (L)RPC

Wie funktioniert‘s? Zuordnung: Threads und Apartments Der 2. Parameter von CoInitializeEx (COINIT-Wert) legt fest, in welchem Apartment-Typ der Thread “läuft”. COINIT_APARTMENTTHREADED “setzt” den Thread in ein STA COINIT_MULTITHREADED “setzt” den Thread in ein MTA CoInitialize = CoInitializeEx (…, COINIT_APARTMENTTHREADED )

Wie funktioniert‘s? Zuordnung: Objekte und Apartments, I Out-of-proc (EXE) Der Server, in dem sich das Objekt befindet, bestimmt den Apartmenttyp! Die main-Funktion des Servers ruft CoInitialize bzw. CoInitializeEx auf. Reminder: Jeder Thread, der mit COM-Objekten arbeitet, muß diese Funktion aufrufen D.h.: Der Apartmenttyp wird für alle Objekte des Servers festgelegt! ACHTUNG: Wenn der Apartmenttyp MTA ist, müssen alle Objekte des Servers threadsafe sein!

Wie funktioniert‘s? Zuordnung: Objekte und Apartments, II In-proc (DLL) Das Threading Model des Objekts bestimmt den Apartmenttyp! Das Threading Model ist in der Registry gespeichert. D.h.: Der Apartmenttyp wird für jedes Objekt einzeln festgelegt!

Wie funktioniert‘s? Threading Model in der Registry HKEY_CLASSES_ROOT CLSID {…} “My Component” InprocServer32 “C:\Servers\MyComp.dll” “ThreadingModel” “Apartment” An dieser Stelle ist das Threading Model eingetragen!

Wie funktioniert‘s? Welche Threading Model‘s gibt es?, I No ThreadingModel value (=Single) Alle Objekte “laufen” im main STA eines Prozesses

Wie funktioniert‘s? Welche Threading Model‘s gibt es?, II ThreadingModel=Apartment Objekte können in jedem STA eines Prozesses “laufen” ThreadingModel=Free Objekte “laufen” grundsätzlich nur im “one and only” MTA eines Prozesses ThreadingModel=Both Objekte können sowohl in einem STA als auch im MTA eines Prozesses “laufen”

Wie funktioniert‘s? No Threading Model (=Single) COM “nimmt” an, daß Objekte nicht threadsafe sind. COM “beschränkt” alle Objekt-Instanzen auf das main STA. Aufrufe von ausserhalb werden synchronisiert und erfolgen indirekt (marshalling) Da alle Instanzen im gleichen Thread laufen kann immer nur eine einzige Instanz “Code ausführen”. Voila! Thread safety!

Wie funktioniert‘s? No Threading Model (=Single) Methodenaufrufe werden synchronisiert, da ALLE Objekt-Instanzen im gleichen Thread „laufen”. Somit sind gleichzeitige Zugriffe auf globale Daten nicht möglich. main STA Thread 1 Instanz 1 Instanz 2 Marshalling Alle anderen Apartments Thread 2 Proxy (gilt für Zugriffe „innerhalb“ von Methoden)

Wie funktioniert‘s? Threading Model=Apartment COM “nimmt” an, daß Objekte “halbwegs” threadsafe sind und “setzt” Objekt in ein STA. COM synchronisiert Methodenaufrufe innerhalb einzelner Objektinstanzen. Somit sind auch Member einer Instanz geschützt. Methodenaufrufe unterschiedlicher Instanzen können gleichzeitig erfolgen. Wird innerhalb dieser Methoden auf globale Daten zugegriffen, muß dieser Zugriff threadsafe sein. Jeder Thread, der in einem STA “läuft” kann dort Objekte erstellen. Zugriffe auf diese Objekte können aus MTA’s nur indirekt erfolgen (Marshalling).

Wie funktioniert‘s? Threading Model=Apartment main STA Thread 1 Instanz 1 Global Daten STA Thread 2 Instanz 2 Globale Daten werden nicht vor “überlappenden” Lese- und Schreibzugriffen verschiedener Instanzen geschützt und müssen synchronisiert werden.

Wie funktioniert‘s? Threading Model=Free COM “nimmt” an, das Objekte threadsafe sind. D.h.: “Concurrent calls” sind OK. COM braucht Methodenaufrufe nicht zu synchronisieren COM “setzt” Objekte in den MTA und alle dortigen Threads können direkt, d.h. ohne Marshalling, auf die Objekte zugreifen. Threads, die in STAs “laufen” können auf die Objekte im MTA nur indirekt zugreifen (Marshalling!).

Wie funktioniert‘s? Threading Model=Both COM “nimmt” an, das Objekte grundsätzlich threadsafe sind. Ein Objekt kann in einem STA oder dem MTA angelegt werden. Dadurch ist sichergestellt, daß das Objekt stets im Apartment des Client-Threads angelegt wird. Es ist egal, ob der Client ein STA-Thread oder ein MTA-Thread ist Der Thread, der das Objekt angelegt hat, kann stets direkt auf das Objekt zugreifen

Wie funktioniert‘s? Wann erfolgt Marshalling? Alle weiteren Threads, die CoInitializeEx (COINIT_APARTMENTTHREADED) aufrufen Allererster Thread, der CoInitializeEx (COINIT_APARTMENTTHREADED) aufruft Alle Threads, die CoInitializeEx COINIT_MULTITHREADED) aufrufen ThreadingModel MTA Thread STA Thread Main STA Thread “Both” Direkt Direkt Direkt “Apartment” Proxy Direkt Direkt Kein Eintrag (none) Proxy Proxy Direkt “Free” Direkt Proxy Proxy

Wie funktioniert‘s? Was muss implementiert werden? Threading Model Aktion None (Single) nichts Apartment Synchronisation für Methodenzugriffe auf globale Daten Free Synchronisation für Methodenzugriffe auf globale Daten und Instanzdaten (Member) Both Synchronisation für Methodenzugriffe auf globale Daten und Instanzdaten (Member)

Wie funktioniert‘s? Warum „Free“ und „Both“ Es gibt Objekte, die selbst Worker-Threads erzeugen: Diese Threads sollen vorhandene Schnittstellenzeiger benutzen. Wenn man diese Objekte als "Both" deklariert und in einem STA erzeugt, müssen die Worker-Threads in anderen Apartments erzeugt werden. Schnittstellenzeiger werden also„gemarshalled“. Dies kann bei häufigen Aufrufen erhebliche Performanceverluste verursachen. Für diese Fälle kann man mit „Free" die Erzeugung im MTA erzwingen. Die Worker-Threads und das Objekt befinden sich dann im selben Apartment.

Wie funktioniert‘s? Zusammenfassung - Theading Model “No ThreadingModel”-Objekte sind einfach zu implementieren, allerdings ist fast immer Marshalling notwendig. “ThreadingModel=Apartment”-Objekte verbessern die Performance mit relativ wenig Aufwand. “ThreadingModel=Free/Both”-Objekte haben die beste Performance, sind aber schwierig zu implementieren und zu debuggen.

Wie funktioniert‘s? Zusammenfassung - Objekt Wenn das Threading Model auf Apartment “gesetzt” ist, dann muß der Zugriff auf globale Daten innerhalb von Objekt-Methoden grundsätzlich threadsafe erfolgen. critical sections Interlocked-functions Sollen die Objekte im MTA “laufen” müssen alle Operationen innerhalb des Objekts threadsafe sein.

Wie funktioniert‘s? Zusammenfassung - Client Jeder Thread muß vor dem Benutzen von COM-Objekten CoInitialize(Ex) aufrufen. Thread “betritt” damit ein Apartment kein Marshalling bei gleichem Apartmenttyp! Schnittstellenzeiger dürfen niemals direkt an Threads in anderen Apartments übergeben werden. Marshalling zwischen unterschiedlichen Apartments!

Wie funktioniert‘s? Marshalling von Schnittstellenzeigern, I Schnittstellenzeiger können zwischen Threads können nur dann direkt übergeben werden, wenn die Threads im gleichen Apartment “liegen”. Liegen die Threads in unterschiedlichen Appartments ist Marshalling erforderlich. CoMarshalInterThreadInterfaceInStream marshals an interface in one thread CoGetInterfaceAndReleaseStream unmarshals the interface in another

Wie funktioniert‘s? Marshalling von Schnittstellenzeigern, II // The following global variable will hold the IStream pointer used by // both threads. COM makes sure the IStream pointer can be safely // used in different apartments. IStream* g_pStream; IMath* pMath; // Marshal the interface pointer in one thread. CoMarshalInterThreadInterfaceInStream (IID_IFace, pMath, g_pStream); . // Unmarshal it in another. CoGetInterfaceAndReleaseStream (g_pStream, IID_IFace, (void**) &pMath); Ein Stream nimmt immer nur einen Schnittstellenzeiger auf!

Wie funktioniert‘s? Free-Threaded Marshaller (FTM) Der FTM ist ein COM-Objekt, das ein “custom marshalling” zur Verfügung stellt. Auf alle Objekte, die den FTM benutzen, kann grundsätzlich direkt zugegriffen werden “mehr Speed”, aber: hebelt Synchronisations-Mechanismen von COM komplett aus!

Wie funktioniert‘s? Free-Threaded Marshaller (FTM) Objekte müssen threadsafe sein, um den FTM zu benutzen. Sofern “externe” Threads direkten Objekt-zugriff haben, kann COM die Zugriffe nicht synchronisieren! Der FTM sollte nicht von Objekten benutzt werden, die Objekte in anderen Apartments aufrufen. Callbacks können Deadlocks erzeugen Aufrufergebnis kann RPC_E_WRONG_THREAD sein

Allgemeine Hinweise Multi-Threading: RPC-Call, total blockierend Single-Threading: Messageloop Deshalb: Kein UI mit MTA!!! In-proc-Server (DLLs) werden beim Beenden des Prozesses „entsorgt“!! Alternative: CoFreeUnusedLibraries oder CoFreeAllLibraries aufrufen OLE32.DLL: COM-Runtime OLEAUT32.DLL: Automation, Standard-Marshalling

Wo gibt’s weitere Info’s? msdn online http://www.microsoft.com/germany/msdn Microsoft Systems Journal diverse Artikel, z.B. Heft 4/1997 (!) Bücher von WROX Press http://www.wrox.com Bücher von Microsoft Press Inside COM, Dale Rogerson Knowledge-Base-Artikel Q150777!!!

Fragen!? Uff...