Multithreading in C#.NET
|
|
- Daniel Adenauer
- vor 8 Jahren
- Abrufe
Transkript
1 Multithreading in C#.NET Proseminar Objektorientiertes Programmieren mit.net und C# Holger Stöcker 19. Dezember 2010
2 Inhaltsverzeichnis 1 Einführung 3 2 Grundlagen Was ist Multithreading? Was bietet der Einsatz von Multithreading? Was ist ein Thread? Threadzustände 4 4 Die Thread -Klasse in C#.NET 5 5 Synchronisation von Threads Beispiel eines unsychronisierten Programmes Synchronisation mit Monitor oder lock-statement Synchronisation mit ReaderWriterLockSlim Synchronisation mit MethodImpl-Attribut Der Einsatz von Threadpools und BackgroundWorker-Threads Threadpools BackgroundWorker-Threads Programmierbeispiel: Simulierter Mailserver Die SingleThread-Variante Die MultiThread-Variante Konkreter Vergleich der beiden Varianten Abschließende Zusammenfassung 16 9 Anhang Quellcode und Binärdateien des Mailserver-Beispiels Literaturverzeichnis Abbildungsverzeichnis
3 1 Einführung Wenn Sie sich heute einen neuen, modernen PC zulegen, enthält dieser sehr wahrscheinlich einen Mehrkernprozessor. Dieser ist in der Lage gleichzeitig auf jedem Kern ein eigenes Programm, häufig auch Prozess genannt, auszuführen. Was für uns heute als Selbstverständlichkeit gilt, war jedoch nicht immer so. Zu Zeiten von 16 bit Betriebssystemen wie MS-DOS [1], konnte immer nur ein Programm sequentiell ausgeführt werden. Diese Form der Prozessabarbeitung hatte erhebliche Nachteile, denn sobald sich ein einzelner Prozess aufhängte, lag der gesamte PC lahm. In dieser Seminararbeit möchte ich eine grundsätzliche Einführung in die Konzepte des Multithreadings machen. Dabei liegt der Schwerpunkt darauf, wie dieses Konzept ganz konkret in der Programmiersprache C#.NET umgesetzt werden kann. 2 Grundlagen 2.1 Was ist Multithreading? Oftmals werden die zwei Begriffe Multithreading und Multitasking nicht klar voneinander abgegrenzt. Multitasking bedeutet, dass mehrere Anwendungen Parallel ausgeführt werden können. Auf einem Prozessorkern können Tasks immer nur sequentiell ausgeführt werden, also immer nur ein Task gleichzeitig. Jedoch durch schnelles Wechseln der aktiven Anwendung auf dem Kern entsteht eine Scheinparallelität. Multithreading bedeutet, dass mehrere Threads innerhalb eines Prozesses parallel ausgeführt werden können, damit ein Prozess mehrere Dinge gleichzeitig ausführen kann. 2.2 Was bietet der Einsatz von Multithreading? Multithreading bringt an vielen Stellen Performance-Vorteile, denn in der Praxis gibt es sehr oft Threads, die z.b. auf das Beenden einer Methode oder auf andere Dinge warten müssen. In diesen Wartezeiten können nun problemlos andere Threads auf der CPU arbeiten, damit diese möglichst effektiv ausgelastet werden kann. Für manche Anwendungen ist es sogar erforderlich, dass mehrere Threads eingesetzt werden. In einer Applikation, in der es eine grafische Oberfläche gibt, kann jede Interaktion, die der Benutzer durchführt (z.b. mit der Maus auf eine Schaltfläche klicken) durch einen oder mehrere zusätzliche Threads durgeführt werden. Ein anderer möglicher Fall ist z.b. ein Mailserver. Würde dieser nur aus einem einzigen Thread bestehen, könnte er gleichzeitig immer nur eine Versende- oder Empfangstransaktion durchführen. Kommt es bei einer Transaktion zu einer Verzögerung, oder zu einem Fehler, müssen alle anderen s so lange warten, bis die erste tatsächlich versendet, empfangen oder der Fehler behoben wurde. Um dieses Problem zu umgehen, kann für jede zu versendende oder zu empfangende ein eigener Thread 3
4 erstellt werden. Verzögert sich dabei ein Transaktionsvorgang (z.b. aufgrund einer langsamen Netzwerkanbindung des Remot servers), kann während der Wartezeit einfach ein anderer Thread auf der CPU arbeiten und seine Aufgaben erledigen. In Kapitel 7 wird ein konkretes Code-Beispiel eines simulierten Mailservers vorgestellt, um dieses Problem und deren Lösung zu verdeutlichen. Der Einsatz von mehreren Threads innerhalb eines Prozesses bringt aber auch Probleme und Risiken mit sich. In der Praxis besteht sehr häufig die Anforderung, dass mehrere Threads gleichzeitig auf ein und dieselbe Ressource (z.b. ein Objekt) zugreifen möchten. Dazu müssen die verschiedenen Threads synchronisiert werden. Wie oben bereits erwähnt, kann auf einem Prozessorkern stets nur ein Thread ausgeführt werden. Wird ein Thread durch das Prinzip des Timesharings an einer Stelle unterbrochen, an der er z.b. den Wert einer Ressource ändern möchte, so kann es zu unerwarteten Ergebnissen kommen, wenn als nächstes ein anderer Thread die selbe Ressource verwenden möchte. Was sich genau hinter diesem Phänomen der Threadunsicherheit verbrigt und wie man dies verhindern kann, wird in Kapitel 5 näher erläutert. 2.3 Was ist ein Thread? In den vorhergehenden Kapiteln taucht des Öfteren der Begriff Thread auf. Doch was verbirgt sich eigentlich dahinter? Als Thread wird ein Ausführungsstrang oder eine Ausführungsreihenfolge innerhalb eines Prozesses bezeichnet. Jeder Thread bekommt während seiner Initialisierungsphase einen eigenen, unabhängigen Stapel (Stack) im Arbeitsspeicher zugewiesen [2]. Threads besitzen bestimmte Eigenschaften, wie z.b. Zustände. 3 Threadzustände Jeder Thread, der erzeugt wird, befindet sich immer in einem bestimmten Zustand. Die folgende Grafik soll einen kurzen Überblick sowie die Zusammenhänge der verschiedenen Threadzustände geben. 4
5 Abbildung 1: Die verschiedenen Threadzustände im Überblick In der folgenden Auflistung sind die einzelnen Zustände nochmals etwas detaillierter beschrieben: Ready: Ausführungsbereit. Standby: Nächster Thread der ausgeführt werden soll. Running: Thread, der gerade aktiv ist. Waiting: Thread, der (meist auf eine I/O-Ressource) wartet. Transition: Ausführungsbereit, aber Kernel Stack des Threads ist nicht im Speicher verfügbar ist. Terminated: Thread, der seine Arbeit beendet hat. Initialized: Zustand, während ein Thread erzeugt wird. 4 Die Thread -Klasse in C#.NET In.NET werden alle Threads durch die Klasse Thread im Namensraum System.Threading repräsentiert. Das folgende Codebeispiel zeigt, wie ganz einfach ein neuer Thread erzeugt werden kann: 5
6 1 using System.Threading; 2 3 class Program 4 { 5 private static void Main(string[] args) 6 { 7 Thread thread1 = new Thread(new ThreadStart(Execute)); 8 thread1.start(); 9 10 Thread thread2 = new Thread(new ParameterizedThreadStart( Execute_Param)); 11 thread1.start(new Object()); 12 } public void Execute() 15 { 16 // DO SOMETHING } public void Execute_Param(Object param) 20 { 21 // DO SOMETHING } 23 } Der Konstruktor von Thread erwartet als Parameter ein ThreadStart-Objekt, bzw. ein Objekt vom Typ ParameterizedThreadStart. Diesem Objekt wird dann als Parameter der Name einer Methode übergeben, welche der Thread ausführen soll. Mit der Start()-Methode wird der Thread schließlich tatsächlich gestartet. In diesem Moment wird der neue Thread erzeugt und er reiht sich in die Schlange der Threads ein, die darauf warten vom Prozesssteuerprogramm (Scheduler) Prozessorzeit zugewiesen zu bekommen. Im Falle eines parametrisierten Thread-Starts wird dem ParameterizedThreadStart-Objekt als Parameter der Name einer Methode übergeben, welche der Thread ausführen soll. Der Tatsächliche Parameter wird jedoch an die Start()-Methode übergeben. Er muss vom Typ Object sein. Neben Start() gibt es noch einige andere Methoden, die auf einem Objekt der Klasse Thread aufgerufen werden können. Einige von ihnen sind in der Praxis relevanter als andere. Ein besonderes Augenmerk möchte ich jedoch auf die Methode Sleep() richten. Als Parameter wird ein Integer übergeben, der die Anzahl an Millisekunden angibt, die der Thread schlafen gelegt werden soll. Ein schlafender Thread wird in den Zustand Waiting versetzt. Ist die Wartezeit verstrichen so reiht er sich wieder in die Warteschlange ein. Im Folgenden befindet sich eine Übersicht über die wichtigsten Methoden, die auf einem Objekt der Klasse Thread aufgerufen werden können: Start(): Startet einen Thread. Start(Object obj): Parametrisierter Start eines Threads. Sleep(int milliseconds): Legt Thread für eine bestimmte Zeit schlafen. 6
7 Sleep(Timeout.Infinite): Legt Thread auf unbestimmte Zeit schlafen. Interrupt(): Weckt schlafenden Thread auf. Suspend() : Hält einen anderen Thread an. Resume(): Setzt angehaltenen Thread fort. Abort(): Zwingt anderen Thread zum Beenden. Join(): Blockiert den aufrufenden Thread, bis der andere Thread terminiert ist. Objekte der Klasse Thread besitzen auch bestimmte Attribute. Die vier wichtigsten davon sind Priority, isbackground, isalive und ThreadState. Mit diesen lassen sich die Werte der Priorität, des Threadtyps (Hinter- oder Vordergrungthread), des Ausführungsstatus und des aktuellen Threadzustandes auslesen, bzw. teilweise auch verändern. 5 Synchronisation von Threads Jedes moderne Betriebssystem nutzt das Prinzip des Timesharings. Dies bedeutet, dass jeder Thread eine bestimmte Rechenzeit auf der CPU zugeteilt bekommt. Nach Ablauf dieser Zeit wird der Thread unterbrochen, ein anderer Thread kommt zur Ausführung und die unterbrochene Thread reiht sich wieder in die Warteschlange ein, um irgendwann seine Ausführung fortzusetzen. Wird nun ein Thread genau dann unterbrochen, während er eine gemeinsam genutzte Ressource (z.b. ein Objekt) verändern möchte, seinen Vorgang jedoch noch nicht abgeschlossen hat und nun ein anderer Thread ebenfalls auf die Ressource zugreifen möchte, kann es passieren, dass das Objekt in einem ungültigen Zustand hinterlassen wird. Eine Folge von Operationen, die notwendig ist, um einen Bearbeitungsvorgang einer Ressource vollständig abzuschließen, heißt atomare Einheit oder kritischer Bereich. Um sicherzustellen, dass eine solche atomare Einheit immer erst komplett ausgeführt wird, bevor ein anderer Thread wieder auf die gemeinsam genutzte Ressource zugreifen kann, gibt es unterschiedliche Möglichkeiten in.net. Einige davon sind in den folgenden Unterkapiteln anhand von kleinen Code-Beispielen genauer erklärt. 7
8 5.1 Beispiel eines unsychronisierten Programmes Die Grundproblematik, die durch den Zugriff mehrerer Threads auf ein und dieselbe Ressource entsteht, wird durch das folgende Beispiel erläutert: 1 class Program { 2 private static void Main(string[] args) { 3 ExecClass obj = new ExecClass(); 4 Thread thread1 = new Thread(new ThreadStart(obj.Execute)); 5 Thread thread2 = new Thread(new ThreadStart(obj.Execute)); 6 thread1.start(); 7 thread2.start(); 8 } 9 } Bei Programmstart wird ein neues Objekt der Klasse ExecClass erzeugt. Zusätzlich werden zwei Threads erstellt, jedem der beiden Threads wird die Methode Execute als Parameter übergeben und beide Threads werden gestartet. Die Klasse Program wird auch in allen anderen Unterkapiteln des Kapitels 5 als gegeben vorausgesetzt. 1 class ExecClass { 2 // global ressource 3 private int counter = 0; 4 5 public void Execute() { 6 for (int i = 0; i < 10; i++) { 7 counter++; 8 Console.WriteLine(counter); 9 } 10 } 11 } Die Klasse ExecClass enthält zum einen eine private Variable counter, die als gemeinsam genutzte Ressource verwendet werden soll und zum anderen die Methode Execute, die die counter-variable 10-mal inkrementiert und jeweils dessen Wert ausgibt. Nun testen wir unser Programm und erhalten folgende oder eine ähnliche Ausgabe: Wir erkennen eindeutig, dass unser Programm nicht die erwartete Ausgabe der aufsteigend sortierten Zahlen von eins bis zehn zurückliefert, da die counter-variable ja Schritt für Schritt inkrementiert wird und direkt im Anschluss ausgegeben wird. Der in der Ausgabe ersichtlich gewordene Fehler ist dadurch entstanden, dass jeder Thread nur eine bestimmte 8
9 Zeit auf der CPU rechnen darf. Ist die Zeit abgelaufen, wird er unterbrochen und er muss sich wieder in die Warteschleife einordnen um später seine Ausführung fortzusetzen. Wird in unserem Beispiel ein Thread nun genau in dem Moment unterbrochen, in dem die Variable zwar bereits erhöht, der Wert jedoch noch nicht auf die Konsole geschrieben wurde, kommt es zu solchen Fehlern, wie sie in unserer Ausgabe zu sehen sind. 5.2 Synchronisation mit Monitor oder lock-statement Damit der eben beschriebene Fehler vermieden, bzw. verhindert wird, müssen alle Methoden, die die gemeinsam genutzte Ressource verändern wollen synchronisiert werden. Das bedeutet, solange sich ein Thread in einem Bearbeitungsprozess der Ressource befindet, müssen alle anderen Threads warten, bis der Vorgang angeschlossen ist und die Ressource wieder frei ist. Das folgende Beispiel zeigt den Einsatz der Monitor-Klasse als erste Möglichkeit in.net, mit der eine solche Synchronisation erreicht werden kann: 1 class ExecClass { 2 // global ressource 3 private int counter = 0; 4 5 public void Execute() { 6 for (int i = 0; i < 10; i++) { 7 Monitor.Enter(this); // lock object 8 counter++; 9 Console.WriteLine(counter); 10 Monitor.Exit(this); // unlock object 11 } 12 } 13 } Im Vergleich zum Beispiel der unsychronisierten Umsetzung, wurden lediglich zwei Zeilen hinzugefügt (Zeile 7 und 10). Es wird an diesen beiden Stellen direkt auf ein Monitor- Objekt zugegriffen. Dies ist möglich, da es für jedes beliebige Objektinstanz automatisch genau einen Monitor gibt. Es kann daher auch keine Instanz der Klasse Monitor erstellt werden. Mit den Methoden Enter() und Exit() wird der Zugriff auf das Objekt gesperrt, bzw. wieder freigegeben. Als Parameter wird in diesem Fall jeweils die aktuelle Instanz der Klasse ExecClass übergeben. Nun betrachten wir erneut die Ausgabe:
10 Wir sehen, dass die Ausgabe nun stimmt und die Zahlen, wie erwartet, aufsteigend sortiert ausgegeben werden. Der Methodenaufruf erfolgt nun also synchron. Eine weitere Option, um Synchronisation zu erreichen, ist das Verwenden des lock-statements, wie es im folgenden Beispiel zum Einsatz kommt: 1 class ExecClass { 2 // global ressource 3 private int counter = 0; 4 5 public void Execute() { 6 for (int i = 0; i < 10; i++) { 7 lock(this) { // lock object 8 counter++; 9 Console.WriteLine(counter); 10 } // unlock object 11 } 12 } 13 } Auch hier gibt es nur eine kleine Änderung am Programm-Code, ebenfalls in den Zeilen 7 und 10. Das lock-statement verwendet intern ebenfalls die im vorherigen Beispiel erwähnte Monitor-Klasse und ist daher keine komplett neue Art der Synchronisation. Allerdings gibt es zwei entscheidende Vorteile. Zum einen wird der Bereich, der synchronisiert werden soll (der kritische Bereich) in einem sogenannten Wirkungsbereich (Scope) geschachtelt. Dies ist sinnvoll, denn wenn der Bereich nicht mit einer geschweiften Klammer wieder geschlossen wird, gibt es bereits zur Zeit des Kompilierens einen Fehler. Bei Verwendung des Monitors, kann es also einfach passieren, dass man den Aufruf der Exit()- Methode vergisst, oder dieser Aufruf aufgrund eines Programmfehlers nicht stattfindet. In beiden Fällen wird das gesperrte Objekt nicht mehr freigegeben. Als weiteren Vorteil ergibt sich die Tatsache, dass das lock-statement intern den kritischen Bereich automatisch in einen try-finally-block einbindet. Das bedeutet, dass falls es zu einem Programmfehler kommt, während ein Objekt gesperrt ist, wird im finally-teil die Sperre in jedem Fall wieder aufgehoben, damit andere Threads wieder auf des Objekt zugreifen können. Insgesamt bietet das Monitor-Konzept, bzw. das lock-statement eine schnelle und einfache Art und Weise, mit der Synchronisation erreicht werden kann. In einigen Fällen eignen sich jedoch andere von.net bereitgestelle Klassen und Methoden besser, wie z.b. die im nächsten Kapitel beschriebene ReaderWriterLockSlim-Methode. 5.3 Synchronisation mit ReaderWriterLockSlim Mit dem.net-framework 2.0 hat Microsoft die Klasse ReaderWriterLock eingeführt. Dies ist die Vorgängerklasse der neuen ReaderWriterLockSlim-Klasse, die mit dem.net- Framework 3.5 eingeführt wurde und von Microsoft für jede Neuentwicklung empfohlen wird, da diese Klasse eine deutlich höhere Leistung bringt und sie zudem einige Mechanismen enthält, die eine Vielzahl potentieller Deadlocks vermeiden kann [3]. Im Folgenden befindet sich ein kurzes Code-Beispiel: 10
11 1 class ExecClass { 2 // global ressource 3 private ReaderWriterLockSlim lockobj = new ReaderWriterLockSlim(); 4 private int counter = 0; 5 6 public void Execute() { 7 for (int i = 0; i < 10; i++) { 8 try { 9 lockobj.enterwritelock(); // lock object 10 counter++; 11 Console.WriteLine(counter); 12 } 13 finally { 14 lockobject.exitwritelock(); // unlock object 15 } 16 } 17 } 18 } In Zeile 3 wird ein neue Objekt mit dem Namen lockobj eingeführt. Es ist vom Typ ReaderWriterLockSlim und dient lediglich als Objekt, das gesperrt wird, sobald der kritische Bereich betreten wird. Der Sperr- bzw. Entsperrvorgang erfolgt mit den Methoden EnterWriteLock() und ExitWriteLock(). Interessant ist diese Form der Synchronisation, weil sie besonders für Szenarien geeignet ist, in denen es viele lesende Zugriffe und wenig schreibende Zugriffe auf die gemeinsam genutzte Ressource gibt. Denn es kann mit den Methoden EnterReadLock() und ExitReadLock() ein Schreibzugriff angefordert werden. Solange kein Schreibzugriff angefordert ist, kann von beliebig vielen Threads gleichzeitig gelesen werden. Sobald ein Schreibzugriff stattfindet, müssen die anderen lesenden oder auch anderen schreibenden Threads warten. Es können also gleichzeitig immer nur beliebig viele lesen oder genau einer schreiben. Besonders beim Zugriff auf Datenquellen wie Dateien oder Datenbanken ist ein solchen Konzept sehr sinnvoll und effizient. 5.4 Synchronisation mit MethodImpl-Attribut Wir betrachten zunächst ein kleines Beispiel: 1 using System.Runtime.CompilerServices; 2 3 class ExecClass { 4 // global ressource 5 private int counter = 0; 6 7 [MethodImpl(MethodImplOptions.Synchronized)] 8 public void Execute() { 9 for (int i = 0; i < 10; i++) { 10 counter++; 11 Console.WriteLine(counter); 12 } 13 } 14 } 11
12 Die benötigten Attribute befinden sich im Namespace System.Runtime.CompilerServices. Sobald eine Methode mit dem in Zeile 7 beschriebenen Attribut versehen wird, wird immer die gesamte Methode synchronisiert aufgerufen. Dies entspricht in etwa dem synchronized- Attribut in der Signatur einer Methode in Java. 6 Der Einsatz von Threadpools und BackgroundWorker-Threads Zwei andere sehr komfortable Konzepte in.net sind ThreadPools sowie BackgroundWorker- Threads. Ein Threadpool ist eine Threadauflistung, mit der verschiedene Aufgaben im Hintergrund ausgeführt werden können. Auf diese Weise kann der primäre Thread asynchron andere Aufgaben ausführen [4]. Die BackgroundWorker-Klasse ermöglicht das Ausführen eines Vorgangs auf einem separaten, dedizierten Thread [5]. 6.1 Threadpools Ein ThreadPool ist eine Menge von Threads, die bei jedem Prozess in.net automatisch zur Verfügung stehen. Das Erzeugen eines neuen Threads ist kostspielig, weil jeder Thread seinen eigenen Stapelspeicher (Stack) benötigt. Die Idee hinter dem ThreadPool ist, dass diese Threads permanent im Hintergrund existieren und darauf warten, als Delegate benutzt zu werden und asynchron und unabhängig vom Vordergrundthread Aufgaben zu erledigen. Einen solchen Thread kann man mit der Methode QueueUserWorkItem() anfordern. Diese Methode erwartet als Parameter eine Methode, die der ThreadPool-Thread aufrufen soll. Sobald ein neuer Arbeitsauftrag eingereicht wurde, kann er nicht mehr abgebrochen werden. Ist zur Zeit der Anforderung kein Thread im Pool frei, so wird mit der Ausführung so lange gewartet, bis ein Thread wieder frei ist. Die folgende Grafik veranschaulicht die Funktionsweise eines ThreadPools: Abbildung 2: Funktionsweise eines ThreadPools 12
13 6.2 BackgroundWorker-Threads Ein BackgroundWorker-Thread kommt in der Praxis sehr oft in Kombination mit einer grafischen Oberfläche (GUI) zum Einsatz. Ein typisches Szenario ist das Erledigen einer Aufgabe im Hintergrund, wie z.b. ein Kopier- oder Installationsvorgang. Damit die grafische Oberfläche weiterhin reagieren kann, wird die zu erledigende Arbeit einfach in einem BackgroundWorker-Thread ausgeführt. Im Vordergrund wird dann beispielsweise der aktuelle Fortschritt des Arbeitsvorganges in Form einer StatusBar ausgegeben. Mit dieser speziellen Klasse stehen dem Benutzer zusätzliche Optionen zur Verfügung. So kann der aktuelle Status und der Fortschritt des Arbeitsvorganges abgerufen und überprüft werden. Dem Programmierer stehen dazu unter anderem die Ereignisse DoWork, RunWoker- Completed und ProgressChanged zur Verfügung. Ein BackgroundWorker-Thread ist immer dann besonders sinnvoll, wenn nur wenige oder nur ein einzelner Hintergrund-Thread benötigt wird. Ein ThreadPool ist dagegen sinnvoller, wenn es viele kleine Aufgaben sind, die im Hintergrund erledigt werden sollen. 7 Programmierbeispiel: Simulierter Mailserver Zum Abschluss dieser Arbeit möchte ich ein konkretes Beispiel vorstellen, an dem ersichtlich wird, in welchen Fällen der Einsatz von Multithreading nicht nur sinnvoll, sondern auch absolut erforderlich ist. In Kapitel 2.2 habe ich die Problematik bei einem Mailserver erwähnt. Genau dieses Beispiel möchte ich nun in Form einer Simulation demonstrieren. 7.1 Die SingleThread-Variante Folgender Programm-Code zeigt eine abstrahierte Version eines Mailservers, der auf Tastatureingaben (simulierte eingehende s) wartet und diese dann verschickt. Der Sendevorgang wird durch ein Thread.Sleep() simuliert. Dabei soll die Dauer des Vorgangs zwischen 100 Millisekunden und 2 Sekunden liegen (hier durch einen Zufallsgenerator implementiert). In dieser ersten Variante wird der Wartevorgang auf eingehende s sowie der Sendevorgang über einen einzigen Thread realisiert. Es handelt sich also um die SingleThread-Variante: 13
14 1 class Program { 2 public static void Main(string[] args) { 3 Console.WriteLine("Listening for incoming messages..."); 4 while (true) { // loop for listening for incoming messages 5 string inputstring = Console.ReadLine(); 6 Send (inputString); 7 } 8 } 9 10 // simulates sending an 11 public static void Send (object messageargs) { 12 int randomint = new Random().Next(100, 2000); 13 Thread.Sleep(randomInt); // simulated time for sending 14 Console.WriteLine("Message ({0}) successful send in {1} ms.", messageargs, randomint); 15 } 16 } Betrachten wir nun was passiert, wenn wir der Reihe nach auf der Tastatur die Zahlen eins bis null eingeben: Abbildung 3: Simulierter Mailserver mit einem einzigen Thread Wir können erkennen, dass eine neue Nachricht immer erst wieder eingegeben werden kann, wenn die vorherige versendet worden ist. Das hat den Nachteil, dass alle nahezu gleichzeitig eintreffenden s lediglich nacheinander eingelesen und versendet werden können. Dauert nun ein einzelner Sendevorgang nun unverhältnismäßig lange, so müssen alle anderen s warten, bis dieser Vorgang abgeschlossen ist. Dieses Verhalten ist für große Dienstleister natürlich absolut unpraktikabel, deren Server vermutlich über 100 s pro Minute verarbeiten müssen. 14
15 7.2 Die MultiThread-Variante Wir verändern nun unser obiges Code-Beispiel und passen es so an, dass für jeden Sendevorgang ein eigener Thread erstellt wird. Dazu ersetzen wir die Zeile 6 mit folgenden zwei Zeilen: 1 Thread mailsender = new Thread(new ParameterizedThreadStart(Send )); 2 mailsender.start(inputstring); Durch diese minimale Anpassung des Codes verändert sich die Funktionsweise drastisch. Wir betrachten wieder die mögliche Ausgabe, die entsteht, wenn wir wieder die Zahlen eins bis zehn aufsteigend eingeben: Abbildung 4: Simulierter Mailserver mit mehreren Threads Als erstes fällt auf, dass erst sechs s eingehen, bevor eine davon raus geschickt wurde. Weiterhin sehen wir, dass Nachricht Nr. 4 als erstes verschickt wurde, bzw. dass die Sendereihenfolge grunsätzlich nicht der Reihenfolge entspricht, in der die s beim Mailserver eingehen. Genau dieses Verhalten haben wir durch den Einsatz mehrerer Threads bewirkt, denn jede , die eingeht kann in einem neuen Thread nahezu sofort versendet werden. Um dem Ganzen noch etwas mehr Praxis zu verleihen, wird im folgenden Unterkapitel ein konkreter Test mit Zeitmessung vorgenommen, der den Unterschied der beiden Varianten nochmals in Zahlen ausdrückt. 15
16 7.3 Konkreter Vergleich der beiden Varianten In diesem Test wird die Eingabe der zehn Nachrichten über ein externes Programm gelöst, damit das Eingehen der s in jedem Einzeltest nahezu gleich schnell erfolgt. Gemessen wurde nun die Zeit, die mit dem Eingehen der ersten beginnt und mit dem Versenden der letzten endet. Aufgrund der zufällig generierten Wartezeit, die das Versenden der s simuliert, wurden beide Varianten des Mailservers 5-mal getestet und ein Durchschnittswert gebildet. Die Messergebnisse sind in der folgenden Tabelle übersichtlich dargestellt: Versuch Single-Thread Multi-Thread 1 13,94 s 2,44 s 2 11,39 s 2,35 s 3 12,97 s 2,54 s 4 11,23 s 2,75 s 5 6,28 s 2,27 s 11,16 s 2,47 s Die Ergebnisse fallen, wie erwartet aus. Die MultiThread-Variante kann alle s deutlich schneller versenden, als die SingleThread-Variante, da bei dieser ja die s nur nacheinander eingehen und nacheinander versendet werden können. Der Unterschied ist jedoch beträchtlich. Im Schnitt braucht die SingleThread-Variante ca. 4,5x länger als die MultiThread-Variante. Dieses Beispiel verdeutlicht sehr eindeutig, dass das einsetzen mehrerer Threads in einigen Anwendungen erhebliche Leistungssteigerungen bringt. In unserem Beispiel wurde eine Verkürzung auf ca. 22% der ursprünglichen Laufzeit gemessen. 8 Abschließende Zusammenfassung Das Thema Multithreading hat in Zeiten des 21. Jahrhunderts eine hohe Relevanz. Einzelne Prozesse können unmittelbar vom Einsatz Multicore-fähiger Systeme profitieren und einen solchen Prozessor mit mehreren CPUs besser auslasten. Gerade bei Anwendung, die aufwändige Berechnungen druchführen oder viele Dinge gleichzeitig erledigen müssen, ist durch Multithreading ein Leistungsvorteil erreichbar. Der aktuelle Trend der Prozessorentwicklung geht noch viel stärker in Richtung Multicore-Systeme. Führende Prozessorhersteller haben bereits Prototypen mit über 100 Rechenkernen entwickelt. Es ist also zu erwarten, dass in den kommenden Jahren das Thema Multithreading von noch größerer Bedeutung sein wird. Auch bei allen positiven Aspekten und Leistungsoptimierungen, die erreicht werden können, sind die damit verbundenen Probleme und Risiken zu beachten. Anwendungen, die mehrere Threads verwenden, sind extrem fehleranfällig beim gleichzeitigen Zugriff auf eine Ressource. Auch bringen mehrerer Threads in einer Anwendung, die ohnehin keine Aufgaben parallel erledigen kann, keine Vorteile. Ob Multithreading genutzt werden soll oder nicht, muss letztendlich der Programmierer entscheiden. 16
17 9 Anhang 9.1 Quellcode und Binärdateien des Mailserver-Beispiels Die Quelldateien befinden sich in Form eines Microsoft Visual Studio 2010 Projekts in der Datei Mailserver src.zip. Die Birärdateien befinden sich in der Datei Mailserver bin.zip. Es ist sowohl die SingleThreadals auch die MultiThread-Variante darin enthalten. 9.2 Literaturverzeichnis Folgende Quellen wurden für das Erstellen der Seminararbeit verwendet: [1] Vorl. 6: Single- und Multitasking, [ zuletzt geändert am: ], [2] Thread (Informatik), [ zuletzt geändert am: ], (Informatik) [3] ReaderWriterLock-Klasse, [ zuletzt geändert am: ], [4] Gewusst wie: Verwenden von Threadpools, [ zuletzt geändert am: ], [5] Gewusst wie: Verwenden von Threadpools, [ zuletzt geändert am: ], Abbildungsverzeichnis Folgende Abbildungen wurden in der Seminararbeit verwendet: [Abb. 1] [Abb. 2] Laurent Haan: Multithreading in C#, [ zuletzt geändert am: ], Threads und Prioritaetsklassen Threads Thread Status Laurent Haan: Multithreading in C#, [ zuletzt geändert am: ] multithreading-in-csharp.html#multithreading in DotNET ThreadPool und asynchrone Methoden ThreadPool 17
Suche schlecht beschriftete Bilder mit Eigenen Abfragen
Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere
MehrDatensicherung. Beschreibung der Datensicherung
Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten
MehrObjektorientierte Programmierung für Anfänger am Beispiel PHP
Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten
MehrMulti-Threading. Ralf Abramowitsch Vector Informatik GmbH abramowitsch@lehre.dhbw-stuttgart.de
Multi-Threading Ralf Abramowitsch Vector Informatik GmbH abramowitsch@lehre.dhbw-stuttgart.de Einführung in Threads Threads synchronisieren ThreadPools Thread = unabhängiger Ausführungspfad, der gleichzeitig
MehrSysteme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss
Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige
MehrÜbung: Verwendung von Java-Threads
Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum
MehrTTS - TinyTimeSystem. Unterrichtsprojekt BIBI
TTS - TinyTimeSystem Unterrichtsprojekt BIBI Mathias Metzler, Philipp Winder, Viktor Sohm 28.01.2008 TinyTimeSystem Inhaltsverzeichnis Problemstellung... 2 Lösungsvorschlag... 2 Punkte die unser Tool erfüllen
Mehricloud nicht neu, aber doch irgendwie anders
Kapitel 6 In diesem Kapitel zeigen wir Ihnen, welche Dienste die icloud beim Abgleich von Dateien und Informationen anbietet. Sie lernen icloud Drive kennen, den Fotostream, den icloud-schlüsselbund und
MehrSoftwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch
Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen Alexander Schunk Henry Trobisch Inhalt 1. Vergleich der Unit-Tests... 2 2. Vergleich der Codeabdeckungs-Tests... 2 3. Vergleich
MehrLineargleichungssysteme: Additions-/ Subtraktionsverfahren
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als
MehrOutlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang
sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche
MehrArchitektur Verteilter Systeme Teil 2: Prozesse und Threads
Architektur Verteilter Systeme Teil 2: Prozesse und Threads 21.10.15 1 Übersicht Prozess Thread Scheduler Time Sharing 2 Begriff Prozess und Thread I Prozess = Sequentiell ablaufendes Programm Thread =
Mehr! " # $ " % & Nicki Wruck worldwidewruck 08.02.2006
!"# $ " %& Nicki Wruck worldwidewruck 08.02.2006 Wer kennt die Problematik nicht? Die.pst Datei von Outlook wird unübersichtlich groß, das Starten und Beenden dauert immer länger. Hat man dann noch die.pst
MehrGrundlagen verteilter Systeme
Universität Augsburg Insitut für Informatik Prof. Dr. Bernhard Bauer Wolf Fischer Christian Saad Wintersemester 08/09 Übungsblatt 3 12.11.08 Grundlagen verteilter Systeme Lösungsvorschlag Aufgabe 1: a)
MehrProfessionelle Seminare im Bereich MS-Office
Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion
MehrHandbuch Fischertechnik-Einzelteiltabelle V3.7.3
Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3
MehrJava: Vererbung. Teil 3: super() www.informatikzentrale.de
Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und
MehrUrlaubsregel in David
Urlaubsregel in David Inhaltsverzeichnis KlickDown Beitrag von Tobit...3 Präambel...3 Benachrichtigung externer Absender...3 Erstellen oder Anpassen des Anworttextes...3 Erstellen oder Anpassen der Auto-Reply-Regel...5
MehrIhre Interessentendatensätze bei inobroker. 1. Interessentendatensätze
Ihre Interessentendatensätze bei inobroker Wenn Sie oder Ihre Kunden die Prozesse von inobroker nutzen, werden Interessentendatensätze erzeugt. Diese können Sie direkt über inobroker bearbeiten oder mit
MehrIn 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC
PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Stephan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0) 761 59018201 Fax +49 (0) 761 59018130 Internet www.paragon-software.com Email sales@paragon-software.com
Mehr40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.
40-Tage-Wunder- Kurs Umarme, was Du nicht ändern kannst. Das sagt Wikipedia: Als Wunder (griechisch thauma) gilt umgangssprachlich ein Ereignis, dessen Zustandekommen man sich nicht erklären kann, so dass
MehrBinäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen
Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders
MehrInhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER
AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER Inhalt 1 Einleitung... 1 2 Einrichtung der Aufgabe für die automatische Sicherung... 2 2.1 Die Aufgabenplanung... 2 2.2 Der erste Testlauf... 9 3 Problembehebung...
MehrMonitore. Klicken bearbeiten
Sascha Kretzschmann Institut für Informatik Monitore Formatvorlage und deren Umsetzung des Untertitelmasters durch Klicken bearbeiten Inhalt 1. Monitore und Concurrent Pascal 1.1 Warum Monitore? 1.2 Monitordefinition
MehrProgrammierkurs Java
Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen
MehrFachbericht zum Thema: Anforderungen an ein Datenbanksystem
Fachbericht zum Thema: Anforderungen an ein Datenbanksystem von André Franken 1 Inhaltsverzeichnis 1 Inhaltsverzeichnis 1 2 Einführung 2 2.1 Gründe für den Einsatz von DB-Systemen 2 2.2 Definition: Datenbank
MehrBerechnungen in Access Teil I
in Access Teil I Viele Daten müssen in eine Datenbank nicht eingetragen werden, weil sie sich aus anderen Daten berechnen lassen. Zum Beispiel lässt sich die Mehrwertsteuer oder der Bruttopreis in einer
MehrNach der Installation kann es auch schon losgehen. Für unseren Port Scanner erstellen wir zunächst ein neues Projekt:
Ein Port Scanner ist eine gute Möglichkeit den eigenen Server auf offene Ports zu scannen. Zu viele nicht benötigte und offene Ports können auf Ihrem Server und auf Ihrem Computer ein Sicherheitsrisiko
MehrDelegatesund Ereignisse
Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses
Mehrec@ros2-installer ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Eschenweg 7 64331 Weiterstadt
ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Inhaltsverzeichnis 1 Download des ecaros2-installer...3 2 Aufruf des ecaros2-installer...3 2.1 Konsolen-Fenster (Windows)...3 2.2 Konsolen-Fenster
MehrFolgeanleitung für Klassenlehrer
Folgeanleitung für Klassenlehrer 1. Das richtige Halbjahr einstellen Stellen sie bitte zunächst das richtige Schul- und Halbjahr ein. Ist das korrekte Schul- und Halbjahr eingestellt, leuchtet die Fläche
MehrDatenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware
Datenübernahme von HKO 5.9 zur Advolux Kanzleisoftware Die Datenübernahme (DÜ) von HKO 5.9 zu Advolux Kanzleisoftware ist aufgrund der von Update zu Update veränderten Datenbank (DB)-Strukturen in HKO
MehrDer PDF-Druck. EDIORG Software GmbH, Linz
Der PDF-Druck Der Makler hat nun auch die Möglichkeit, ein als PDF generiertes Angebot per E-Mail 1. als Anhang oder 2. als Link zu versenden oder 3. wie bisher das PDF über WORD zu generieren. Es soll
MehrBedienungsanleitung für den SecureCourier
Bedienungsanleitung für den SecureCourier Wo kann ich den SecureCourier nach der Installation auf meinem Computer finden? Den SecureCourier finden Sie dort, wo Sie mit Dateien umgehen und arbeiten. Bei
Mehr2. Einrichtung der ODBC-Schnittstelle aus orgamax (für 32-bit-Anwendungen)
1. Einführung: Über den ODBC-Zugriff können Sie bestimmte Daten aus Ihren orgamax-mandanten in anderen Anwendungen (beispielsweise Microsoft Excel oder Microsoft Access) einlesen. Dies bietet sich beispielsweise
MehrSie befinden sich hier: WebHosting-FAQ E-Mail E-Mail-Clients - Einrichtung und Konfiguration Outlook Express Artikel #1
Sie befinden sich hier: WebHosting-FAQ E-Mail E-Mail-Clients - Einrichtung und Konfiguration Outlook Express Artikel #1 Outlook Express Hinweis: Die nachfolgende Beschreibung dient der Einrichtung eines
MehrDELFI. Benutzeranleitung Dateiversand für unsere Kunden. Grontmij GmbH. Postfach 34 70 17 28339 Bremen. Friedrich-Mißler-Straße 42 28211 Bremen
Grontmij GmbH Postfach 34 70 17 28339 Bremen Friedrich-Mißler-Straße 42 28211 Bremen T +49 421 2032-6 F +49 421 2032-747 E info@grontmij.de W www.grontmij.de DELFI Benutzeranleitung Dateiversand für unsere
Mehrschnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv
Roboter programmieren mit NXC für Lego Mindstorms NXT 1. Auflage Roboter programmieren mit NXC für Lego Mindstorms NXT schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv Verlag
MehrACHTUNG: Voraussetzungen für die Nutzung der Funktion s-exposé sind:
ACHTUNG: Voraussetzungen für die Nutzung der Funktion s-exposé sind: - Upgrade auf FLOWFACT Version Performer CRM 2014 R2 (ab Juli erhältlich) - Mindestens SQL Server 2005 - vorhandene Installation von.net
MehrHilfedatei der Oden$-Börse Stand Juni 2014
Hilfedatei der Oden$-Börse Stand Juni 2014 Inhalt 1. Einleitung... 2 2. Die Anmeldung... 2 2.1 Die Erstregistrierung... 3 2.2 Die Mitgliedsnummer anfordern... 4 3. Die Funktionen für Nutzer... 5 3.1 Arbeiten
Mehr2A Basistechniken: Weitere Aufgaben
2A Basistechniken: Weitere Aufgaben 2A.3 Programmierung unter UNIX/Linux 1. Gegeben sind einige Ausschnitte von C-Programmen, die unter UNIX/Linux ausgeführt werden sollen. Beantworten Sie die zugehörigen
MehrEinrichtung des Cisco VPN Clients (IPSEC) in Windows7
Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Diese Verbindung muss einmalig eingerichtet werden und wird benötigt, um den Zugriff vom privaten Rechner oder der Workstation im Home Office über
MehrDOKUMENTATION VOGELZUCHT 2015 PLUS
DOKUMENTATION VOGELZUCHT 2015 PLUS Vogelzucht2015 App für Geräte mit Android Betriebssystemen Läuft nur in Zusammenhang mit einer Vollversion vogelzucht2015 auf einem PC. Zusammenfassung: a. Mit der APP
MehrKontoname ist Mailanschrift ohne @ecosign.net! Maximale Mailboxgrösse: Maximale Nachrichtengrösse: Haltezeit der Nachrichten:
Serverdaten: @ecosign.net Mailserver: Webmail: POP3: SMTP: http://webmail.ecosign.net pop.ecosign.net smtp.ecosign.net Kontoname ist Mailanschrift ohne @ecosign.net! Nutzung: Maximale Mailboxgrösse: Maximale
MehrAnwenderdokumentation AccountPlus GWUPSTAT.EXE
AccountPlus Inhaltsverzeichnis Inhaltsverzeichnis Anwenderdokumentation AccountPlus GWUPSTAT.EXE (vorläufig) ab Version 6.01 INHALTSVERZEICHNIS...1 1 ALLGEMEINES...2 2 INSTALLATION UND PROGRAMMAUFRUF...2
MehrEine Anleitung, wie Sie Mozilla Thunderbird 2 installieren und konfigurieren können. Installation... 2. Erstkonfiguration... 4
E-Mail-Client Mozilla Thunderbird für Studierende Installation und Einrichtung Mozilla Thunderbird ist ein Open-Source-E-Mail-Programm und -Newsreader des Mozilla-Projekts. Es ist neben Microsoft Outlook
MehrObjektorientierte Programmierung
Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum
MehrWindows 8 Lizenzierung in Szenarien
Windows 8 Lizenzierung in Szenarien Windows Desktop-Betriebssysteme kommen in unterschiedlichen Szenarien im Unternehmen zum Einsatz. Die Mitarbeiter arbeiten an Unternehmensgeräten oder bringen eigene
MehrOnline-Prüfungs-ABC. ABC Vertriebsberatung GmbH Bahnhofstraße 94 69151 Neckargemünd
Online-Prüfungs-ABC ABC Vertriebsberatung GmbH Bahnhofstraße 94 69151 Neckargemünd Telefon Support: 0 62 23 / 86 55 55 Telefon Vertrieb: 0 62 23 / 86 55 00 Fax: 0 62 23 / 80 55 45 (c) 2003 ABC Vertriebsberatung
Mehrinfach Geld FBV Ihr Weg zum finanzellen Erfolg Florian Mock
infach Ihr Weg zum finanzellen Erfolg Geld Florian Mock FBV Die Grundlagen für finanziellen Erfolg Denn Sie müssten anschließend wieder vom Gehaltskonto Rückzahlungen in Höhe der Entnahmen vornehmen, um
MehrErstellen einer digitalen Signatur für Adobe-Formulare
Erstellen einer digitalen Signatur für Adobe-Formulare (Hubert Straub 24.07.13) Die beiden Probleme beim Versenden digitaler Dokumente sind einmal die Prüfung der Authentizität des Absenders (was meist
MehrTapps mit XP-Mode unter Windows 7 64 bit (V2.0)
Tapps mit XP-Mode unter Windows 7 64 bit (V2.0) 1 Einleitung... 2 2 Download und Installation... 3 2.1 Installation von WindowsXPMode_de-de.exe... 4 2.2 Installation von Windows6.1-KB958559-x64.msu...
MehrEinrichtung eines E-Mail-Kontos bei MS Office Outlook 2007 (Windows) Stand: 03/2011
Einrichtung eines E-Mail-Kontos bei MS Office Outlook 2007 (Windows) Stand: 03/2011 1. Klicken Sie auf Start, wählen Sie Alle Programme, suchen Sie den Ordner Microsoft Office und starten Sie per Klick
MehrOutlook Express: Einrichtung E-Mail Account
Outlook Express: Einrichtung E-Mail Account Die nachfolgende Beschreibung dient der Einrichtung eines Accounts zum Abruf und Versenden von Mails über den Mailserver unter Microsoft Outlook-Express 5.0
MehrLizenzen auschecken. Was ist zu tun?
Use case Lizenzen auschecken Ihr Unternehmen hat eine Netzwerk-Commuterlizenz mit beispielsweise 4 Lizenzen. Am Freitag wollen Sie Ihren Laptop mit nach Hause nehmen, um dort am Wochenende weiter zu arbeiten.
MehrStellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster
Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.
MehrE-Mail-Konten für Studierende und Zugriffswege auf die Mail-Systeme der Hochschule Rhein-Waal
E-Mail-Konten für Studierende und Zugriffswege auf die Mail-Systeme der Hochschule Rhein-Waal Version 1.2 vom 18.06.2010 erstellt von Michael Baumann Autor: Michael Baumann Seite 1 Inhaltsverzeichnis Änderungen:...
MehrTechNote: Exchange Journaling aktivieren
Produkt: Kurzbeschreibung: NetOrchestra MA Emailarchivierung Exchange Journaling aktivieren Diese Anleitung hilft Ihnen, das nachfolgend geschilderte Problem zu beheben. Dazu sollten Sie über gute bis
MehrE-MAIL VERWALTUNG. Postfächer, Autoresponder, Weiterleitungen, Aliases. http://www.athost.at. Bachstraße 47, 3580 Mödring office@athost.
E-MAIL VERWALTUNG Postfächer, Autoresponder, Weiterleitungen, Aliases http://www.athost.at Bachstraße 47, 3580 Mödring office@athost.at Loggen Sie sich zunächst unter http://www.athost.at/kundencenter
MehrSoftware Engineering Klassendiagramme Assoziationen
Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen
MehrTipps und Tricks zu Netop Vision und Vision Pro
Tipps und Tricks zu Netop Vision und Vision Pro Anwendungen auf Schülercomputer freigeben und starten Netop Vision ermöglicht Ihnen, Anwendungen und Dateien auf allen Schülercomputern gleichzeitig zu starten.
MehrSynchronisation in Java. Invisible Web
Synchronisation in Java Studienprojekt Invisible Web Tang Zhihong Synchronisation in Java Synchronisationsproblem Monitore Wait und notify PipedInputStream und PipedOutputStream Synchronisation von Collections
MehrKommunikations-Management
Tutorial: Wie kann ich E-Mails schreiben? Im vorliegenden Tutorial lernen Sie, wie Sie in myfactory E-Mails schreiben können. In myfactory können Sie jederzeit schnell und einfach E-Mails verfassen egal
MehrSpeicher in der Cloud
Speicher in der Cloud Kostenbremse, Sicherheitsrisiko oder Basis für die unternehmensweite Kollaboration? von Cornelius Höchel-Winter 2013 ComConsult Research GmbH, Aachen 3 SYNCHRONISATION TEUFELSZEUG
MehrOrdner Berechtigung vergeben Zugriffsrechte unter Windows einrichten
Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten Was sind Berechtigungen? Unter Berechtigungen werden ganz allgemein die Zugriffsrechte auf Dateien und Verzeichnisse (Ordner) verstanden.
MehrFolgeanleitung für Fachlehrer
1. Das richtige Halbjahr einstellen Folgeanleitung für Fachlehrer Stellen sie bitte zunächst das richtige Schul- und Halbjahr ein. Ist das korrekte Schul- und Halbjahr eingestellt, leuchtet die Fläche
MehrEinrichten eines Postfachs mit Outlook Express / Outlook bis Version 2000
Folgende Anleitung beschreibt, wie Sie ein bestehendes Postfach in Outlook Express, bzw. Microsoft Outlook bis Version 2000 einrichten können. 1. Öffnen Sie im Menü die Punkte Extras und anschließend Konten
Mehr1&1 Webhosting FAQ Outlook Express
Seite 1 von 6 Sie befinden sich hier: WebHosting-FAQ E-Mail & Unified Messaging E-Mail-Clients - Einrichtung und Konfiguration Outlook Express Artikel #1 Outlook Express Hinweis: Die nachfolgende Beschreibung
MehrTeamSpeak3 Einrichten
TeamSpeak3 Einrichten Version 1.0.3 24. April 2012 StreamPlus UG Es ist untersagt dieses Dokument ohne eine schriftliche Genehmigung der StreamPlus UG vollständig oder auszugsweise zu reproduzieren, vervielfältigen
MehrDas Handbuch zu KNetAttach. Orville Bennett Übersetzung: Thomas Bögel
Orville Bennett Übersetzung: Thomas Bögel 2 Inhaltsverzeichnis 1 Einführung 5 2 KNetAttach verwenden 6 2.1 Hinzufügen von Netzwerkordnern............................ 6 3 Rundgang durch KNetAttach 8 4 Danksagungen
MehrTechnische Dokumentation SilentStatistikTool
Technische Dokumentation SilentStatistikTool Version 1.0 Marko Schröder 1115063 Inhalt Einleitung... 3 Klasse Program... 3 Klasse ArgumentHandler... 3 Bereitgestellte Variablen... 3 Bereitgestellte Methoden...
MehrVerarbeitung der Eingangsmeldungen in einem Callcenter
Q-up ist ein Produkt der: Anwendungsbeispiele Verarbeitung der Eingangsmeldungen in einem Callcenter Der Testdatengenerator Der Testdatengenerator Verarbeitung der Eingangsmeldungen in einem Callcenter
MehrInstallationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb
Installationsanleitung für CashPro im Mehrbenutzerzugriff/Netzwerkbetrieb CashPro basiert auf Accesstechnologie 2003 und ist auch unter den aktuellen Accessversionen 2007 bis 2013 einsetzbar und Mehrbenutzerfähig.
MehrSie wollen Was heißt das? Grundvoraussetzung ist ein Bild oder mehrere Bilder vom Wechseldatenträger
Den Speicherplatz wechseln oder eine Sicherungskopie erstellen. Es lässt sich nicht verhindern. Manche Sachen liegen am falschen Platz, können gelöscht werden oder man will vor der Bearbeitung eine Sicherungskopie
MehrIn 15 einfachen Schritten zum mobilen PC mit Paragon Drive Copy 10 und Microsoft Windows Virtual PC
PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Stephan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0) 761 59018201 Fax +49 (0) 761 59018130 Internet www.paragon-software.com Email sales@paragon-software.com
MehrMCRServlet Table of contents
Table of contents 1 Das Zusammenspiel der Servlets mit dem MCRServlet... 2 1 Das Zusammenspiel der Servlets mit dem MCRServlet Als übergeordnetes Servlet mit einigen grundlegenden Funktionalitäten dient
MehrDer Kalender im ipad
Der Kalender im ipad Wir haben im ipad, dem ipod Touch und dem iphone, sowie auf dem PC in der Cloud einen Kalender. Die App ist voreingestellt, man braucht sie nicht laden. So macht es das ipad leicht,
MehrHilfe zur Urlaubsplanung und Zeiterfassung
Hilfe zur Urlaubsplanung und Zeiterfassung Urlaubs- und Arbeitsplanung: Mit der Urlaubs- und Arbeitsplanung kann jeder Mitarbeiter in Coffee seine Zeiten eintragen. Die Eintragung kann mit dem Status anfragen,
MehrDrucken aus der Anwendung
Drucken aus der Anwendung Drucken aus der Anwendung Nicht jeder Großformatdruck benötigt die volle Funktionsvielfalt von PosterJet - häufig sind es Standarddrucke wie Flussdiagramme und Organigramme die
MehrSecond Steps in eport 2.0 So ordern Sie Credits und Berichte
Second Steps in eport 2.0 So ordern Sie Credits und Berichte Schritt 1: Credits kaufen, um Zugangscodes generieren zu können Wählen Sie Credits verwalten und klicken Sie auf Credits kaufen. Geben Sie nun
MehrSJ OFFICE - Update 3.0
SJ OFFICE - Update 3.0 Das Update auf die vorherige Version 2.0 kostet netto Euro 75,00 für die erste Lizenz. Das Update für weitere Lizenzen kostet jeweils netto Euro 18,75 (25%). inkl. Programmsupport
MehrDiese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.
Anmeldung http://www.ihredomain.de/wp-admin Dashboard Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Das Dashboard gibt Ihnen eine kurze Übersicht, z.b. Anzahl der Beiträge,
MehrNeue Funktionen im GUI für PC-DMIS V3.x 4.x Seite 1 von 8
Neue Funktionen im GUI für PC-DMIS V3.x 4.x Seite 1 von 8 Neue Funktionen im GUI ab V 2.x für PC-DMIS Wie funktioniert GUI für PC-DMIS? GUI heißt Grafical User Interface. Das bedeutet grafische Benutzer
MehrZwischenablage (Bilder, Texte,...)
Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen
MehrE Mail Versand mit der Schild NRW Formularverwaltung
-Seite 1- E Mail Versand mit der Schild NRW Formularverwaltung Seit der Version 1.12.3.97 der Reportverwaltung ist die Möglichkeit integriert, E Mails direkt, d.h. ohne Umweg über einen externen Mailclient
MehrBenutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.
Benutzerhandbuch Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer. 1 Startseite Wenn Sie die Anwendung starten, können Sie zwischen zwei Möglichkeiten wählen 1) Sie können eine Datei für
MehrFolgende Einstellungen sind notwendig, damit die Kommunikation zwischen Server und Client funktioniert:
Firewall für Lexware professional konfigurieren Inhaltsverzeichnis: 1. Allgemein... 1 2. Einstellungen... 1 3. Windows XP SP2 und Windows 2003 Server SP1 Firewall...1 4. Bitdefender 9... 5 5. Norton Personal
Mehr5.2 Neue Projekte erstellen
5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort
MehrEin Hinweis vorab: Mailkonfiguration am Beispiel von Thunderbird
Mailkonfiguration am Beispiel von Thunderbird Ein Hinweis vorab: Sie können beliebig viele verschiedene Mailkonten für Ihre Domain anlegen oder löschen. Das einzige Konto, das nicht gelöscht werden kann,
MehrCOMPUTERIA VOM 25.2.15 SERIENBRIEFE UND ETIKETTENDRUCK
COMPUTERIA VOM 25.2.15 SERIENBRIEFE UND ETIKETTENDRUCK WAS SIND SERIENBRIEFE? Bei einem Serienbrief handelt es sich um eine Art Word Vorlage, bei der das gleiche Dokument mehrmals gedruckt werden muss,
MehrEinrichtung eines E-Mail-Kontos bei Mac OS X Mail Stand: 03/2011
Einrichtung eines E-Mail-Kontos bei Mac OS X Mail Stand: 03/2011 1. Starten Sie Mail per Klick auf das Symbol im Dock. 2. Sie sehen die Ausgangsansicht von Mac OS X Mail. 3. Klicken Sie in der Fensterleiste
MehrRT Request Tracker. Benutzerhandbuch V2.0. Inhalte
RT Request Tracker V2.0 Inhalte 1 Was ist der RT Request Tracker und wo finde ich ihn?...2 2 Was möchten wir damit erreichen?...2 3 Wie erstelle ich ein Ticket?...2 4 Wie wird das Ticket abgearbeitet?...4
MehrEINFACHES HAUSHALT- KASSABUCH
EINFACHES HAUSHALT- KASSABUCH Arbeiten mit Excel Wir erstellen ein einfaches Kassabuch zur Führung einer Haushalts- oder Portokasse Roland Liebing, im November 2012 Eine einfache Haushalt-Buchhaltung (Kassabuch)
MehrIm Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können.
Excel-Schnittstelle Im Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können. Voraussetzung: Microsoft Office Excel ab Version 2000 Zum verwendeten Beispiel:
MehrMit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.
Seite erstellen Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken. Es öffnet sich die Eingabe Seite um eine neue Seite zu erstellen. Seiten Titel festlegen Den neuen
MehrBedienungsanleitung. Stand: 26.05.2011. Copyright 2011 by GEVITAS GmbH www.gevitas.de
GEVITAS-Sync Bedienungsanleitung Stand: 26.05.2011 Copyright 2011 by GEVITAS GmbH www.gevitas.de Inhalt 1. Einleitung... 3 1.1. Installation... 3 1.2. Zugriffsrechte... 3 1.3. Starten... 4 1.4. Die Menü-Leiste...
MehrÜberblick. Lineares Suchen
Komplexität Was ist das? Die Komplexität eines Algorithmus sei hierbei die Abschätzung des Aufwandes seiner Realisierung bzw. Berechnung auf einem Computer. Sie wird daher auch rechnerische Komplexität
MehrSie befinden sich hier: WebHosting-FAQ E-Mail & Unified Messaging E-Mail-Clients - Einrichtung und Konfiguration Outlook Express Artikel #1
1 von 9 23.05.2005 11:12 Sie befinden sich hier: WebHosting-FAQ E-Mail & Unified Messaging E-Mail-Clients - Einrichtung und Konfiguration Outlook Express Artikel #1 Outlook Express Hinweis: Die nachfolgende
MehrEnigmail Konfiguration
Enigmail Konfiguration 11.06.2006 Steffen.Teubner@Arcor.de Enigmail ist in der Grundkonfiguration so eingestellt, dass alles funktioniert ohne weitere Einstellungen vornehmen zu müssen. Für alle, die es
Mehr