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(×tamp); 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?