Jedoch die Informatik und deren Methoden konnten nicht immer folgen → Lücke zwischen Hardware und Software
Materialinformatik
Eine normalisierte Recheneffizienz eines Computers (nur unter Berücksichtigung der Datenverarbeitungseinheit) kann definiert werden durch:
A
Chipfläche in mm2
C
Rechenleistung in Mega Instructions per Second (MIPS) - oder besser in Kilo Dhrystones/s (KDS)!
P
Elektrische Leistungsaufnahme in W
Die Recheneffizienz kann verwendet werden, um verschiedene Computer und Geräte zu vergleichen, d.h. einen Skalierungsfaktor anzugeben:
Materialinformatik
Neben der reinen Rechenleistung sind noch Speicher und Kommunikationsfähigkeit einer Rechneranlage wichtige Kenngrößen, so dass sich zwei weitere normierte Recheneffizienzen ergeben:
M
Gesamter Speicher in Mega Bytes (MB), beinhaltet RAM, ROM, Register
D
Gesamte Kommunikationsfähigkeit als Datendurchsatz (Mega Bit/s)!
Materialinformatik
Maßzahlen der Rechenleistung
Einfachste Maßzahl ist die Anzahl der Integer- oder Fliesskommaoperationen pro Zeiteinheit (MIPS/FLOPS)
Aber nur der eigentliche Kern des Mikroprozessors wird dabei erfasst - Speicher, Speicherhierarchie und Kommunikationsfähigkeit fehlen
Ein Programm besteht i.A. aus den folgenden High-level Operationen:
Berechnung (skalar, vektoriell)
Speicherallokation, Objekterzeugung (Code und Daten)
Funktionsaufrufe
Erzeugung, Zugriff, und Freigabe verschiedener Objekte mit unterschiedlichen “Speicherabdruck”: Arrays, Strings, Records, Funktionen, Methodische Objekte mit Prototypen (Klassen)
⇒ Dhrystone Benchmark umfasst alle oben genannten Operationen!
Materialinformatik
Chip Fläche
Materialinformatik
Chip Fläche
Materialinformatik
Chip Fläche
Materialinformatik
Chip Fläche
Materialinformatik
Hitachi entwickelte bereits 2006 einen 0.15 x 0.15 Millimeter großen, 7.5 μm dicken Microchip der:
Drahtlose Kommunikation und Energieversorgung via RFID → (2.45 GHz Mikrowelle) ermöglichtet, einen
128 Bit ROM Speicher, und einen
einfachen Mikroprozessor enthielt.
Materialinformatik
Aufgabe
Mache eigene Messungen mit dem dhrstone benchmark Test auf verschiedenen Rechnern und Virtuellen Maschinen.
Stelle eine Tabelle zusammen mit gängigen Computern (mobil, Desktop, Server, eingebettete Rechner, Nanorechner) mit den Daten MIPS/DPS, Speicher, Kommunikation (abgeschätzt) sowie Chip Fläche und el. Leistungsbedarf
Berechne die verschiedenen ε Parameter und vergleiche …
Entwurf Eingebetteter Systeme
Softwareentwurf
Entwurf Eingebetteter Systeme
Der Entwurf Eingebetteter Systeme geht immer mehr Richtung Hardware-Software Co-Design und System-on-Chip Architekturen
Rechnersysteme
Man unterscheidet folgende Kategorien von Rechnern:
Stationäre Geräte: Server
Stationäre Geräte: Desktop
Mobile Geräte: Notebook
Mobile Geräte: Smartphone
Stationäre und mobile Eingebettete Systeme: Einplatinencomputer und Microcontroller
System-on-Chip Geräte: Einchipcomputer und Microcontroller
Rechnertechnologien
Existierende “Nano”-Computer:
Smart Dust → Vision Millionen lose gekoppelter Nano-Computer
Eingebettet in Materialien
Auf Oberflächen verstreut
Dispergiert in Flüssigkeiten, Folien, ..
ungefähr 10mm3 Volumen
Micro Mote M3
ELM System
Rechnertechnologien
Existierende Kleinstrechner für Sensornetzwerke mit Drahtloskommunikation (WLAN, Bluetooth)
Raspberry PI Zero
32-bit RISC ARM Prozessor
512MB RAM, 16GB ROM
1W
70x30mm
ESP8266
32-bit RISC Tensilica Xtensa Diamond Standard
128kB RAM, 16MB ROM
0.15W
30x20 mm
Rechnertechnologien
Micro Mote (M3 )
ELM System
Atmel Tiny 20
Freescale KL03
ARM Cortex Smart Phone
Processor
Arm Cortex M0
C8051F990 (SL)
AVR
Arm Cotex M0+
Arm Cortex A9
Clock
740kHz max.
32kHz
-
48MHz
1GHz
CPU Chip Area
0.1mm2
9mm2
1mm2
4mm2
7mm2/ROM
Sensors
Temperature
-
-
-
Temp, Light, Sound, Accel., Press., Magn.
Communication
900MHz radio, optical
optical
electrical
-
3G/4G, WLAN, USB, Bluetooth, NFC
Harvester, Battery
Solar cell, Thin film
Solar cell, Coin
-
-
-
Power Consumption
70mW / CPU
160mW / CPU
20mW
3mW @ 48MHz
100mW avg.,
Manufacturing
180nm CMOS
-
-
-
40nm CMOS
Package
Wire bonded
Silicon Stack
PCB
Single Chip
Single Chip
Computing Eff. εC
150
0.02
0.6
4.0
0.53
Rechnertechnologien
Smart Dust
Kommunikation: Optisch, Laser, LED
Energieversorgung: Optisch, Fotozelle
Energiespeicher: Dünnfilmbatterie
Sensorik: Temperatur, Licht
Rechnernetzwerke
Von großen Computern zu großen Netzwerken …
Ursprünglich wurden Software- und Betriebssysteme auf Computern mit hoher Rechenleistung und Speicherkapazität ausgeführt.
Die Integration von Berechnung in technische Strukturen oder Geräte erfordert das Herunterskalieren von Algorithmen und Methoden in Richtung auf verteilte Verarbeitungsnetzwerke mit Plattformen mit geringen Ressourcen.
Rechnertypen
Rechner und Mikroprozessoren unterscheiden sich u.A. durch die Art und Weise der Maschinenbefehlsausführung
Man unterscheidet: Reduced Instruction Set Computer (RISC) und Complex Instruction Set Computer (CISC)
RISC: Maschinenbefehle arbeiten häufig mit Registern (Anzahl Register groß)
CISC: Maschinenbefehle arbeiten häufig mit dem Speicher (Anzahl der Register klein)
C/C++ → Sehr gute Performanz, geringer Speicherbedarf, und mittlere Zuverlässigkeit/Korrektheit (Fehler), kein oder minimales automatisches Speichermanagement → Prozedurale Programmierung
Skriptsprachen → Unterschiedliche Performanz, wird durch Interpreter bestimmt, automatisches Speichermanagement
Python (schlechte Performanz)
JavaScript (mittlere oder gute Performanz, evtl. hoher Speicherbedarf)
Lua (mittlere oder gute Performanz, niedriger Speicherbedarf)
Programmierung
Performanz und Speicherbedarf bei Skriptsprachen hängen vom Interpreter ab!
JavaScript: Google V8 (Bytecode+Just-in-time native code Compiler), Jerryscript (Bytecode)
Lua (Bytecode) und Luajit (Bytecode+Just-in-time native code Compiler)
Bytecode. Der Bytecode ist eine Sammlung von Befehlen für eine virtuelle Maschine.
Bei der Kompilierung eines Quelltextes mancher Programmiersprachen oder Umgebungen, wie beispielsweise Java, wird nicht direkt Maschinencode, sondern ein Zwischencode, der Bytecode, erstellt.
Dieser Code ist in der Regel unabhängig von realer Hardware. Er entsteht als Resultat einer semantischen Analyse des Quelltexts und ist im Vergleich zu diesem oft relativ kompakt und wesentlich effizienter interpretierbar als der originale Quelltext [Wikipedia].
Programmierung
Reine Bytecode Interpreter haben geringe oder mittlere Performanz bei niedrigen Speicherbedarf
Der Bytecode wird entweder vollständig aus dem Quelltext beim Start eines Programms erzeugt, oder
Der Bytecode wird stückweise nach Bedarf aus dem Quelltext zur Laufzeit erzeugt
Ein JIT Compiler übersetzt häufig vorkommende Bytecode Abschnitte zur Ausführungszeit in nativen Maschinencode
Das ergibt erhöhte Ausführungsperformanz, benötigt aber mehr Speicher
Vorteile von Skriptsprachen gegenüber kompilierten Programmen: Schneller Test, ausführliche und genaue Rückmeldung vom Interpreter bei Fehlern, bessere Laufzeitüberwachung von Fehlern, …
Programmierung
Ausführungsplattform für Eingebettete Systeme
Daher ist eine zweistufige Architektur sinnvoll:
Virtuelle Maschine programmiert in C (hohe Portabilität) und ggfs. Assembler, mit integrierten Compiler, die Bytecode ausführt und bei Bedarf Bytecode in nativen Maschinenkode umwandelt (JIT)
Skriptsprache (in diesem Kurs Lua) die im Quelltext von der virtuellen Maschine ausgeführt wird
Virtualisierung durch die VM von:
Prozessor (Instruction Set Architecture, ISA)
Speicher, automatisches Speichermanagement
Ein- und Ausgabegeräten (Geräte)
Kommunikation
Warum nicht JAVA?
Hoher Speicherbeadarf
Nur objektorientierte Programmierung, nicht immer effizient
Kein Interpreter: Compiler und VM sind getrennt
Virtualisierung
Virtualisierung
Compiler
Virtualisierung
Interpeter
Virtualisierung
Bytecode Interpreter
Die Übersetzung des Quelltextes in Bytecode kann vor und während der Ausführung des Programms erfolgen!
Virtualisierung
Serialisierung
Da Bytecode unabhängig von der Hostplattform sein sollte, kann Bytecode einfach von einer Maschine zu einer anderen übertragen und ausgeführt werden
Dazu ist eine Serialisierung von Daten und Code erforderlich (Flache Liste von Bytes), mit anschließender Deserialisierung (Wiederherstellung der Daten- und Codestruktur)
[Peter Cawley]
Virtualisierung
JIT Compiler
Neben der Bytecode Ausführung kann während der Laufzeit des Programms der Bytecode stückweise optimiert werden → Erzeugung von Maschinencode durch einen Just-in-Time Compiler (JIT)
Virtualisierung
Aufgabe:
Überlegen Sie sich die Vor- und Nachteile von
Compilern
Interpretern
Bytecode Interpretern
JIT Compiler und Interpreter
Was sind die Bewertungskriterien?
Welche Ausführungsarchitekturen könnten für Eingebettete Systeme geeignet sein?
Virtualisierung
Rechenleistung, Speicherbedarf, und Ein-Ausgabe Durchsatz/Latenz sind wichtige Metriken für den Einsatz in Eingebetteten Systemen
Virtualisierung
Perfomanz von Interpretern
Dhrystone Benchmark (Kombination aus Berechnung, Objekten, Arrays, Strings, Funktionen)
VM/OS-ARCH
Linux-i686
Linux-armv6l (PI-3)
Linux-armv6l (PI Zero)
python2.7
105k/s
10k/s
4k/s
lua 5.1
140k/s
-
-
luajit 2.0.5X
660k/s
71k/s
40k/s
jerryscript 1.1.7X
45k/s
-
-
nodejs 4
6300k/s
350k/s
40k/s
C/gcc
?
?
?
Virtualisierung
Speicherbedarf von Interpretern
Dhrystone Benchmark (Kombination aus Berechnung, Objekten, Arrays, Strings, Funktionen)
VM/OS-ARCH
Linux-i686
Linux-armv6l (PI-3)
Linux-armv6l (PI Zero)
python2.7
-
-
-
lua 5.1
-
-
-
luajit 2.0.5X
2MB
-
-
jerryscript 1.1.7X
2MB
nodejs 4
24MB
-
-
C/gcc
?
?
?
Virtualisierung
Automatisches Speichermanagement
In C/C++ muss für jedes zur Laufzeit dynamisch erzeugte Datenobjekt (Array, String, Record, ..) immer explizit Speicherplatz im Hauptspeicher angefragt werden (malloc) und wieder frei gegeben werden wenn das Datenobjket nicht mehr benötigt wird (free)
In Skriptsprachen gibt es i.A. ein automatisches Speichermanagement mit einem sog. Garbage Collector und Objektreferenzierung
Jedes Datenobjekt welches verwendet wird (z.B. in Variablen oder Funktionen) besitzt eine Referenz
Es muss eine Wurzeltabelle geben von der aus alle Referenzen auf verwendete Objekte auffindbar sind
Beispiel 1.(Beispiel von Objektreferenzierungen in Lua: Wo existieren Referenzen?)
Virtualisierung
Virtualisierung
Speicherarchitektur von Programmen
Heap: Datenobjekte mit längerer Lebensdauer (Tabellen- oder Listenstruktur) → Benötigt Speichermanagement
Stack: Datenobjekte mit kurzer Lebensdauer (Stapelstruktur) → Benötigt kein Speichermanagement
Virtualisierung
Speicherorganisation von Virtuellen Maschinen
Virtualisierung
Speicher
Die meisten Objekte in Programmiersprachen benötigen Speicher
Lokale, temporäre, und globale Variablen
Objekte
Arrays
Zeichenketten
Funktionen (!)
Der Kontext von Speicherobjekten ist wichtig:
Modul → limitierte Programmsichtbarkeit
Lokal → stark limitierte Programmsichtbarkeit
Global → uneingeschränkte Sichtbarkeit
Virtualisierung
Beispiele: Die globale Variable Xglobal ist überall, auch außerhalb des Definitionsmoduls, sichtbar, die Variable xlokal ist im gesamtem Modul und den Funktionen f1 und f2 sichtbar, wo hingegen xlokal1 und xlokal2 jeweils nur ihrem Funktionskontext sichtbar sind.
Xglobal = 1
local xloakal = 2
function f1 ()
local xlokal1 = 3
end
function f2 ()
local xlokal2 = 3
end
Nur wenn Variablen bei der Ausführung sichtbar sind belegen sie Speicher!
Virtualisierung
Ein Teil des Speicher ist vorbelegt:
Globale Variablen
Funktionen, ausführbarer Code, …
Ein anderer Teil des Speichers wird zur Laufzeit auf dem Stack und Heap belegt und benötigt Verwaltung:
Lokale und temporäre Variablen, ..
Funktionen, ausführbarer Code, …
Achtung: Bei Programmiersprachen bei denen Funktionen Werte erster Ordnung sind befindet sich auch Code
im Heap oder auf dem Stack
Virtualisierung
Speicherverwaltung
Listen
Freie und belegte Speicherbereiche werden durch Listen (einfach- oder doppelt verkettet) verwaltet
Tabellen
Tabellen (Hashtabellen) werden zur Speicherverwaltung verwendet
Manuelle Verwaltung
Speicherbelegung explizit vom Programmierer und teils vom Compiler auszuführen
Vorteile
Optimale Speicherbelegung (tatsächlich naiv und falsch) und Performanz/Effizienz
Nachteile
Speicherlecks (nicht mehr benötigter Speicher wird nicht frei gegeben)
Mehrfachfreigabe (Inkonsistenz der Speicherverwaltung)
Benutzung von Speicherobjekten nach Freigabe
Virtualisierung
Automatische Verwaltung
Die Freigabe von Speicherbereichen wird automatisch durch einen Garbage Collector durchgeführt. Dieser bestimmt auch automatisch ob Speicherobjekte noch benötigt werden.
Vorteile
Speicherlecks werden vermieden
Keine Mehrfachfreigabe (Inkonsistenz der Speicherverwaltung)
Keine Benutzung von Speicherobjekten nach Freigabe
Nachteile
Nicht optimale Speicherbelegung und schlechtere Performanz/Effizienz
Garbage Collection
Wie soll der GC heraus finden ob ein Objekt noch benötigt wird?
Referenzzähler wird jedem Objekt hinzugefügt und bei jeder neuen Referenzierung erhöht (Allocate). Ein Objekt mit Referenzwert Null kann frei gegeben werden.
Virtualisierung
Der GC rechnet Objektabhängkeiten aus und markiert Objekte die freigegeben werden können
Beispiel von Referenzen und Sichtbarkeit (Programmkontext)
Virtualisierung
GC: Referenzzählung
Wenn ein Objekt erzeugt wird, wird der Referenzzähler auf Null gesetzt
Jede weitere Referenzierung erhöht den Zähler um eins (also bereits das zuweisen eines Objektes an eine variable!)
Wird eine Referenzierung vom Objekt entfernt (explizit → =null, oder implizit durch Entfernen des referenzierenden Objektes), dann wird der Zähler um eins erniedrigt
Ist der Zähler wieder Null, dann wird der Speicher freigegeben
Nachteile
Zyklische Referenzen können nicht aufgelöst werden:
local o1 = { x=100,y=100 }
local o2 = { prev=o1 }
o1.next = o2
Virtualisierung
Daher werden u.U. nicht alle Objekte freigegeben → Speicherlecks
Der Referenzzähler belegt selber Speicher (gehört zum Objekt). Bei low-resource Plattformen wird z.B. eine Datenwortbreite von 16 Bit für den Zähler verwendet, und der maximale Referenzwert ist 65536 (jerryscript ist so ein Kandidat)!
Allokation ist langsamer (verlangsamt Zuweisung)
Vorteile
Einfach zu implementieren
Freigabe ist effizient (wenig Rechenaufwand)
GC: Mark & Sweep
Bestimmte Objekte sind direkt zugänglich, und es muss herausgefunden werden welche Objekte erreichbar sind → Graphensuche
Es gibt einen Stammsatz von Speicherplätzen im Programm, dessen Objekte bekanntermaßen erreichbar sind.
Virtualisierung
Mark-and-Sweep verläuft in zwei Phasen
Markierungsphase
Erreichbare Objekte suchen:
Der Stammsatz wird zu einer Arbeitsliste hinzugefügt
Solange die Arbeitsliste nicht leer ist wird ein Objekt von der Liste entfernt. Wenn es nicht markiert ist, markiere es als erreichbar und alle Objekte die davon aus erreichbar sind werden zur Arbeitsliste hinzugefügt.
Sweepphase
Für alle belegten Objekte:
Ist das Objekt nicht markiert so lösche es (Speicher freigeben)
Ist das Objekt markiert, lösche die Markierung
Virtualisierung
Vorteile
Auch zyklische Referenzen können über die Arbeitsliste aufgelöst werden
Alle Objekte können frei gegeben werden
Allokation schnell
Nachteile
Rechenintensiv und langsam!!
Multitasking
Auf einem Rechnerknoten gibt es eine Vielzahl von Aufgaben die bearbeitet werden müssen:
Sensorverarbeitung
Kommunikation
Steuerung
Zum Teil müssten Aufgaben parallel verarbeitet werden → Multitasking → Parallelisierung → Nur bedingt möglich → Task Scheduling
Echtzeitverarbeitung
Echtzeitverarbeitung bedeutet die Ausführung eines Tasks innerhalb eines vorgegebenen Zeitintervalls [t0,t1]
Soft Realtime: Zeitüberschreitung bei weicher Echtzeitanforderung → Tollerierbar
Hard Realtime: Zeitüberschreitung bei harter Echtzeitanforderung → Systemfehler
Echtzeitverarbeitung
Echtzeitverarbeitung
Preemption
Wenn schon nicht alles Tasks gleichzeitig verarbeitet werden können, dann wenigstens die wichtigsten vorrangig ausführen
Das erfordert aber:
Festlegung einer Priorität
Bei Echtzeitanforderungen die Unterbrechung von unterlegenen (kleiner Priorität) Tasks
Parallele Datenverarbeitung und Prozesse
Parallele Datenverarbeitung und Prozesse
Ein Prozess ist die dynamische Ausführung eines Programms
Der Zustand (Mikrobene) eines Prozesses ist durch den Datenzustand aller (privaten) Prozessvariablen, globaler Variablen, und dem Kontrollzustand (Instruktion) bestimmt
Man unterscheidet folgende Prozessklassen:
Task
Ein Task T ist die kleinste Einheit und i.A. ein Teil einer Berechnung und eines Prozesses. Man unterscheidet fein und grob granulierte Tasks. Wenige Anweisungen und wenig Rechenlast bedeuten feine Granularität. Parallele Datenverarbeitung wird durch konkurrierende Ausführung von Tasks auf verschiedenen Prozessoren erreicht.
Prozesse
Der eigentliche Prozesse ist von allen anderen Prozessen stark entkoppelt und gesichert (lose Kopplung). Die Erzeugung eines Prozesses ist rechenintensiv → schwergewichtige Prozesse. Prozesse können parallel ausgeführt werden.
Parallele Datenverarbeitung und Prozesse
Threads
Leichtgewichtige Subprozesse eines Prozesses mit mittlerer Kopplung (Datenaustausch zwischen Threads ist direkt möglich). Die Erzeugung eines Threads ist weniger rechen- und speicherintensiv. Threads können parallel ausgeführt werden.
Fibers
Sehr leichtgewichtige Prozesse mit starker Kopplung die in Threads oder Prozessen ausgeführt werden. Die Erzeugung von Fibers ist optimal. Fibers werden i.A. nicht parallel ausgeführt und daher sequenzielle und verschachtelt ausgeführt.
Scheduling
Die Ausführung von Prozessen (Threads) kann parallel auf mehreren Datenverarbeitungseinheiten (Prozessoren) geschehen → Parallele Datenverarbeitung
Häufig ist aber die Anzahl der Prozess N größer als die Anzahl der Prozessoren P
Parallele Datenverarbeitung und Prozesse
Dann müssen Prozesse die rechenbereit sind hintereinander ausgeführt werden → Scheduling
Ein Prozess kann mittels der Operationen suspend und resume blockiert oder wieder lauffähig gemacht werden
Parallele Datenverarbeitung und Prozesse
Sequenzielle und parallele Ausführung
Parallele Datenverarbeitung und Prozesse
Parallele Datenverarbeitung und Prozesse
Bei der parallelen (und verteilten) Datenverarbeitung soll es eine Beschleunigung der Rechenzeit im Vergleich
zum rein sequenziellen Verarbeiten geben
Aber es gibt auch in parallelen Systemen immer sequenzielle Anteile die die Beschleunigung S reduzieren
Prozesse
Prozesszustände
Ein Prozess kann sich in verschiedenen Ausführungszuständen (Makroebene) befinden:
New
Ein Prozess wird erzeugt und der Code und Daten aus einer Datei gelesen
Ready/Ready Suspended
Der Prozess ist rechenbereit (ausführungsbereit), aber wird noch nicht vom Prozessor ausgeführt
Running
Der Prozess wird von einem Prozessor ausgeführt (Ein Prozessor oder Prozessorkern kann immer nur einen Prozess ausführen)
Waiting/Blocked/Suspended
Der Prozess wartet auf ein Ereignis (Daten, Zeitintervall, Ressource frei, usw.). Man unterscheidet u.U. Blockierung und Suspendierung (Details: Art und Weise der Blockierung)
Prozesse
Prozesse
Prozesse
Prozessblockierung
Ein rein sequenzielles Programm wird solange schrittweise ausgeführt bis die letzte Anweisung verarbeitet wurde
Prozessblockierung bedeutet das Anhalten eines Prozesses an einer bestimmten Stelle im Programmfluss mit späterer Ausführung an genau dieser unterbrochenen Stelle!
Parallele Datenverarbeitung und VMs
Da Virtuelle Maschine i.A. ein automatisches Speichermanagement besitzen ist schwierig oder ineffizient eine VM mit einem gemeinsamen Heap und VM Zustand zwischen Threads zu teilen
Gefahr der Dateninkonsistenz
Alternativ Schutz durch Mutualen Ausschluss bei jeglicher Art der Speicherverwaltung → Aber: Ständig wird Speicher verwaltet (in jeder Anweisung!)
Daher wird folgendes parallele Ausführungsmodell bei VMs gewählt:
Jeder Thread führt eine eigen VM aus (mit eignen GC, Heap, und Zustand)
Kommunikation zwischen Threads uüber einen seriallisierten gemeinsamen Speicher (Store), über den Daten ausgetauscht werden können
Parallele Datenverarbeitung und VMs
Asynchrone Ereignisverarbeitung
Neben der Parallelisierung der reinen Datenverarbeitung (Berechnung) kann auch eine Partitionierung von Ein- und Ausgabe bzw. der Ereignisverarbeitung erfolgen
Bekanntes Beispiel: Geräteinterrupts mit einfachen Foreground-Background System mit zwei Prozessen:
P1: Hohe Priorität (Ereignisverarbeitung → Interrupthandler → Foreground Prozess)
P2: Niedrige Priorität (Berechnung → Hauptprogramm → Background Prozess) mit Preemption durch Ereignisverarbeitung
Ein- und Ausgabeoperationen eines Programms können synchron (blockierend) oder asynchron (im Hintergrund verarbeitet und nicht blockierend) ausgeführt werden.
Asynchrone Ereignisverarbeitung
Beispiel JavaScript
Synchrone Operationen liefern das Ergebnis in einer Datenanweisung zurück die solange blockiert wird bis das Ereignis eintritt(Ergebnisdaten verfügbar sind). Dabei werden zwei aufeinander folgende Operationen sequenziell ausgeführt, und eine folgende Berechnung (nicht ereignisabhängig) erste nach den Ereignissen ausgeführt:
x = IO1(arg1,arg2,..)
y = IO2(arg1,arg2,..)
z = f(x,y)
Bei der asynchronen (nebenläufigen) Ausführung von ereignisabhängigen Operationen wird das Ergebnis über eine Callback Funktion verarbeitet. Die IO Operation blockiert nicht. Vorteil: Folgende Berechnungen können unmittelbar ausgeführt werden.
Asynchrone Ereignisverarbeitung mit preemptiven Verhalten benötigt explizite Synchronisation (Locks…) zur Atomarisierung von kritischen Bereichen
Asynchrone Ereignisverarbeitung spaltet den Datenfluss auf und benötigt Daten- und Ergebnissynchronisation über Prädikatsfunktionen oder explizite Synchronisation:
local x,y,z
function P(f,x,y,z)
if x ~= nil and y ~= nil then
return f(x,y)
else return z end
end
IO1(arg1,arg2,..,function (res) x=res; z=P(f,x,y,z) end)
IO2(arg1,arg2,..,function (res) y=res; z=P(f,x,y,z) end)
Digitale Signalverarbeitung
Digitalisierung als erste Stufe der Signalverarbeitung
Die AD-Wandlung setzt i.A. ein Frequenzfilter (Tiefpass) am Eingang voraus, mit dem der zu erfassende Spektralbereich des Signals begrenzt wird. In der sog. Sample&Hold-Schaltung wird das analoge Signal zeitdiskretisiert, und anschließend mit dem eigentlichen AD-Wandler in einen diskreten i.A. binärkodierten Digitalwert umgesetzt.
Digitale Signalverarbeitung als zweite Stufe
Die Eingangsdaten stehen als kontinuierlicher Datenstrom für die weitere Verarbeitung zur Verfügung. Ein Eingangsdatenstrom wird in einen Ausgangsdatenstrom transformiert.
Erzeugung analoger Signale als dritte Stufe
Die DA-Wandlung kann nur ein quasi-analoges Signal (immer noch zeit- und wertdiskret!) erzeugen. Eine ”Zeit- und Wertglättung” findet hier ebenfalls unter Verwendung eines Tiefpass-Frequenzfilters statt