Parallelverarbeitung mit Ruby



Ähnliche Dokumente
PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Prozesse. Stefan Janssen. Alexander Sczyrba

ecaros2 - Accountmanager

Logging, Threaded Server

Multi-Threading. Ralf Abramowitsch Vector Informatik GmbH

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Professionelle Seminare im Bereich MS-Office

5.2 Neue Projekte erstellen

ANLEITUNG. Firmware Flash. Seite 1 von 7

2A Basistechniken: Weitere Aufgaben

Übungen Programmieren 1 Felix Rohrer. Übungen

Programmierkurs Java

Fachhochschule Wiesbaden - Fachbereich DCSM. Skriptsprachen. Moderne, objekt-orientierte Skriptsprachen mit Betonung auf Ruby

Grundlagen von Python

Handbuch ECDL 2003 Modul 2: Computermanagement und Dateiverwaltung Der Task-Manager

1 Einleitung. Lernziele. automatische Antworten bei Abwesenheit senden. Einstellungen für automatische Antworten Lerndauer. 4 Minuten.

Bearbeiten elektronische Rechnungen (Invoices)

Arbeiten mit UMLed und Delphi

Eine Anwendung mit InstantRails 1.7

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Vorgehensweise bei Lastschriftverfahren

S7-Hantierungsbausteine für R355, R6000 und R2700

Das Festkomitee hat die Abi-Seite neu konzipiert, die nun auf einem (gemieteten) Share Point Server

Anleitung über den Umgang mit Schildern

Internet Explorer Version 6

Drägerware.ZMS/FLORIX Hessen

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Sichere Anleitung Zertifikate / Schlüssel für Kunden der Sparkasse Germersheim-Kandel. Sichere . der

Qualität und Verlässlichkeit Das verstehen die Deutschen unter Geschäftsmoral!

Zwischenablage (Bilder, Texte,...)

Betriebssysteme. Dipl.-Ing.(FH) Volker Schepper

Einführung in die Programmierung

Lizenzen auschecken. Was ist zu tun?

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

BMW ConnectedDrive. connecteddrive. Freude am Fahren BMW CONNECTED DRIVE. NEUERUNGEN FÜR PERSONALISIERTE BMW CONNECTED DRIVE DIENSTE.

Stapelverarbeitung Teil 1

Download unter:

Einführung in die Informatik Tools

Computeria Solothurn

Eine Anleitung, wie Sie Mozilla Thunderbird 2 installieren und konfigurieren können. Installation Erstkonfiguration... 4

1. Weniger Steuern zahlen

Punkt 1 bis 11: -Anmeldung bei Schlecker und 1-8 -Herunterladen der Software

Java: Vererbung. Teil 3: super()

TELIS FINANZ Login App

Was ist Sozial-Raum-Orientierung?

Viele Bilder auf der FA-Homepage

Bitte beachten Sie die Installations-/Systemvoraussetzungen und freigegebenen Betriebssysteme.

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

ACDSee Pro 2. ACDSee Pro 2 Tutorials: Übertragung von Fotos (+ Datenbank) auf einen anderen Computer. Über Metadaten und die Datenbank

Objektorientierte Programmierung

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Microsoft Outlook 2010 Handbuch

Teaser-Bilder erstellen mit GIMP. Bildbearbeitung mit GIMP 1

Kurzanleitung für die Abgabe der Abrechnung über das Mitgliederportal der KV Sachsen

Scala kann auch faul sein

TYPO3 Tipps und Tricks

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel

Folgeanleitung für Fachlehrer

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Softwarelösungen: Versuch 4

Pfötchenhoffung e.v. Tier Manager

Stammdatenanlage über den Einrichtungsassistenten

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Installation OMNIKEY 3121 USB

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt

Software Engineering Interaktionsdiagramme

DIE SICHERE ENTSCHEIDUNG!

Lokale Installation von DotNetNuke 4 ohne IIS

3D-Konstruktion Brückenpfeiler für WinTrack (H0)

Was meinen die Leute eigentlich mit: Grexit?

1. Einführung Erstellung einer Teillieferung Erstellung einer Teilrechnung 6

Microsoft PowerPoint 2013 Folien gemeinsam nutzen

Anleitung. Update/Aktualisierung EBV Einzelplatz Homepage. und Mängelkatalog

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Beispiel 19. December 4, 2009

.NET Code schützen. Projekt.NET. Version 1.0

ACDSee 9 Foto-Manager

C.M.I. Control and Monitoring Interface. Zusatzanleitung: Datentransfer mit CAN over Ethernet (COE) Version 1.08

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Installation von Druckern auf dem ZOVAS-Notebook. 1. Der Drucker ist direkt mit dem Notebook verbunden

Gesicherte Prozeduren

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

- Zweimal Wöchentlich - Windows Update ausführen - Live Update im Norton Antivirusprogramm ausführen

