Computernutzung für Experimentalphysiker

Transcription

Computernutzung für Experimentalphysiker
Computernutzung für Experimentalphysiker
Frei progammierbare Rechner als Werkzeuge in der Experimentalphysik
Teil 2
Was bisher geschah:
●
●
●
●
●
●
●
Die freie Programmierbarkeit macht Rechner zum echten Multitool
Computer sind heute Massenware, und deshalb billig und allgegenwärtig
Um das universelle Werkzeug effektiv einzusetzen, muss man
➔
(in Ansätzen) verstehen wie es funktioniert
➔
einige Techniken erlernen
Standardisierte Programmiersprachen und die entsprechenden Compiler erlauben es, das selbe
Programm auf vielen verschiedenen CPUs laufen zu lassen.
Alle sinvollen Programme brauchen I/O
Betriebssysteme, die dem Posix-Standard folgen, stellen eine einheitliche Programmierschnittstelle
für die unterschiedlichsten I/O-Geräte zur Verfügung
Everything is a file: Aller I/O läuft per open(), read(), write() und close() über Files, bzw. über die FileSchnittstelle
➔
Dies erlaubt Programme, die unabhängig davon sind, welche I/O-Geräte an einem speziellen
Rechner angeschlossen sind
Die nächsten Punkte:
●
●
Weitere Services, die das Betriebssystem zur Verfügung stellt
●
Programme laden und starten, Speicherverwaltung, Standard-I/O-Kanäle
●
Shells als Benutzerschnittstelle zum Betriebssystem
●
Standard Dienstprogramme (Unix Tools)
Wie erstelle ich eigene Programme
●
Organisation einer Programmentwicklung
●
OO Programmierung mit C++
Dienste des Betriebssytems
Man kann Programme über eine klassische Konsole eingeben und starten, aber das ist sehr mühsam.
Bessere Lösung: Wir speichern Programme in Dateien auf der Platte, und lassen das Betriebssystem das
gewünschte Programm in den Speicher laden und starten.
Im einfachsten Fall braucht ein Programm Programmspeicher und Datenspeicher
●
Speicher bereitstellen
●
Programmcode und Daten in Speicher laden
●
Programmspeicher und restlichen Speicher vor Überschreiben schützen
Ein Programm braucht I/O-Kanäle
●
Konvention: Jedes Programm / jeder Prozess bekommt beim Start einen input stream, einen output
stream und einen error output stream zugewiesen.
●
Standard I/O streams erzeugen und im Programm eintragen. Beispiel auf nächster Folie.
Programm starten
Funktioniert nur, wenn der Code relozierbar/relocatable ist: nur relative Sprünge, Adressierung der Daten
nur relativ zur Adresse des Codes
Die Einschränkungen fallen weg, wenn ein loader die aktuellen Adressen im Programm einträgt
Heute üblich: Multi-User - Multi-Tasking - Betriebssysteme
●
Mehrere Benutzer nutzen einen Computer gleichzeitig
●
Jeder Benutzer kann gleichzeitig mehrere Programme ausführen
#include "Keithley617.hh"
#include <iostream>
#include <fstream>
#include <time.h>
int main(int argc, char *argv[])
{
Multimeter* multimeter = new Keithley617();
if (0 == multimeter) {
std::cerr << "could not create a Keithley 617" << std::endl;
exit(1);
}
double value;
time_t startTime;
time_t timestamp;
tm *now;
time(&startTime);
// while (difftime(timestamp, startTime) < 20) {
while (true) {
value = multimeter->current();
timestamp = time(0);
now = localtime(&timestamp);
std::cout << value << " " << difftime(timestamp, startTime) << " " <<
now->tm_mday << '.' << now->tm_mon+1 << '.' << now->tm_year+1900
<< "-" << now->tm_hour << ':' << now->tm_min << ':' << now->tm_sec << std::endl;
sleep(1);
}
}
return 0;
Dienste des Betriebssytems
Multiuser/Multitasking-Systeme
●
●
●
●
Mehrere Prozesse müssen sich den Speicher teilen
Mehrere Prozesse konkurieren (manchmal) um die Nutzung des selben I/O-Gerätes
Die Prozesse müssen voreinander geschützt werden, aber Kommunikation zwischen
Prozessen muss möglich sein (shared memory, pipes, ...)
Eine CPU kann gleichzeitig immer nur ein Programm ausführen bzw. einen Befehl ausführen
●
Prozesse können nur quasi-parallel laufen
●
Die zur Verfügung stehende CPU-Zeit muss scheibchenweise auf die Prozesse verteilt
werden
➔ Scheduler
●
Es ensteht der Eindruck, als liefen die Prozesse gleichzeitig
●
Manchmal warten Prozesse nur (auf I/O): die Zeit kann von anderen Prozessen genutzt
werden
Beispiel: was läuft gerade auf seminar?
●
●
ps und top, man pages
Virtueller Speicher
Scheduler
●
Entscheidet nach verschiedenen Verfahren, welcher Prozess die nächste Zeitscheibe
bekommt
●
nice-Wert eines Prozesses
Shared Libraries – Gemeinsam Genutzte Bibliotheken
Meistens laufen viele Prozesse quasi gleichzeitig auf einem Computer.
I.A. haben die Prozesse Programmcode gemein (aus Bibliotheken); Programmcode ändert sich
während des Programmlaufs nicht.
➔ Speicherplatz wird verschwendet
➔ Shared libraries: nur eine Kopie des Codes liegt im Speicher, die von mehreren
Programmen genutzt werden kann
Beispiel: Welche Bibliotheken benötigt /opt/root/5.28-00a/Linux26SL6_x86_64_gcc444/bin/root?
●
ldd und nm
Shared libs haben keinen festen Platz im Speicher: Neue Aufgaben für den loader:
Im einfachsten Fall braucht ein Programm Programmspeicher und Datenspeicher
●
Speicher bereitstellen
●
Programmcode und Daten in Speicher laden
●
Programmspeicher und restlichen Speicher vor Überschreiben schützen
●
●
Shared libraries suchen und ggf. laden
Einsprungadressen in die shared libs in das Programm eintragen: dynamisches Linken
Ein Programm braucht I/O-Kanäle
●
Konvention: Jedes Programm / jeder Prozess bekommt beim Start einen input stream, einen output
stream und einen error output stream zugewiesen.
●
Standard I/O streams erzeugen und im Programm eintragen
Programm starten
Der loader sucht auf $LD_LIBRARY_PATH und einem systemweit definierten Pfad nach shared libs.
●
env, setenv, echo, ´$´, ldconfig, Pfade
Shells
Nach dem Booten des Betriebssystems wartet das BS auf einen Benutzer und seine Anweisungen
●
Wir benötigen ein Tool, dass es dem Benutzer ermöglicht dem BS Anweisungen zu erteilen
➔ Eine shell muss her
Kommandozeilen-Shells – grafische Shells
●
Kommandozeilen-Shells bieten viel mehr Möglichkeiten und sind (fast) immer schneller zu bedienen
Breites Angebot: sh, ksh, bash, csh, tcsh, zsh, wish, ...
●
ähnliche Funktionalität, unterschiedliche Befehlssyntax
In der HEP weit verbreitet: tcsh und bash
●
Im Folgenden: tcsh
●
man tcsh
Interne Kommandos
●
Alles, was die shell selber kann
●
shell-script-Kommandos
●
Konfiguration der shell
●
alias setzen, ...
Externe Kommandos
●
Aufruf/Starten eines anderen Programms
●
Programme werden auf $PATH gesucht
●
which
Shells erlauben es, die Standard-I/O-Streams der
Prozesse umzulenken und zu verketten: <, >&!, |
Environment/Umgebungsvariablen
●
Dictionary: <key> = <value>
●
Wird an neu gestartete Prozesse vererbt
●
Prozesse können etwas über die Umgebung erfahren, in der sie gestartet wurden
●
Kann zum setzen von Optionen benutzt werden
●
Beispiele: HOME, PWD, TERM, PATH, PAGER
Externe Kommandos / Unix Tools
In einem /usr/bin finden sich mehrere Tausend Programme/Utilities/Tools
➔ Es wäre sinnlos alle hier zu besprechen
Einige, ohne die es wirklich nicht geht:
rm, mv, cp, ls, mkdir, rmdir, ssh, scp, less, lpr, kill
Einige, die sehr nützlich sind:
cat, grep, xargs, awk, find, split, merge, cut, sort, tar, w, top, nohup, su, du, df, od, wc, strings, ``, (), vi,
emacs, sed, &, bg, fg
Es ist nützlich ungefähr zu wissen, was es gibt. Die Einzelheiten kann man bei Bedarf per man und/oder
<command> --help
Findet mit man und --help heraus, was die obigen Tools machen!
Mit Hilfe von | und xargs lassen sich mit den einfachen Tools komplexere Aufgaben lösen
1. Beispiel: Verzeichnisbaum klonen mit tar:
tar cf - * | (cd <destination>; tar xf - )
2. Beispiel: Aus einem ASCII-File mit 3 Spalten mit numerischen Werten und mit Kommentarzeilen, die
mit einem # beginnen, die Werte der dritten Spalte rausschreiben, wenn 1.Wert > 2.Wert ist, und diese
Werte numerisch absteigend sortieren.
Versucht mit den Erkenntnissen von oben eine Kommando-Kette zu erstellen, die genau das
macht! Wieviel Treffer habt ihr? Was sind der kleinste und der größte 3. Wert bei den Treffern?