Netzwerk - Programmierung

Slides:



Advertisements
Ähnliche Präsentationen
10.2 Wechselseitiger Ausschluss in Hardware
Advertisements

Beim Start eines Prozesses in Windows NT, 2000 wird a der Programmtext aus der exe-Datei ab der dort angegebenen Adresse gespeichert.
C Tutorium – Semaphoren –
1 Spezielle Packages des Java SDK (1.4) java.nio.
3 Prozessverwaltung  sieht einen Prozess als Objekt der Verwaltung,
der Universität Oldenburg
Semaphore void Passieren (semaphore &s) { if (s > 0) { s--;
SAP R/3 - Speichermanagement
Kapitel 6.1 Nebenläufigkeit und wechselseitiger Ausschluss
Kapitel 7.2 Dining philosophers problem
Threads Richard Göbel.
1 Named Pipes alias FIFO Haben einen Eintrag im Dateisystem und sind somit durch Zugriffsrechte identifizierbar Ermöglichen die Kommunikation zwischen.
OpenMP Präsentation im Rahmen des Seminars
Systeme 1 Kapitel 4 Prozesse WS 2009/10.
Prozess-synchronisation
Betriebssysteme Übung 2. Tutorium. Task 1 – Locks (1) Wozu Locks? Dienen dazu, exklusiven Zugriff auf eine Ressource sicherzustellen Lock = binäre Semaphore.
Μ Version 1.0Seite 1µVision Start Debugger Set Breakpoint µVision Debugger.
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Systemsoftware und Betriebssysteme
Interprozess- kommunikation (IPC)
Parallelisierung für Multiprozessor-Maschinen Teil 2.
Parallelisierung für Multiprozessor-Maschinen
SFZ FN Sj. 13/14 Python 3 Rekursion Inf K1/2 Sj 13/14
Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 1 SFZ FN Sj. 13/14 Python Klassen und Objekte.
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Berechenbarkeit Klaus Becker Berechenbarkeit.
Autor: Timo Pagel Nutzung: Diese Lernkarten sind für die Nutzung mit OpenCards gedacht Siehe dazu
2.3 Implementierung von Prozessen
1.3 Verklemmungen Synchronisation löst Probleme – ist aber auch Gefahrenquelle: Prozeß wartet an Synchronisationspunkt – ist gesichert, daß er irgendwann.
C Tutorium – Shared Memory – Knut Stolze. 2 Shared Memory Ein Speicherbereich, auf den mehrere Prozesse Zugriff haben – Also kein privater Speicher –
Webdeployment auf Cluster Seminarvortrag von Lukas Bonzelett.
Patrick Richterich Lattwein GmbH Web Services Softwareentwicklung mit SOAP.
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework Von: Simon Lubberich Erstbetreuer:
1 freedroidz – spielend Programmieren lernen. 2 Was ist freedroidz?
Center for Biotechnology Bielefeld Bioinformatics Service Netzwerk - Programmierung Threads Alexander Sczyrba Jan Krüger.
Center for Biotechnology Bielefeld Bioinformatics Service Netzwerk - Programmierung Kommunikation von Prozessen Signale und Pipes Alexander Sczyrba
1 Arrays und Schleifen Özgü & Tim. 2 Inhaltsverzeichnis Arrays Was ist ein Array? Bauanleitung Beispiel Matrix Fehler Schleifen Wofür Schleifen? While-Schleife.
ESP Tutorium Studienassistent: Ewald Moitzi Gruppe 1.
Center for Biotechnology Bielefeld Bioinformatics Service Netzwerk - Programmierung Prozesse Alexander Sczyrba Jan Krüger.
Netzwerk - Programmierung
Center for Biotechnology Bielefeld Bioinformatics Service Netzwerk - Programmierung Concurrent Clients Alexander Sczyrba
J. Nürnberger2007 / 081 Tabellenkalkulation (3) Arbeiten mit Formeln am Beispiel von OpenOffice.org Calc.
SPS auf dem Raspberry PI
Netzwerk - Programmierung
Hello World! Javakurs 2013 Arne Kappen
Java-Kurs - 4. Übung weitere Kontrollstrukturen
Netzwerk - Programmierung
Business Process Excuction Lanaguage
Netzwerk - Programmierung
Netzwerk - Programmierung
Netzwerk - Programmierung
Netzwerk - Programmierung
Netzwerk - Programmierung
1AHWIL Dennis Can, Lucas Hofbauer, Fabian Harra
I2C-HC / SCB Verifikation
Einführung in die Programmierung
Coden mit Python Was sind deine Erfahrungen mit Programmieren?
Arten von Kontrollstrukturen
Geocat.ch V3.4 Wiederverwendbare Objekte (Kontakte, Formate und Ausdehnungen) verwalten.
Einführung in die Programmierung
Unterschiedliche Arten von Kontrollstrukturen
Schleifen mit der Turtle
Informatik Kurse
GRUNDLAGEN WISSENSCHAFTLICHEN ARBEITENS MODULA-2 SONAY SUBAYAZ
«Delegierter» Methoden Schablone Funktionszeiger
Tutorstunde 10.
Implementieren von Klassen
Schleifen Datenfelder (Arrays) Verzweigungen
Einführung in die Programmierung
RGB-LED Projekt INGOLSTADT.
 Präsentation transkript:

Netzwerk - Programmierung Threads Jan Krüger jkrueger@cebitec.uni-bielefeld.de Alexander Sczyrba asczyrba@cebitec.uni-bielefeld.de

Übersicht Probleme mit fork Threads Python _thread und threading API Locks

Probleme mit fork fork ist teuer : Speicher wird für den Kindsprozess kopiert Alle Deskriptoren werden dupliziert … Interprocess Communication (IPC) zur Kommunikation zwischen Parent und Child nötig Übergabe for dem fork einfach Rückgabe von Informationen (Child zum Parent) schwieriger

Thread Auch : leightweigth process oder LWP Jeder Thread läuft unabhängig von anderen Threads in einem gemeinsamen Prozess Erzeugen von einem Thread ist 10-100x schneller als das Erzeugen eines Prozesses Alle Threads eines Prozesses teilen den gleichen globalen Speicher Vereinfacht Austausch von Daten Aber : Synchronisation nötig

Threads(2) Threads eines Prozesses teilen u.a. Globale Variablen Geöffnete Dateien (z.B. Datei Deskriptoren) Signal Handlers Jeder Thread hat u.a. eigene(n) Thread ID Register (inkl. Program counter und stack pointer) Stack (für lokale Variablen und Rücksprungadressen)

Aufgabe Der Befehl top bzw. htop zeigt Informationen über die zur Zeit laufenden Prozesse an http://htop.sourceforge.net starte [h]top und beobachte, welche Prozesse Threads benutzen Achtung! Evtl. muss die Ansicht angepasst werden beschränke [h]top auf Deine eigene Prozesse starte den ServiceServer

3 Kategorien von Threads: User-mode Threads Kernel Threads Native Threads Implementation von Threads abhängig vom Betriebssystem und evtl. dessen Version 3 Kategorien von Threads: User-mode Threads Kernel Threads Multiprozessor Kernel Threads Windows 7 unterstützt eine Hybrid Implementierung aus User-mode und Kernel Threads.

User mode Threads OS kennt keine Threads Ausschliesslich im Programm (und dessen Bibliotheken) implementiert Problem Wenn ein Prozess blockiert, blockieren alle Kernel blockiert auf Prozess Ebene

Kernel Threads OS kennt Kernel Threads Blockieren eines Threads blockiert die anderen nicht Kernel blockiert auf Thread Ebene Aber: Prozess kann nicht mehrere Threads gleichzeitig laufen lassen Problem : Synchronisation

Erzeugen von Threads in Python Es existieren zwei Module in Python3 für threaded computing: _thread: Low level API Threads sind Funktionen Veraltet (deprecated) in Python 3 threading: High level API Beliebig einfach erweiterbar (Threads sind Objekte) Sammeln in Threadpools und Queues relativ einfach Da Funktionen in Python auch Objekte sind leuchtet der Unterschied vielleicht nicht so sehr an. Threading behandelt jedoch jeden einzelnen Thread als Objekt und ist daher die einfacherer und erweiterbarere Variante

Erzeugen von Threads mit _thread (1) _thread (Python 3.x) thread (Python 2.X) _thread.start_new_thread(fn(), args_tupel[, kwargs]) from _thread import start_new_thread def heron(a): eps, old, new = 0.0000001, 1, 1 while True: old,new = new, (new + a/new) / 2.0 if abs(new - old) < eps: break print( new ) start_new_thread(heron,(99,)) start_new_thread(heron,(999,)) start_new_thread(heron,(1733,)) c = input("Eingabe.") Was macht die Funktion heron(a) ? Wofuer brauche ich die letzte Zeile ?

Erzeugen von Threads mit _thread (2) Wie kann erzwungenes Pausieren mit input() umgangen werden? → Threads zählen und auswerten! from thread import start_new_thread num_threads = 0 def heron(a): global num_threads num_threads += 1 … num_threads -= 1 print(new) start_new_thread(heron,(99,)) start_new_thread(heron,(999,)) start_new_thread(heron,(1733,)) while num_threads > 0: pass Warum funktioniert das Programm (evtl.) nicht so wie erwartet ? - while Schleife wird erreicht bevor ein Thread die Variable num_threads erhoehen kann - num_threads += 1 bzw. -= sind keine atomare Anweisungen

Erzeugen von Threads mit _thread (3) Unerwartetes Verhalten ? from thread import start_new_thread num_threads = 0 def heron(a): global num_threads num_threads += 1 … num_threads -= 1 print(new) start_new_thread(heron,(99,)) start_new_thread(heron,(999,)) start_new_thread(heron,(1733,)) while num_threads > 0: pass

Erzeugen von Threads mit _thread (4) ... locks müssen her... from thread import start_new_thread, allocate_lock num_threads = 0 thread_started = False lock = allocate_lock() def heron(a): global num_threads, thread_started lock.acquire() num_threads += 1 thread_started = True lock.release() …

threading-Modul Bisherige Lösung immer noch unschön... → Lösung: High Level threading-API import time from threading import Thread def sleeper(i): print("thread %d sleeps for 5 seconds" % i) time.sleep(5) print("thread %d woke up" % i) for i in range(10): t = Thread(target=sleeper, args=(i,)) t.start()

Warten auf Threadbeendigung Etwas fehlt noch: t.join(timeput=None) Aufrufender/threadender Thread blockiert, bis gestarteter Thread terminiert ist Rückgabewert immer None RunTimeError bei Deadlock Kehrt bei Ablauf des Timeouts zurück Thread muss dann mit t.is_alive() getestet werden, ob der Thread noch am Leben ist Kann erneut gejoint werden

Aufgaben Schreibe ein Programm, das einen Thread erzeugt der Thread soll die globale Variable count 500 mal inkrementieren Gib jeweils den aktuellen Wert der Variable count im Thread aus Benutze an geeigneten Stellen sleep, um das Verhalten Deines Programms mit [h]top zu verfolgen Gib die Variable nochmal aus, nachdem der Thread joined wurde

Aufgabe Ändere Dein Programm so ab, dass die Funktion counter() mit while arbeitet. Die Bedingung soll sein: count < 1.000.000 Starte 1.000 Threads mit counter() als Target direkt nacheinander, um die count Variable bis 1.000.000 zu inkrementieren Was fällt Dir auf?

Race Conditions from threading import Thread threads, count = [], 0 def counter(): global count while count < 1000000: count+=1 for i in range(1000): t = Thread(target=counter) threads.append(t) for t in threads: t.start() for t in threads: t.join()

Synchronisation in Python mittels Locks, Re-entrant Locks und Semaphoren, Events... Python unterstützt bekannte Synchronisationsmechanismen wie Locks, RLocks und Semaphoren Verwendet Lock-Funktionalität aus threading!!! lock = threading.Lock() lock.acquire() … lock.release()

Aufgabe Ändere Dein Counter-Programm so ab, dass der kritische Codebereich gesperrt wird. Bekommst Du jetzt das erwartete Ergebnis?