Software Engineering Klassendiagramme Assoziationen

Wir machen neue Politik für Baden-Württemberg

Änderungen an der Mareon-Schnittstelle

Synchronisation in Java. Invisible Web

BILDER TEILEN MIT DROPBOX

Sie finden im Folgenden drei Anleitungen, wie Sie sich mit dem Server der Schule verbinden können:

Einführung in die Programmierung

Anleitung für das Content Management System

Grundlagen der Informatik

1. Einschränkung für Mac-User ohne Office Dokumente hochladen, teilen und bearbeiten

«Integration in WebSite» HTML-/Javascript-Code-Beispiele

Sicherheitseinstellungen... 2 Pop-up-Fenster erlauben... 3

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Transkript:

Fachhochschule Wiesbaden - Fachbereich DCSM Parallelverarbeitung mit Ruby Prozess-Ebene Multithreading 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 1

Fachhochschule Wiesbaden - Fachbereich DCSM Parallelisierung auf Prozess-Ebene Prozesse starten und verbinden fork & exec: Parallele Prozesse Interrupt handler: Signale abfangen 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 2

Prozesse starten system() String mit Kommando übergeben Rückgabe: true (falls ok) oder false Exit code in $? Beispiel: system "tar xzf apache-2.2.1.tar.gz" # true Nachteile: Output des Programms landet im selben Output, den auch das Skript erzeugt (meist stdout). ` ` (backticks) Wie system(), aber Output wird als String zurückgegeben `date` # "Do, 4. Dez 14:07:21 CET 2008" %x, %X (Alternative Notation) Wie ` `, mit Trennzeichenkonvention analog zu %w bzw. %W %x/date/ # "Do, 4. Dez 14:07:25 CET 2008" 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 3

Prozesse verbinden: Pipes Externen Prozess als Pipe nutzen Hier: GZIP-Daten extern entpacken lassen unzip = IO.popen("/bin/zcat", "w+") unzip.print some_gzipped_data # In Pipe schreiben unzip.close_write # force a flush! uncompressed_data = unzip.read # Aus Pipe lesen Hinweise: So NICHT entpacken ZLIB ist eingebaut! Hinweis: close_write erweist sich leider als notwig 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 4

Prozesse verbinden: Pipes Pipe-Technik für ein implizites fork() pipe = IO.popen("-", "w+") if pipe else pipe.puts "Studiere fleißig!" # Eltern-Zweig STDERR.puts "Antwort vom Kind: '#{pipe.gets.chomp}'" # Kind-Zweig STDERR.puts "Vater sagt: '#{gets.chomp}'" puts "Klar doch ;-)" Ergebnis: Vater sagt: 'Studiere fleißig!' Antwort vom Kind: 'Klar doch :-)' (Frei nach Pickaxe 2nd ed., p, 149 ) 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 5

Langläufer-Prozess starten fork() und exec() zur Prozess-Parallelisierung exec("./do_some_numbercrunching") if fork.nil? # Elternprozess kann nun weiterarbeiten! # # Später dann: Process.wait # Wartet auf Ende vom Kindprozesses Wirkung: fork spaltet den Prozess in einen Eltern- und Kind-Prozess Der Kindprozess erhält nil von fork() und gibt die Kontrolle an das externe Programm do_some_numercrunching unter seiner Prozess-ID ab Der Elternprozess erhält die PID des Kindprozesses zurück und kann parallel weiterarbeiten Am Ende wartet der Elternprozess auf die Beigung des Kindprozesses 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 6

Parallelisierung eines Ruby-Skripts fork() und exec() zur Parallelisierung des aktuellen Ruby-Programms Live-Demo fork_env.rb Neue Besonderheiten: Block-Modus von fork Mehrstufigkeit: Kind von Kind 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 7

Prozesse und Signale Signale (Software-Interrupts) lassen sich in Ruby abfangen # Interrupt-Handler: trap "INT" { puts "'Strg-C' erhalten" } trap "USR1" { puts "'SIGUSR1' erhalten" } # Hauptprogramm: loop { print "Echo: #{gets}" } $ ruby trap_echo.rb Hallo Echo: Hallo <Strg-C> 'Strg-C' erhalten <Strg-Z> [1]+ Stopped ruby trap_echo.rb $ ps # PID erfahren, z.b. 8857 $ kill SIGUSR1 8857 $ fg 'SIGUSR1' erhalten 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 8

Fachhochschule Wiesbaden - Fachbereich DCSM Multithreading 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 10

Multithreading Warum Multithreading? Auf Single core-maschinen: Beschleunigung IO-begrenzter Prozesse Auf Multiple core-maschinen: Beschleunigung auch compute-begrenzter Prozesse Generell: Effizienter und flexibler als Parallelisierung auf Prozess-Ebene Nutzung paralleler Algorithmen Manchmal elegantere Formulierung von Lösungen Nachteile? Synchronisierung erforderlich Debugging (teils erheblich!) schwieriger Notorisch fehleranfällig offenbar sind menschliche Denkmuster schlecht auf die Möglichkeiten und Konsequenzen nebenläufiger Algorithmen angepasst. 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 11

Multithreading Status Ruby 1.8 Alle Ruby-Threads laufen in einem einzigen native thread, daher noch kein Performance-Gewinn Kooperatives Multi-Threading : Thread-Wechsel findet automatisch durch den Ruby-Interpreter statt, sofern dieser dazu Gelegenheit bekommt Konsequenz: Ein blockierer Thread blockiert alle anderen auch! Beispiel: Blockierer OS-Aufruf Ruby 1.9 Ruby-Threads bereits auf native threads abgebildet Sperre: Jeweils nur ein Thread darf laufen! Grund: Noch nicht alle C-Bibliotheken sind thread safe JRuby Verwet Java threads, die native threads nutzen Parallelität! 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 12

Multithreading Ruby threads Im Prinzip Kontrollstrukturen für nebenläufige Verarbeitung OO-Kapselung mit der Klasse Thread Prinzipielles Vorgehen Nebenläufig auszuführer Code bildet Blöcke Diese Blöcke werden von Thread-Exemplaren gekapselt Rückgabewert jedes Blocks per value -methode value blockiert, bis dass der Block/Thread geet hat Beispiel # Paralleles Lesen von Dateien: threads = filenames.map { n Thread.new { File.read(f)}} threads.map { t t.value } # Array von Strings 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 13

Multithreading Generatoren und fibers (Ruby 1.9) Die Klasse Fiber stellt eine Kontrollstruktur für Nebenläufigkeit unterhalb der Thread-Ebene bereit Fibers ermitteln Zwischenergebnisse und kehren zurück! Sie starten nur auf Aufforderung ( resume ) Grundlagen für Generatoren. Hier: Lottozahlen-Generator class LottozahlenGenerator def initialize(n=6, out_of=49) @n, @pool = n, Array(1..out_of) @fiber = Fiber.new do loop do x = @pool.delete_at rand(@pool.size) Fiber.yield x # Kontrolle zurück an # Aufrufen 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 14

Multithreading Generatoren und fibers (Ruby 1.9), Forts. def next @fiber.resume # LottoGenerator # Anwung ziehung = LottozahlenGenerator.new 6.times { print "#{ziehung.next} "} puts "Zusatzzahl: #{ziehung.next} " Warnung Der gezeigte Code ist noch nicht getestet (kein Ruby 1.9) 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 15

Multithreading Der main thread Sonderrolle: Interpreter stoppt, wenn dieser et Dies gilt auch, wenn andere threads noch laufen! Exceptions im main thread bewirken Abbruch (wie gewohnt), solche in anderen threads been nur diesen thread Thread.abort_on_exception = true # ändert dies! Synchronisierung am Ende threads = (1..5).map do i Thread.new { sleep rand(20); puts "Thread #{i}" } # Auf Beigung aller Threads warten threads.each { t t.join } 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 16

Multithreading Exklusiver Zugriff, Mutex Situation: Mehrere threads müssen ein gemeinsames Objekt aktualisieren Ist die Aktualisierung nicht atomar, darf sie nicht unterbrochen werden! Beispiel: c = 0 threads = (1..5).map do # ein gemeinsamer Zähler Thread.new { 1000.times { c += 1 } } threads.each { t t.join } puts c # 1716 < 5000! Ursache: c += 1 ist nicht atomar: lese c, inkrementiere, schreibe zurück 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 17

Multithreading Exklusiver Zugriff, Mutex Abhilfe: Locking des kritischen Code-Abschnitts Beispiel: require "thread" mutex = Mutex.new c = 0 threads = (1..5).map do Thread.new do # Ruby 1.9: unnötig (eingebaut) # ein gemeinsamer Zähler 1000.times { mutex.synchronize { c += 1} } threads.each { t t.join } puts c # 5000 nun OK! 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 18

Multithreading Zum Schluss: Vorsicht deadlock! Beispiel: require "thread" m, n = Mutex.new, Mutex.new t = Thread.new do # Ruby 1.9: unnötig (eingebaut) m.lock; puts "Thread t sperrte Mutex m" ; sleep 1 puts "Thread t will Mutex n sperren"; n.lock s = Thread.new do n.lock; puts "Thread s sperrte Mutex n" ; sleep 1 puts "Thread s will Mutex m sperren"; m.lock t.join; s.join # Gegenseitige Blockade! Quelle: The Ruby Programming Language, Kap. 9.9.7.1 04.12.2008 2003, 2008 H. Werntges, FB Design Informatik Medien (DCSM), FH Wiesbaden 19