2 UNIX Interprozesskommunikation
|
|
|
- Hartmut Oskar Friedrich
- vor 10 Jahren
- Abrufe
Transkript
1 Parallelverarbeitung Folie UNIX Interprozesskommunikation Austausch von Informationen zwischen kooperierenden Prozessen Synchronisation kooperierender Prozesse Kommunikationsmechanismen gemeinsame Speicherbereiche (shared memory) Kommunikationskanäle (named / unnamed pipes, fifo files) Nachrichtenübertragung (message queues) Nachrichtenwarteschlangen (mailbox systems) Sockets entfernter Prozeduraufruf (remote procedure call, RPC) etc. Synchronisationsmechanismen Sperren (file locks, read-lock, write-lock) Semaphoren Monitore etc.
2 Parallelverarbeitung Folie Prozesse erzeugen und beenden Programm: Sammlung von Anweisungen und Daten befindet sich im Allgemeinen auf der Festplatte ist im i-node als ausführbar gekennzeichnet der Dateiinhalt entspricht den Regeln des Betriebssystems für ausführbare Programme (a.out-format, elf-format, ) Ausführung des Programms 1) Betriebssystemkern muss einen Prozess erzeugen, d. h. eine Umgebung bereitstellen, in der das Programm ausgeführt werden kann 2) der Prozess besteht aus drei Bereichen: instruction segment user data segment system data segment 3) das Programm wird zur Initialisierung des instruction segments und user data segments benutzt
3 Parallelverarbeitung Folie 2-3 4) nach der Initialisierung besteht zwischen dem Prozess und dem Programm, das er ausführt, keine weitere Verbindung 5) der Prozess kann weitere Betriebsmittel (mehr Speicher, neue Dateien, usw.) anfordern, die im Programm nicht vorhanden sind mehrere parallel ablaufende Prozesse können mit demselben Programm initialisiert werden der Betriebssystemkern kann Hauptspeicher sparen, wenn solche Prozesse ein gemeinsames instruction segment verwenden (die beteiligten Prozesse können die gemeinsame Nutzung nicht feststellen, da die Segmente nur Lesezugriffe erlauben) das system data segment enthält u. a. folgende Angaben: aktuelles Dateiverzeichnis Tabelle der offenen Dateien akkumulierte CPU-Zeit Prozessnummer des Vaterprozesses ein Prozess kann sein system data segment nicht direkt manipulieren, da es außerhalb seines Adressraums liegt er benötigt Systemfunktionen zur Manipulation
4 Parallelverarbeitung Folie 2-4 ein Prozess wird im Auftrag eines Prozesses vom Betriebssystemkern erzeugt auftraggebender Prozess: Vaterprozess (parent process) erzeugter Prozess: Sohnprozess (child process) der Sohnprozess erbt den größten Teil der Systemumgebung des Vaterprozesses (z. B. alle offenen Dateien, Semaphore, ) jeder Prozess wird durch eine eindeutige Prozessnummer identifiziert (process-id, PID) bis auf einen Prozess (den init-prozess) hat jeder Prozess einen Vaterprozess der init-prozess ist die Wurzel des Prozesssystems unter UNIX (falls ein Prozess endet, bevor seine Sohnprozesse geendet haben, wird der init-prozess automatisch Vaterprozess der Waisen, d. h. die Vaterprozessnummer verwaister Prozesse ist 1) jeder Prozess gehört einer Prozessgruppe an, die durch eine Prozessgruppennummer identifiziert wird (process-group-id, PGID) (Beispiel: alle Prozesse eines Datenbank-Managementsystems)
5 Parallelverarbeitung Folie 2-5 ein Prozess der Gruppe ist der Gruppenleiter (bei diesem Prozess stimmen Prozessnummer und Gruppennummer überein) alle Prozesse einer Gruppe haben als Gruppennummer die Prozessnummer des Gruppenleiters es gibt Systemaufrufe, die alle Mitglieder einer Gruppe betreffen (auf diese Weise können z. B. alle Prozesse einer Gruppe beendet werden) ein Prozess kann seine Gruppennummer ändern und selbst Gruppenleiter einer eigenen Gruppe werden (siehe Handbuchseite setpgid) die Ausgaben aller Prozesse einer Gruppe erfolgen im Allgemeinen auf dem Sichtgerät, an dem der Gruppenleiterprozess gestartet wurde (d. h., dass der Bildschirm ein kritischer Bereich ist, auf dem sich die Ausgaben der Prozesse u. U. vermischen) der Gerätetreiber des Sichtgerätes sendet alle interrupt (<Ctrl-c>, <Strgc>), quit (<Ctrl-\>, <Strg-\>) und hangup Signale (<Ctrl-Break>, <Strg-Untbr>) an alle Prozesse, die dieses Sichtgerät benutzen (u. U. werden auf diese Weise alle Prozesse beendet, wenn keine Vorkehrungen (z. B. ignore hangups) getroffen wurden)
6 Parallelverarbeitung Folie 2-6 erzeugen eines neuen Prozesses pid_t fork (void) der Sohnprozess ist im Wesentlichen eine Kopie des Vaterprozesses der Vaterprozess erhält die Prozessnummer des Sohnprozesses als Ergebnis zurück der Sohnprozess erhält den Wert 0 als Ergebnis zurück fork ( ) liefert -1 zurück und es wurde kein Sohnprozess erzeugt, wenn ein Fehler aufgetreten ist (z. B. wenn die Prozesstabelle voll ist oder der Benutzer seine maximal erlaubte Anzahl an Prozessen erzeugt hat) der Sohnprozess überlagert sich im Allgemeinen mit einem anderen Programm (exec-funktion) der Vaterprozess wartet entweder auf das Ende des Sohnprozesses (wait- oder waitpid-funktion) oder erledigt irgendwelche sonstigen Arbeiten der fork-aufruf ist sehr aufwendig, da u. U. große Datensegmente kopiert werden müssen die Unterschiede in den Prozessumgebungen von Vater- und Sohnprozess können der Handbuchseite entnommen werden
7 Parallelverarbeitung Folie 2-7 auf das Ende eines Sohnprozesses warten pid_t wait (int *stat_loc) pid_t waitpid (pid_t pid, int *stat_loc, int options) wait ( ) liefert als Rückgabewert die Prozessnummer des Sohnprozesses oder -1 im Fehlerfall zurück der Rückgabewert/Statuswert des Sohnprozesses wird in die Variable gespeichert, auf die stat_loc zeigt die Rückgabewerte und Parameter von waitpid ( ) können der Handbuchseite entnommen werden falls ein Sohnprozess endet, bevor sein Vaterprozess auf sein Ende wartet, wird er im Allgemeinen ein Zombie-Prozess das instruction, user data und system data segment werden freigegeben der Prozess behält seinen Eintrag in der Prozesstabelle sobald der Vaterprozess wait ( ) oder waitpid ( ) aufruft, wird auch der Eintrag in der Prozesstabelle gelöscht Zombie-Prozesse werden z. B. verhindert, wenn der Vaterprozess das Signal SIGCHLD ignoriert oder mit Hilfe der Funktion sigaction ( ) das Flag SA_NOCLDWAIT setzt Zombie-Prozesse werden spätestens beim Ende des Vaterprozesses oder durch einen Neustart des Rechners entfernt
8 Parallelverarbeitung Folie 2-8 einen Prozess beenden void exit (int status) beendet den Prozess und gibt einen Statuswert an den Vaterprozess falls der Prozess noch Sohnprozesse besitzt, werden sie nicht abgebrochen, sondern erhalten den init-prozess als Vaterprozess offene Dateien werden automatisch geschlossen, nicht freigegebene Speicherbereiche werden freigegeben usw. (eine Beschreibung aller Aktionen kann der Handbuchseite entnommen werden) mögliche parallele Abläufe 1) der Vaterprozess wartet bereits auf das Ende des Sohnprozesses (fork1.c, fork2.c) parent fork waitpid wait blocked child exit
9 Parallelverarbeitung Folie 2-9 2) der Vaterprozess wartet noch nicht auf das Ende des Sohnprozesses (fork3.c) parent fork waitpid wait child exit zombie 3) der Vaterprozess wartet nicht auf seinen Sohnprozess und endet bevor der Sohnprozess endet (fork4.c) parent fork return in main exit child "init" becomes parent exit 4) der Vaterprozess wartet nicht auf seinen Sohnprozess und endet nachdem der Sohnprozess geendet hat (fork5.c) parent fork return in main exit child exit zombie der Sohnprozess bleibt kein dauerhafter Zombie-Prozess
10 Parallelverarbeitung Folie 2-10 allgemeine Struktur eines Programms zur Prozesserzeugung (fork1.c) #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <errno.h> int eval_wait_stat (int stat); int main (void) pid_t parent_pid, child_pid, /* process ID's */ fork_pid, wait_pid, parent_grp, child_grp; /* process groups */ int child_stat; /* return status of child */ parent_pid = getpid (); parent_grp = getpgrp (); printf ("\nparent process: process ID: %ld group ID: %ld\n", (long) parent_pid, (long) parent_grp); fork_pid = fork (); switch (fork_pid) case -1: /* error: no process created */ perror ("fork failed"); exit (EXIT_FAILURE); break; case 0: /* child process */ child_pid = getpid (); child_grp = getpgrp (); printf ("Child process: process ID: %ld group ID: %ld " "parent process ID: %ld\n", (long) child_pid, (long) child_grp, (long) getppid ()); printf ("Child process: terminate with \"exit\"-value: %d\n", EXIT_SUCCESS); exit (EXIT_SUCCESS); break; default: /* parent process */ printf ("Parent process: child process with ID %ld created.\n", (long) fork_pid); wait_pid = wait (&child_stat); if (wait_pid == -1) perror ("wait"); exit (EXIT_FAILURE); else printf ("Parent process: child process %ld has terminated.\n", (long) wait_pid); eval_wait_stat (child_stat); return 0;
11 Parallelverarbeitung Folie 2-11 int eval_wait_stat (int stat) int return_val; if (WIFEXITED (stat)!= 0) printf ("\t\tchild has terminated with status %d.\n", WEXITSTATUS (stat)); return_val = 0; if (WIFSIGNALED (stat)!= 0) printf ("\t\tchild has been terminated using signal %d.\n", WTERMSIG (stat)); return_val = 0; if (WIFSTOPPED (stat)!= 0) printf ("\t\tchild has been stopped using signal %d.\n", WSTOPSIG (stat)); return_val = 1; #if defined(sunos) &&!defined(_posix_c_source) if (WIFCONTINUED (stat)!= 0) printf ("\t\tchild has continued.\n"); return_val = 1; #endif return return_val; Aufgaben: 2-1) Schreiben Sie ein Programm, in dem ein Prozess drei parallele Sohnprozesse erzeugt. Die Sohnprozesse sollen ihre PID, GID und PPID ausgeben und sich dann nach einer kurzen Wartezeit selbst beenden. Der Vaterprozess soll auf die Sohnprozesse warten. 2-2) Schreiben Sie ein Programm, in dem ein Prozess einen Sohnprozess erzeugt, der wieder einen Sohnprozess erzeugt, usw. Realisieren Sie eine Schachtelungstiefe von drei Prozessen. Jeder Prozess soll sich sonst wie in Aufgabe 2-1) verhalten. 2-3) Modifizieren Sie Aufgabe 2-1) in der Weise, dass jeder Sohnprozess eine eigene Prozessgruppe erzeugt. Zeigen Sie, dass sich die Lösungen 2-1) und 2-3) bei der Eingabe von <Ctrl-c> bzw. <Strg-c> unterschiedlich verhalten.
12 Parallelverarbeitung Folie 2-12 überlagern eines Prozesses mit einem neuen Programm int execl (const char *path, const char *arg0,, const char *argn, char * /*NULL*/) int execv (const char *path, char *const argv[]) int execle (const char *path, const char *arg0,, const char *argn, char * /*NULL*/, char *const envp[]) int execve (const char *path, char *const argv[], char *const envp[]) int execlp (const char *file, const char *arg0,, const char *argn, char * /*NULL*/) int execvp (const char *file, char *const argv[]) Vorgehensweise process 1 fork process1 process 2 exec process 2* 1) zuerst einen neuen Prozess erzeugen (Kopie des Vaterprozesses) 2) der Sohnprozess überlagert sich mit einem neuen Programm und hat jetzt sein individuelles Code- und Datensegment
13 Parallelverarbeitung Folie 2-13 die verschiedenen exec-funktionen unterscheiden sich in der Art der Parameterübergabe (explizite Liste, Feld) der Übergabe der Umgebungsvariablen (automatisch, manuell) der Suche nach dem Programm (expliziter Pfad, Auswertung der Umgebungsvariablen PATH) Systemaufruf Format der Argumente Übergabe der Umgebungsvariablen Suche über PATH- Variable execl Liste automatisch nein execv Feld automatisch nein execle Liste manuell nein execve Feld manuell nein execlp Liste automatisch ja execvp Feld automatisch ja l v e p explizite Parameterliste variable Anzahl Parameter (notwendig, falls die Anzahl der Parameter zur Übersetzungszeit unbekannt ist) manuelle Übergabe der Umgebungsvariablen Programm über Pfadvariable suchen im Allgemeinen werden die Funktionen execlp und execvp verwendet
14 Parallelverarbeitung Folie 2-14 die exec-funktionen können auch ohne fork benutzt werden (Wenn ein großes Programm in mehreren Phasen abläuft, kann die nächste Phase durch exec geladen werden. Da das Datensegment des Prozesses durch das neue Programm initialisiert wird, müssen die Phasen im Allgemeinen unabhängig voneinander sein oder ihre Daten über temporäre Dateien austauschen.) das erste Argument der Parameterliste bzw. des Parameterfeldes (Parameter arg0) ist immer ein Programmname das letzte Argument der Parameterliste bzw. des Parameterfeldes ist immer NULL
15 Parallelverarbeitung Folie 2-15 Beispiel: Programm mit "exec ( )" (forkexec.c) int main (void) pid_t fork_pid, wait_pid; /* process ID's */ int child_stat, /* return status of child */ ret_val; /* return value of a function */ fork_pid = fork (); switch (fork_pid) case -1: /* error: no process created */ perror ("fork failed"); exit (EXIT_FAILURE); break; case 0: /* child process */ ret_val = execl ("/bin/ls", "ls", "-al", NULL); if (ret_val == -1) perror ("execl failed"); exit (EXIT_FAILURE); break; default: /* parent process */ printf ("Parent process: child process with ID %ld created.\n", (long) fork_pid); wait_pid = wait (&child_stat); if (wait_pid == -1) perror ("wait"); exit (EXIT_FAILURE); else printf ("Parent process: child process %ld has \n", (long) wait_pid); eval_wait_stat (child_stat); return 0; Aufgabe 2-4: Schreiben Sie ein Programm, das vom Benutzer den Namen eines auszuführenden Programms und dessen Parameter erfragt und dieses Programm dann ausführt. Das Programm soll über die Variable PATH gesucht werden. Wenn das gewünschte Programm geendet hat, soll Ihr Programm dem Benutzer neue Eingaben erlauben (im Prinzip eine kleine Shell).
16 Parallelverarbeitung Folie Signale Signale werden im Allgemeinen vom Betriebssystemkern gesendet, um dem Prozess Ausnahmebedingungen mitzuteilen synchrone Signale (traps) werden durch die Ausführung des Programmcodes erzeugt werden im Allgemeinen direkt an den Thread ausgeliefert, der das Signal verursacht hat Beispiele: SIGSEGV, SIGFPE, SIGILL asynchrone Signale (interrupts) werden durch den Benutzer oder ein Programm erzeugt werden im Allgemeinen an einen beliebigen Thread ausgeliefert Beispiele: SIGINT, SIGQUIT, SIGTERM, SIGUSR1 die meisten Signale kann der Prozess ignorieren oder abfangen, d. h. durch eine eigene Routine bearbeiten lassen (in der Standardeinstellung beenden die meisten Signale den Prozess, der das Signal empfängt) Signale enthalten keine Informationen, d. h. der Empfänger weiß nicht, wer das Signal gesendet hat (Signale sollten nur für Ausnahmebedingungen verwendet werden und nicht zur Kommunikation. Nur der Superuser darf Signale an fremde Prozesse senden.)
17 Parallelverarbeitung Folie 2-17 einige Signalnamen und Nummern (siehe auch Handbuchseite signal(5)) (im Programm dürfen nur die Namen benutzt werden) Signalname Signalnummer Bedeutung SIGHUP 1 Hangup. Abbruch der Dialogstationsleitung (analog zum Aufhängen beim Telefon). Kann im Allgemeinen durch <Ctrl-Break> bzw. <Strg-Untbr> erzeugt werden. SIGINT 2 Interrupt. Wird jedem Prozess gesendet, der mit der Dialogstation verbunden ist, wenn die Interrupt-Taste vom Benutzer gedrückt wird (im Allgemeinen <Ctrl-c> bzw. <Strg-c>). SIGQUIT 3 Quit. Analog SIGINT, wenn die Quit-Taste gedrückt wird (im Allgemeinen <Ctrl-\> bzw. <Strg-\>). SIGFPE 8 Floating-point exception. Fehler bei einer Operation mit Gleitkommazahlen. SIGKILL 9 Kill. Dieses Signal bricht einen Prozess unbedingt ab, da es nicht ignoriert oder abgefangen werden kann. Es sollte nur in Notfällen benutzt werden. Im Normalfall sollte SIGTERM verwendet werden. SIGPIPE 13 Write on a pipe not opened for reading. Falls ein Prozess in einer Pipeline anormal endet, erhalten alle Prozesse auf der rechten Seite der Pipeline (Leserprozesse) ein end-of-file und alle Prozesse auf der linken Seite (Schreiberprozesse) dieses Signal. Die Schreiberprozesse können nur auf diese Weise über den "Tod" eines Leserprozesses informiert werden. SIGALRM 14 Alarm clock. Dieses Signal zeigt an, dass sich der "Wecker" des Prozesses gemeldet hat, der mit der Systemfunktion alarm gestellt wurde. SIGTERM 15 Software termination. Das normale Beendigungs-Signal für einen Prozess (kill-kommando, shutdown-kommando). Dieses Signal sollte im Allgemeinen weder ignoriert noch SIGUSR1 SIGUSR abgefangen werden! User defined signal. Obwohl diese Signale zur Interprozesskommunikation benutzt werden können, werden sie im Allgemeinen nicht verwendet, da Prozesse nicht über Signale miteinander kommunizieren sollen (Da Signale z. B. ignoriert werden können, sind sie kein sicheres Kommunikationsmittel.)
18 Parallelverarbeitung Folie 2-18 falls ein Programm vor einer zwangsweisen Beendigung auf jeden Fall noch bestimmte Aufräumarbeiten erledigen muss, sollte es die Signale SIGHUP, SIGINT und SIGTERM abfangen (Die Aufräumarbeiten sollten sehr schnell erledigt werden. Danach sollte der Prozess sofort exit aufrufen! Damit der Benutzer das Programm noch über die Tastatur abbrechen kann, sollte das Signal SIGQUIT in diesem Fall nicht abgefangen werden.) die folgenden Signale beenden normalerweise (default) nicht nur die Prozesse, sondern erzeugen auch einen Speicherabzug (core dump): SIGQUIT (quit) SIGILL (illegal instruction) SIGTRAP (trace trap) SIGABRT (abort) SIGEMT (emulator trap instruction) SIGFPE (arithmetic exception) SIGBUS (bus error) SIGSEGV (segmentation violation) SIGSYS (bad argument to system call) SIGXCPU (CPU time limit exceeded) SIGXFSZ (file size limit exceeded)
19 Parallelverarbeitung Folie 2-19 einfaches Verfahren zur Signalbehandlung void (*signal (int sig_name, void (*sig_handler) (int))) (int) diese Funktion ist auch in ANSI C bzw. ISO-C definiert (signal ist eine Funktion mit zwei Parametern (sig_name und sig_handler), die einen Zeiger auf eine Funktion mit einem Parameter vom Typ int ohne Rückgabewert zurückliefert. sig_handler ist ein Zeiger auf eine Funktion mit einem Parameter vom Typ int ohne Rückgabewert.) signal ordnet einem Signal mit Namen sig_name eine neue Bearbeitungsfunktion mit Namen sig_handler zu falls die neue Funktion installiert werden konnte, wird die Adresse der bisherigen Bearbeitungsfunktion als Rückgabewert geliefert und sonst SIG_ERR (in diesem Fall wird errno gesetzt) sig_handler kann folgende Werte haben: 1) SIG_DFL wählt die Standard-Bearbeitungsroutine aus, d. h. der Prozess wird durch die meisten Signale beendet 2) SIG_IGN ignoriert das Signal (SIGKILL und SIGSTOP können nicht ignoriert werden) 3) Adresse einer neuen Bearbeitungsfunktion (SIGKILL und SIGSTOP können nicht abgefangen werden)
20 Parallelverarbeitung Folie 2-20 wenn ein Signal abgefangen werden soll, laufen beim Eintreffen des Signals folgende Aktionen ab: 1) im Allgemeinen wird die Bearbeitungsroutine für das Signal wieder auf SIG_DFL zurückgesetzt, bevor die eigene Bearbeitungsroutine ausgeführt wird 2) der Bearbeitungsroutine wird die Nummer des abgefangenen Signals als Parameter übergeben die Bearbeitungsroutine kann mit abort ( ), exit ( ), longjmp ( ) oder return enden falls die Routine mit return endet, melden einige Systemfunktionen den Fehler EINTR (error interrupted) da die Funktionen der C-Laufzeitbibliothek u. U. nicht invariant (reentrant) programmiert sind, können sie nicht zuverlässig in einer Bearbeitungsroutine benutzt werden, die mit return endet es ist u. U. wichtig, wann die eigene Routine reinstalliert wird am Anfang der Signalbehandlungsroutine kann z. B. bei SIGCHLD zu einem Fehler mit der Meldung Segmentation Fault (core dumped) führen (Solaris 2.5.1, nicht bei Solaris ab Version 7, Linux) am Ende der Signalbehandlungsroutine der Prozess wird u. U. beendet, weil die eigene Routine nicht schnell genug reinstalliert wurde und das Signal noch einmal aufgetreten ist
21 Parallelverarbeitung Folie 2-21 Beispiel: Signale ignorieren (fork_sig.c) void set_sig_action (int sig, void (**old) (int), void (*new) (int), char *err_msg); static void (*old_sighup) (int); /* address of old signal handler*/ int main (void) fork_pid = fork (); switch (fork_pid) case -1: /* error: no process created */ case 0: /* child process */ default: /* parent process */ set_sig_action (SIGHUP, &old_sighup, SIG_IGN, "Couldn't ignore SIGHUP"); printf ("Parent process: ignore SIGHUP, SIGINT, SIGQUIT, and " "SIGTERM\n"); alarm (ALARM_TIME); /* force process termination */ do wait_pid = waitpid ((pid_t) -1, &child_stat, opt); while (eval_wait_stat (child_stat)!= 0); set_sig_action (SIGHUP, &old_sighup, old_sighup, "Couldn't restore SIGHUP"); printf ("Parent process: SIGHUP, SIGINT, SIGQUIT, and " "SIGTERM restored.\n"); return 0; void set_sig_action (int sig, void (**old) (int), void (*new) (int), char *err_msg) register void (*tmp) (int); /* address of old handler */ if ((tmp = signal (sig, new)) == SIG_ERR) perror (err_msg); exit (1); if ((tmp!= SIG_IGN) && (tmp!= SIG_DFL) && (new!= SIG_IGN) && (new!= SIG_DFL)) if (tmp!= new) fprintf (stderr, "Error: Another signal handler is already " "installed.\n"); exit (2); *old = tmp;
22 Parallelverarbeitung Folie 2-22 Beispiel: Signalbehandlungsroutine installieren/reinstallieren (sig.c) int main (void) pid_t fork_pid; /* Prozessnummer */ if (signal (SIGCHLD, sig_handler) == SIG_ERR) perror ("signal (SIGCHLD, )"); exit (EXIT_FAILURE); fork_pid = fork (); switch (fork_pid) case -1: /* Fehler: kein Prozess erzeugt */ case 0: /* Sohnprozess */ printf ("Sohnprozess: Schlafe %d Sekunden.\n", SLEEP_TIME_CHILD); sleep (SLEEP_TIME_CHILD); printf ("Sohnprozess: Rufe \"exit (0)\" auf.\n"); exit (EXIT_SUCCESS); break; default: /* Vaterprozess */ printf ("Vaterprozess: Schlafe %d Sekunden.\n", SLEEP_TIME_PARENT); sleep (SLEEP_TIME_PARENT); printf ("Vaterprozess: Beende mich.\n"); return 0; void sig_handler (int sig) #ifdef ANFANG if (signal (SIGCHLD, sig_handler) == SIG_ERR) perror ("sig_handler"); exit (EXIT_FAILURE); #endif switch (sig) case SIGCHLD: while (waitpid ((pid_t) -1, NULL, WNOHANG) > 0) ; break; default: ; #ifndef ANFANG if (signal (SIGCHLD, sig_handler) == SIG_ERR) perror ("sig_handler"); exit (EXIT_FAILURE); #endif
23 Parallelverarbeitung Folie 2-23 detailliertes Verfahren zur Signalbehandlung int sigaction (int sig_name, const struct sigaction *action, struct sigaction *old_action) Struktur von struct sigaction struct sigaction void (*sa_handler) (int); void (*sa_action) (int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; ; (Solaris packt die beiden Zeiger auf eine Funktion noch in eine Verbundstruktur (union)) über die Komponenten sa_mask und sa_flags kann detailliert festgelegt werden, wie ein Signal behandelt werden soll das Flag SA_SIGINFO bestimmt, ob eine Signalbehandlungsroutine mit einem Parameter oder eine mit drei Parametern benutzt werden soll das Flag SA_NOCLDWAIT verhindert, dass Zombie- Prozesse erzeugt werden das Flag SA_RESTART sorgt dafür, dass einige unterbrochene Systemfunktionen transparent wieder gestartet werden (in diesem Falle würden sie nicht den Fehler EINTR melden) weitere Einzelheiten stehen in der Handbuchseite
24 Parallelverarbeitung Folie 2-24 ein Signal an den eigenen Prozess senden int raise (int sig_name) diese Funktion ist auch in ANSI C bzw. ISO-C definiert sie führt die Aufgabe mit kill (getpid ( ), sig_name) aus Signal an einen bestimmten Prozess oder eine Prozessgruppe senden int kill (pid_t pid, int sig_name) falls pid größer als 0 ist, wird das Signal an den Prozess gesendet, dessen ID mit pid identisch ist falls pid kleiner als -2 ist, wird das Signal an alle Prozesse gesendet, deren PGID mit dem absoluten Wert von pid identisch ist kill ((pid_t) -1, SIGTERM) beendet unabhängig von der Prozessgruppe alle Prozesse, die einem Prozess gehören (Falls der Superuser diesen Funktionsaufruf ausführt, werden alle Prozesse bis auf den swap- und init-prozess (PID 0 und 1) beendet. Damit können alle Prozesse auf einfache Weise vor dem Herunterfahren des Systems (shutdown) beendet werden.) weitere Einzelheiten stehen in der Handbuchseite
25 Parallelverarbeitung Folie 2-25 auf das Eintreffen eines Signals warten int pause (void) der Prozess wird bis zum Eintreffen eines Signals blockiert setzen einer "Weckzeit" unsigned int alarm (unsigned int seconds) falls der Prozess nach dem Aufruf von alarm auf ein Ereignis wartet, muss die Uhr im Allgemeinen gestoppt werden, wenn der Prozess durch ein anderes Ereignis geweckt wird (andernfalls erhält der Prozess das Signal SIGALRM u. U. zu einem Zeitpunkt, zu dem er mit diesem Signal nicht mehr rechnet) jeder neue Aufruf von alarm überschreibt den vorhergehenden ein Aufruf mit 0 Sekunden löscht die Weckzeit weitere Einzelheiten stehen in der Handbuchseite Aufgabe 2-5: Schreiben Sie ein Programm, das n Sohnprozesse erzeugt. Jeder Sohnprozess soll den vorher erzeugten Sohnprozessen für eine gewisse Zeit wahlweise die Signale SIGUSR? senden. Jedes Signal soll bei jedem Sendevorgang sehr schnell mit einer zufälligen Häufigkeit gesendet werden. Alle Prozesse zählen, wie viele Signale sie gesendet und empfangen haben. Das Ergebnis soll auf geeignete Weise ausgegeben werden.
26 Parallelverarbeitung Folie Pipes eine Pipe erlaubt einen unidirektionalen Datenfluss zwischen zwei Prozessen Aufsetzen einer Pipe 1) der Prozess erzeugt eine Pipe parent process fd[1] (write) fd[0] (read) pipe data flow operating system kernel 2) der Prozess erzeugt einen Sohnprozess parent process fd[1] fd[0] fork child process fd[1] fd[0] pipe data flow operating system kernel
27 Parallelverarbeitung Folie ) der Vaterprozess schließt den Leseausgang und der Sohnprozess den Schreibeingang der Pipe parent process fd[1] fork child process fd[0] pipe data flow operating system kernel für das Kommando "who sort more" würde auf diese Weise der folgende Ablauf erzeugt werden process "who" fd[1] process "sort" fd[1] fd[0] process "more" fd[0] pipe pipe data flow operating system kernel data flow
28 Parallelverarbeitung Folie 2-28 ein bidirektionaler Datenfluss zwischen Vater- und Sohnprozess erfordert zwei unidirektionale Pipes, die folgendermaßen aufgesetzt werden (obwohl einige Betriebssysteme auch bidirektionale Pipes unterstützen, sollen hier nur unidirektionale Pipes benutzt werden) parent process fd2[0] fd1[1] child process fd1[0] fd2[1] pipe 1 data flow pipe 2 data flow operating system kernel eine unnamed Pipe zur Interprozesskommunikation zwischen verwandten Prozessen erzeugen (Vater - Sohn, Sohn - Sohn, ) int pipe (int file_descriptor[2]) Datenübermittlung: first-in-first-out der Zugriff auf die Pipe erfolgt nur über die Datei-Deskriptoren
29 Parallelverarbeitung Folie 2-29 einige Systemaufrufe zur Handhabung von Pipes: write Mit Hilfe dieser Funktion können Daten in die Pipe geschrieben werden. Falls die Pipe voll ist, wird der schreibende Prozess im Allgemeinen solange blockiert bis der lesende Prozess so viele Daten gelesen hat, dass der Schreibauftrag vollständig ausgeführt werden kann (atomare Operation). Die Größe der Pipe hängt von der Implementierung ab (mindestens 4096 Bytes). Der schreibende Prozess kann ein endof-file erzeugen, indem er den Schreibeingang schließt. read Mit Hilfe dieser Funktion können Daten aus der Pipe gelesen werden. Falls die Pipe leer ist, wird der lesende Prozess im Allgemeinen solange blockiert bis mindestens ein Byte in der Pipe zur Verfügung steht oder der Schreibeingang geschlossen wurde. close Mit Hilfe dieser Funktion können die Enden der Pipe geschlossen werden. Falls der Schreibeingang geschlossen wird, wird für den Leser ein end-of-file erzeugt. Falls der Leseausgang geschlossen wird, führt ein Schreibauftrag zu einem Fehler. In diesem Fall wird das Signal SIGPIPE erzeugt. fcntl Mit Hilfe dieser Funktion kann u. a. eingestellt werden, ob ein Prozess bei einem erfolglosen Schreib-/Leseauftrag blockiert werden soll oder nicht. dup Dupliziert einen Datei-Deskriptor. (Vorgehensweise damit ein Prozess immer vom/auf Datei-Deskriptor 0/1 lesen/schreiben kann: Schließe Deskriptor 0/1. Rufe dup mit dem Lese-/Schreib- Deskriptor der Pipe auf.)
30 Parallelverarbeitung Folie 2-30 eine named Pipe (spezielle FIFO-Datei) zur Interprozesskommunikation zwischen Prozessen erzeugen int mknod (const char *path, mode_t mode, dev_t dev) erlaubt den Datenaustausch zwischen beliebigen Prozessen, die den Namen der FIFO-Datei kennen und die erforderlichen Zugriffsrechte besitzen die FIFO-Datei muss zuerst mit der open-funktion geöffnet werden für read, write, gilt dasselbe wie bei unnamed Pipes Schreib- und Lese-Operationen sind auf jeden Fall atomar, wenn die Blockgröße 4096 Bytes nicht überschreitet unnamed und named Pipes für einige Anwendungen zu langsam das Ergebnis des Shell-Kommandos "ls wc" kann auch durch die folgenden Kommandos erreicht werden: /etc/mknod mypipe p ls > mypipe & wc < mypipe rm mypipe
31 Parallelverarbeitung Folie 2-31 Aufgabe 2-6: Implementieren Sie einen Erzeuger- und einen Verbraucherprozess, die über eine FIFO-Datei kommunizieren können. Der Erzeugerprozess generiert Datensätze, die eine Prozessnummer (z. B. über einen Parameter auf der Kommandozeile oder seine PID) und eine fortlaufende Nummer enthalten. Die Anzahl der zu erzeugenden Datensätze wird ihm auf jeden Fall als Parameter über die Kommandozeile übergeben. Der Verbraucherprozess gibt die Datensätze aus, nachdem er seine eigene Prozessnummer ausgegeben hat. Nachdem Sie z. B. mit "/etc/mknod erz_ver p" eine FIFO-Datei erzeugt haben, können Sie z. B. folgendes Kommando eingeben, um drei Erzeuger- (Kommando: erz) und zwei Verbraucherprozesse (Kommando: ver) zu starten: erz 20 & erz 30 & erz 25 & ver & ver Erhalten Sie immer dieselbe Ausgabenreihenfolge ihrer Verbraucherprozesse?
32 Parallelverarbeitung Folie Shared Memory es gibt verschiedene Programmierschnittstellen System V IPC (wird in diesem Kapitel vorgestellt) benutzt nur den Hauptspeicher ermöglicht effizienten Datenaustausch zwischen parallelen Prozessen (schnellste Möglichkeit der Datenübertragung zwischen zwei Prozessen) benutzt einen Schlüsselwert zur Bestimmung der Identifikationsnummer des gewünschten Speicherbereichs mmap ( ) erlaubt einen impliziten Zugriff auf eine Datei über den virtuellen Speicher (memory mapped object) Vorgehensweise eine normale Datei wird geöffnet, um einen Dateideskriptor zu erhalten mmap ( ) wird mit dem Dateideskriptor und weiteren Parametern aufgerufen, um den Dateiinhalt in den virtuellen Speicher einzubinden die Datei kann über normale Speicherzugriffe gelesen bzw. geändert werden
33 Parallelverarbeitung Folie 2-33 mmap ist besser in UNIX integriert als System V IPC, da Dateien benutzt werden mmap verwendet Dateinamen und Pfade als Namen, da die gemeinsamen Objekte Dateien sind gemeinsame Objekte werden mit normalen Systemfunktionen erzeugt bzw. entfernt (open ( ), unlink ( )) der Eigentümer und die Zugriffsrechte können mit normalen Systemfunktionen geändert werden (chown ( ), chmod ( )) die gemeinsamen Objekte überleben einen Stromausfall oder Neustart der Maschine, falls der Speicherbereich vorher in die Datei zurückgeschrieben wurde mmap ist wegen der Festplattenzugriffe sehr langsam POSIX IPC ähnelt mmap ( ), da es ebenfalls auf dem Dateisystem basiert es gibt zwei Funktionen: shm_open ( ) und shm_unlink ( ) (sie stellen nur eine Schnittstelle für die POSIX IPC Namensgebung zur Verfügung, d. h. sie ersetzen im Wesentlichen open ( ) und unlink ( ) die eigentliche Einbindung des gemeinsamen Objekts in den virtuellen Speicher erfolgt dann über mmap ( ))
34 Parallelverarbeitung Folie 2-34 Überblick über die Programmierschnittstellen System V IPC UNIX mmap POSIX IPC Speicherbereich in Betriebssystemtabelle anlegen Speicherbereich an virtuellen Adressraum anbinden Speicherbereich aus virtuellem Adressraum entfernen Speicherbereich aus Betriebssystemtabelle entfernen shmget () open () lseek () write () shm_open () lseek () write () shmat () mmap () mmap () shmdt () munmap () munmap () shmctl () close () unlink () close () shm_unlink () (Bei mmap kann die Größe einer neuen Datei dadurch festgelegt warden, dass mit lseek eine Position in der Datei festgelegt wird, an der dann mit write ein Zeichen geschrieben wird.) mehrere Prozesse können einen gemeinsamen Speicherbereich gleichzeitig in ihren virtuellen Speicher einbinden
35 Parallelverarbeitung Folie 2-35 Vorgehensweise bei System V IPC 1) Speicherbereich anlegen/öffnen (shmget) 2) Speicherbereich an eigenen Datenbereich anbinden (shmat) 3) Datenübertragung 4) Speicherbereich freigeben (shmdt) 5) Speicherbereich löschen/schließen (shmctl) der Zugriff auf den Speicherbereich kann gesteuert werden (shmctl) (Zugriffsrechte, Sperren, ) neue Segmente belegen noch keinen Speicherplatz (es erfolgt nur ein Eintrag in der Shared Memory Tabelle des Betriebssystems) der Speicherplatz wird erst dann belegt, wenn ein Prozess den Bereich in seinen virtuellen Speicher einbindet der Zugriff auf den gemeinsamen Speicherbereich muss synchronisiert werden (im Allgemeinen über Semaphore)
36 Parallelverarbeitung Folie 2-36 allgemeine Kommandos für einen gemeinsamen Speicherbereich int shmctl (int shmid, int cmd, struct shmid_ds *buf) shmid Identifikationsnummer des Speicherbereichs (wird von shmget geliefert) cmd auszuführendes Kommando IPC_RMID ID in Shared Memory Tabelle löschen IPC_SET Werte ändern buf Zeiger auf Datenpuffer, z. B. bei IPC_SET Struktur des Datensatzes hängt vom Betriebssystem ab (siehe shm.h) struct shmid_ds struct ipc_perm shm_perm; /* operation permission struct */ int shm_segsz; /* size of segment in bytes */ struct anon_map *shm_amp; /* segment anon_map pointer */ ushort shm_lkcnt; /* number of times it is being locked */ pid_t shm_lpid; /* pid of last shmop */ pid_t shm_cpid; /* pid of creator */ ulong shm_nattch;/* used only for shminfo */ ulong shm_cnattch;/* used only for shminfo */ time_t shm_atime; /* last shmat time */ long shm_pad1; /* reserved for time_t expansion */ time_t shm_dtime; /* last shmdt time */ long shm_pad2; /* reserved for time_t expansion */ time_t shm_ctime; /* last change time */ long shm_pad3; /* reserved for time_t expansion */ long shm_pad4[4];/* reserve area */ jedes Speicher-Segment muss explizit in der Shared Memory Tabelle des Betriebssystems gelöscht werden (IPC_RMID)
37 Parallelverarbeitung Folie 2-37 gemeinsamen Speicherbereich anlegen/öffnen und die Identifikationsnummer des Bereichs zurückliefern int shmget (key_t key, int size, int shmflg) key vom Benutzer wählbarer eindeutiger numerischer Schlüssel oder IPC_PRIVATE (bei IPC_PRIVATE kennen fremde Programme den Schlüssel nicht und können das Segment daher nicht benutzen; ein numerischer Schlüssel kann als symbolische Konstante oder Parameter auf der Kommandozeile definiert werden) size Größe des Segments shmflg Zugriffsrechte und Funktionssteuerung (falls beim Eröffnen eines neuen Segments keine Zugriffsrechte gesetzt werden, ist das Segment wertlos, da in der Standard-Einstellung nicht einmal der Erzeuger selbst irgendwelche Zugriffsrechte besitzt) Funktionssteuerung IPC_CREAT neues Segment erzeugen, falls das Segment mit dem angegebenen Schlüssel noch nicht existiert IPC_EXCL liefert einen Fehler, falls das Segment neu angelegt werden soll und der angegebene Schlüssel schon existiert
38 Parallelverarbeitung Folie 2-38 Shared Memory Operationen Speicherbereich an eigenen Datenbereich anbinden und Adresse des Segments zurückliefern void *shmat (int shmid, void *shmaddr, int shmflg) shmid Identifikationsnummer des Speicherbereichs shmaddr (void *) 0, falls das System die Adresse wählen darf (Einzelheiten stehen in der Handbuchseite) shmflg Zugriffsrechte (siehe Handbuchseite) Speicherbereich freigeben int shmdt (void *shmaddr) shmaddr Adresse des freizugebenden Speicherbereichs vor jedem Logout muss überprüft werden, ob Shared Memory Segmente nicht gelöscht worden sind Kommando ipcs -m gibt aus, welche Segmente vorhanden sind ggf. müssen diese Segmente manuell gelöscht werden ipcrm -m <shmid> (IRIX, SunOS) ipcrm -M <shmkey> (IRIX, SunOS) ipcrm shm <shmid> (Linux)
39 Parallelverarbeitung Folie 2-39 Beispiel: Nutzung eines gemeinsamen Speicherbereichs ohne Synchronisation Ein Prozess gibt ein Zeichen n-mal auf dem Bildschirm aus. Ein anderer Prozess kann sowohl das Zeichen ändern als auch die Zahl, die angibt, wie oft das Zeichen ausgegeben werden soll. Wenn zwischen dem Lesen dieser beiden Werte ein Prozesswechsel stattfindet, wird das alte Zeichen mit der neuen Häufigkeit ausgegeben. gemeinsame Header-Datei für beide Programme (shm_definitions.h) struct shared_seg char c; /* character to print */ int frq; /* frequency of character */ ; #define SEGSIZE (sizeof (struct shared_seg)) #define SHM_KEY ((key_t) 0x2206) /* arbitrary value */ #define SHM_PERM (0600) /* access permissions */
40 Parallelverarbeitung Folie 2-40 Programm zur Ausgabe der Werte (shm_output_2.c) #define SLEEP_TIME 2 /* 2 seconds */ #define ESHMGET 1 /* error calling "shmget()" */ int main (void) struct shared_seg *shm_adr; /* address of shm segment */ struct shmid_ds shmbuf; /* for shmctl */ int shm_id, /* ID of shm segment */ shm_frq, /* temporary value */ i; /* loop variable */ char shm_c; /* temporary value */ shm_id = shmget (SHM_KEY, SEGSIZE, IPC_CREAT SHM_PERM); if (shm_id < 0) perror ("shm_output_2: shmget failed"); exit (ESHMGET); /* let the system choose an appropriate address */ shm_adr = (struct shared_seg *) shmat (shm_id, NULL, SHM_PERM); if (shm_adr < (struct shared_seg *) 0) perror ("shm_output_2: shmat failed"); exit (ESHMAT); /* initialize the shared memory segment */ shm_adr->c = 'x'; shm_adr->frq = 70; /* display a new line every "2 * SLEEP_TIME" seconds */ while ((shm_adr->c!= 'q') && (shm_adr->frq > 0)) shm_c = shm_adr->c; printf (" I'll read the frequency in %d s\n", SLEEP_TIME); sleep (SLEEP_TIME); /* allow shm inconsistency */ shm_frq = shm_adr->frq; for (i = 0; i < shm_frq; ++i) putchar (shm_c); putchar ('\n'); sleep (SLEEP_TIME); /* release the shared memory segment */ #ifndef XPG4 #else if (shmdt (shm_adr) < 0) perror ("shm_output_2: shmdt failed"); exit (ESHMDT); #endif if (shmctl (shm_id, IPC_RMID, &shmbuf) < 0) perror ("shm_output_2: shmctl failed"); exit (ESHMCTL); return 0;
41 Parallelverarbeitung Folie 2-41 Programm zum Ändern der Werte (shm_change_contents.c) int main (int argc, char *argv[]) struct shared_seg *shm_adr; /* address of shm segment */ int shm_id; /* ID of shm segment */ if (argc!= 3) fprintf (stderr, "\nthis program changes the \"char\" and " "\"frequency\" in a shared memory segment.\n" "The \"char\" will be displayed \"frequency\" times " "on a line.\n\n"); fprintf (stderr, "Usage: %s <char> <frequency>\n\n", argv[0]); exit (EXIT_FAILURE); shm_id = shmget (SHM_KEY, SEGSIZE, IPC_CREAT SHM_PERM); if (shm_id < 0) perror ("shm_change_contents: shmget failed"); exit (ESHMGET); /* let the system choose an appropriate address */ shm_adr = (struct shared_seg *) shmat (shm_id, NULL, SHM_PERM); if (shm_adr < (struct shared_seg *) 0) perror ("shm_change_contents: shmat failed"); exit (ESHMAT); /* change the contents of the shared memory segment */ shm_adr->c = argv[1][0]; shm_adr->frq = atoi (argv[2]); /* detach the shared memory segment */ #ifndef XPG4 if (shmdt ((char *) shm_adr) < 0) perror ("shm_change_contents: shmdt failed"); exit (ESHMDT); #else #endif return 0; jedes Zeichen wird immer mit der richtigen Häufigkeit ausgegeben, wenn der Zugriff auf den gemeinsamen Speicherbereich durch Semaphore geschützt wird
42 Parallelverarbeitung Folie 2-42 System V IPC Mechanismen können über Systemparameter konfiguriert werden SHMMNI SHMMAX SEMMNI SEMMSL SEMOPM MSGMNI MSGMNB MSGTQL maximale Anzahl Identifikationsnummern für Shared Memory Segmente maximale Größe eines Shared Memory Segments in Bytes maximale Anzahl Identifikationsnummern für Semaphore-Kollektionen maximale Anzahl Semaphore pro Kollektion maximale Anzahl Operationen pro semop-aufruf maximale Anzahl Identifikationsnummern für Nachrichtenwarteschlangen maximale Anzahl Bytes aller Nachrichten der Nachrichtenwarteschlange maximale Anzahl Nachrichten in der Nachrichtenwarteschlange
43 Parallelverarbeitung Folie 2-43 unter Linux 2.6.x werden die Werte in den folgenden Dateien festgelegt: /usr/include/linux/shm.h /usr/include/linux/sem.h /usr/include/linux/msg.h falls Werte geändert werden, muss ein neuer Betriebssystemkern erzeugt werden die aktuellen Werte können mit folgendem Kommando ausgegeben werden /sbin/sysctl -a grep -e shm -e sem -e msg
44 Parallelverarbeitung Folie 2-44 unter Solaris werden die Standardwerte vermutlich direkt in den folgenden Moduldateien festgelegt: shmsys semsys msgsys (Die Dateien befinden sich im Verzeichnis "/kernel/sys" (32-Bit Betriebssystem), "/kernel/sys/sparcv9" oder "/kernel/sys/amd64" (64-Bit Betriebssysteme).) bis Solaris 9 werden Änderungen über die Datei /etc/system vorgenommen (siehe Handbuchseite "man -s 4 system") z. B.: set shmsys:shminfo_shmmni = <value> set semsys:seminfo_semmni = <value> set msgsys:msginfo_msgmni = <value> falls Werte geändert werden, muss das System neu gestartet werden die aktuellen Werte können mit folgendem Kommando ausgegeben werden (siehe Handbuchseite sysdef) /usr/sbin/sysdef /usr/xpg4/bin/grep -e SHM -e SEM -e MSG (Solaris 10 führte "Container" und prozessspezifische Ressourcen ein, so dass jetzt alles ein wenig anders gemacht werden muss. Benutzen Sie "man prctl", "man getrctl" und "man rctladm" als erste Informationsquelle, wenn Sie am neuen Konzept interessiert sind. Die aktuellen Werte können ab Solaris 10 mit dem Kommando "rctladm -l" angezeigt werden. Der Vorteil des neuen Konzepts ist, dass die Werte jetzt für jeden Prozess individuell gesetzt werden können und dass das System nicht mehr neu gestartet werden muss, wenn Werte geändert werden.)
45 Parallelverarbeitung Folie Semaphore es gibt verschiedene Programmierschnittstellen System V IPC (wird in diesem Kapitel vorgestellt) benutzt nur den Hauptspeicher benutzt einen Schlüsselwert zur Bestimmung der Identifikationsnummer der gewünschten Semaphore-Kollektion POSIX IPC namenlose Semaphore benutzen nur den Hauptspeicher entsprechen den Semaphoren von Dijkstra #define SEM_INITVAL 1 sem_t s /* semaphore */ sem_init (&s, TRUE, SEM_INITVAL); sem_wait (&s); /* one-to-one correspondence to P(s) */ sem_post (&s); /* one-to-one correspondence to V(s) */ Semaphore mit Namen: basieren auf Dateien im Dateisystem
46 Parallelverarbeitung Folie 2-46 Überblick über die Programmierschnittstellen POSIX named semaphores POSIX unnamed semaphores System V semaphores Semaphore erzeugen sem_open () sem_init () semget () Initialisieren beim Erzeugen beim Erzeugen semctl () P ( ) sem_wait () sem_timedwait () sem_trywait () sem_wait () sem_timedwait () sem_trywait () semop () V ( ) sem_post () sem_post () semop () Wert lesen sem_getvalue () sem_getvalue () semctl () Semaphore entfernen sem_close () sem_unlink () sem_destroy () semctl ()
47 Parallelverarbeitung Folie 2-47 Semaphore aus System V IPC sind sehr mächtig sie können um beliebige Werte erhöht/erniedrigt werden eine Subtraktion wird nur dann durchgeführt, wenn das Ergebnis größer oder gleich Null ist der Prozess wird ggf. solange blockiert, bis die Subtraktion ausgeführt werden kann mehrere Semaphore können mit einem Funktionsaufruf manipuliert werden die Operation ist atomar, d. h., für Subtraktionen müssen alle Ergebnisse größer oder gleich Null sein der Prozess wird ggf. solange blockiert, bis alle Operationen gleichzeitig ausgeführt werden können in einem Funktionsaufruf kann zusätzlich zur Manipulation mehrerer Semaphoren darauf gewartet werden, dass einige Semaphore den Wert Null annehmen die Operation ist atomar, d. h., für Subtraktionen müssen alle Ergebnisse größer oder gleich Null sein der Prozess wird ggf. solange blockiert, bis alle Operationen gleichzeitig ausgeführt werden können und die spezifizierten Semaphoren den Wert Null angenommen haben
48 Parallelverarbeitung Folie 2-48 der Prozess kann festlegen, dass er nicht blockiert wird, wenn eine Semaphor-Operation nicht sofort ausgeführt werden kann (in diesem Fall liefert der Funktionsaufruf einen Fehler zurück und errno wird entsprechend gesetzt) der Prozess kann festlegen, dass das System alle Operationen "protokolliert" und ggf. automatisch rückgängig macht, wenn der Prozess abbricht Darstellung von Semaphoren jedem Semaphor ist folgende Datenstruktur zugeordnet struct sem ushort semval; /* current value, nonnegative */ pid_t sempid; /* PID of last operation */ /* perhaps more operating system dependent variables */ ; Semaphore werden in Kollektionen (semaphore set) zusammengefasst (auch für ein einziges Semaphor muss eine Kollektion erzeugt/initialisiert werden) eine Semaphore-Kollektion wird durch folgende Datenstruktur repräsentiert (abhängig vom Betriebssystem; siehe sem.h) struct semid_ds struct ipc_perm sem_perm; /* operation permission struct */ struct sem *sem_base; /* ptr to first semaphore in set */ ushort sem_nsems; /* # of semaphores in set */ time_t sem_otime; /* last semop time */ long sem_pad1; /* reserved for time_t expansion */ time_t sem_ctime; /* last change time */ long sem_pad2; /* time_t expansion */ long sem_pad3[4]; /* reserve area */ ; diese Datenstruktur gibt es für jede semid
49 Parallelverarbeitung Folie 2-49 Zusammenfassung der Datenstrukturen für Semaphore pool of semaphore sets (struct semid_ds *) semaphore set (struct semid_ds) array of semaphores (struct sem) sem_perm sem_base sem_perm sem_base (struct semid_ds *) NULL (struct semid_ds *) NULL semval sempid semncnt semzcnt semval sempid semncnt semzcnt semval sempid semncnt semzcnt semval sempid semncnt semzcnt semaphore 0 semaphore n semaphore 0 semaphore k semid wird als Index in das Feld Semaphor ID Pool benutzt die Datenstruktur spart sehr viel Speicher im Betriebssystemkern, solange keine oder wenige Semaphore benutzt werden Vorgehensweise: 1) Semaphore anlegen und initialisieren (semget) 2) Semaphore benutzen (semop, semctl) 3) Semaphore freigeben (semctl)
50 Parallelverarbeitung Folie 2-50 allgemeine Kommandos für Semaphore int semctl (int semid, int semnum, int cmd, union semun arg) semid Identifikationsnummer der Semaphore- Kollektion (wird von semget geliefert) semnum Nummer des Semaphors in der Kollektion cmd auszuführendes Kommando GETVAL Wert eines Semaphors liefern SETVAL Wert eines Semaphors setzen GETALL Werte aller Semaphore liefern SETALL Werte aller Semaphore setzen IPC_SET u. a. Zugriffsrechte setzen IPC_RMID Semaphoren-Kollektion löschen usw. siehe Handbuchseite arg abhängig von cmd union semun int val; /* z. B. bei SETVAL */ struct semid_ds *buf; /* z. B. bei IPC_SET */ ushort *array; /* z. B. bei SETALL */ ; Rückgabewert ist abhängig von cmd (siehe Handbuchseite) die Datenstrukturen für Semaphore müssen explizit gelöscht werden (IPC_RMID)
51 Parallelverarbeitung Folie 2-51 vor jedem Logout muss überprüft werden, ob Semaphore-Kollektionen nicht gelöscht worden sind Kommando ipcs -s gibt aus, welche Kollektionen vorhanden sind ggf. müssen diese Kollektionen manuell gelöscht werden ipcrm -s <semid> (IRIX, SunOS) ipcrm -S <semkey> (IRIX, SunOS) ipcrm sem <semid> (Linux) Semaphore-Kollektion anlegen und die Identifikationsnummer zurückliefern int semget (key_t key, int nsems, int semflg) key vom Benutzer wählbarer eindeutiger numerischer Schlüssel oder IPC_PRIVATE (bei IPC_PRIVATE kennen fremde Programme den Schlüssel nicht und können die Semaphore-Kollektion daher nicht benutzen; ein numerischer Schlüssel kann als symbolische Konstante oder Parameter auf der Kommandozeile definiert werden) nsems gewünschte Anzahl Semaphore in der Kollektion semflg Zugriffsrechte und Funktionssteuerung Funktionssteuerung: IPC_CREAT IPC_EXCL neue Kollektion erzeugen liefert einen Fehler, falls die Semaphore- Kollektion neu angelegt werden soll und der angegebene Schlüssel schon existiert
52 Parallelverarbeitung Folie 2-52 atomare Operationen auf Semaphore einer Kollektion durchführen int semop (int semid, struct sembuf *sops, size_t nsops) struct sembuf ushort sem_num; /* Nummer des Semaphors */ short sem_op; /* Operation */ short sem_flg; /* Flags */ ; semop (int semid, struct sembuf *sops, size_t nsops) handle for semaphore set number of operations in the array array of semaphore operations sem_num sem_op sem_flg number of semaphore to operate on operations: < 0: corresponds to P() operation > 0: corresponds to V() operation = 0: wait until count equals 0 IPC_NOWAIT SEM_UNDO 0 die maximale Anzahl Operationen pro semop-aufruf ist abhängig vom Betriebssystem
53 Parallelverarbeitung Folie 2-53 sem_op > 0 Semaphorwert um diesen Wert erhöhen sem_op < 0 sem_op = 0 Semaphorwert um den Wert dekrementieren, falls möglich (ein negatives Ergebnis würde den Prozess ggf. blockieren, ohne die Operation auszuführen) warten bis der Zähler des Semaphors Null wird sem_flg kann folgende Werte annehmen: IPC_NOWAIT kann für jede einzelne Operation gesetzt werden Falls eine Operation, für die IPC_NOWAIT gesetzt ist, nicht erfolgreich durchgeführt werden kann, wird überhaupt keine Operation für die Kollektion durchgeführt, semop liefert den Wert -1 zurück und setzt errno entsprechend. SEM_UNDO alle Semaphor-Operationen des Prozesses können vom Betriebssystem rückgängig gemacht werden, wenn der Prozess endet und nicht selbst für einen korrekten Zustand sorgt Achtung: Darf nicht benutzt werden, wenn Prozesse endlich lange laufen und die P-Operation in einem Prozess und die zugehörige V-Operation in einem anderen Prozess ausgeführt wird. In der Lehrveranstaltung Betriebssysteme werden beim Erzeuger-/Verbraucherproblem z. B. in einem Lösungsversuch die Sätze im Puffer über eine Semaphor-Variable gezählt. In diesem Fall würden z. B. alle V-Operationen am Ende des Erzeugerprozesses rückgängig gemacht werden, so dass der Verbraucherprozess die Sätze nicht mehr bearbeiten kann. 0 in den meisten Fällen der Standardwert (falls der Prozess aufgrund eines Fehlers abbricht, kann er u. U. Betriebsmittel für andere Prozesse sperren, die dieselben Semaphore-Kollektionen benutzen)
54 Parallelverarbeitung Folie 2-54 Beispiel: Realisierung der P()- und V()-Operation von Dijkstra mit Hilfe der Semaphore von System V IPC (sem_implement_p_v.c) #define SEM_KEY IPC_PRIVATE /* create private semaphore */ #define SEM_PERM 0600 /* access permissions */ typedef int semaphore; /* semaphore (handle) type */ #if (_SEM_SEMUN_UNDEFINED == 1) defined(sunos) typedef union semun int val; /* cmd: SETVAL */ struct semid_ds *buf; /* cmd: IPC_STAT, IPC_SET */ ushort *array; /* cmd: GETALL, SETALL */ semunion; #endif semaphore init_sem (int value); /* create/initialize semaphore */ void rel_sem (semaphore sem); /* release semaphore */ void P (semaphore sem); /* semaphore operations */ void V (semaphore sem); int main (void) semaphore s; srand ((unsigned int) time ((time_t) NULL)); s = init_sem (1); /* create sem with value 1 */ for (i = 0; i < MAX_CHILD; ++i) child_pid [i] = fork (); switch (child_pid [i]) case -1: /* error: no process created */ case 0: /* child process */ /* up to Linux 2.0.x the process didn't terminate after * LIFETIME seconds because "alarm()" and "sleep()" have * used the same clock. This problem is solved in Linux 2.2.x */ alarm (LIFETIME); while (1) /* simulate some normal work */ P (s); /* simulate some critical work */ V (s); break; default: /* parent process */ if (i == (MAX_CHILD - 1)) /* all childs created? */ /* yes -> wait for termination */ printf ("All child processes have terminated.\n"); rel_sem (s); /* end switch */ /* end for */ return 0;
55 Parallelverarbeitung Folie 2-55 semaphore init_sem (int value) union semun arg; /* parameter for semctl */ int semid; /* semaphore handle */ semid = semget (SEM_KEY, 1, IPC_CREAT SEM_PERM); if (semid == -1) perror ("init_sem: semget failed"); exit (ESEMGET); arg.val = value; if (semctl (semid, 0, SETVAL, arg) == -1) perror ("init_sem: semctl failed"); exit (ESEMCTL); return semid; void rel_sem (semaphore sem) union semun tmp; /* for Linux up to 2.0.x */ if (semctl (sem, 0, IPC_RMID, tmp) == -1) perror ("rel_sem: semctl failed"); exit (ESEMCTL); void P (semaphore sem) struct sembuf tmp; tmp.sem_num = 0; tmp.sem_op = -1; tmp.sem_flg = 0; if (semop (sem, &tmp, (size_t) 1) == -1) perror ("P: semop failed"); exit (ESEMOP); Aufgabe 2-7: Implementieren Sie Lösung 1 des Philosophenproblems aus der Lehrveranstaltung Betriebssysteme. Die obige Simulation darf nicht benutzt werden! Nutzen Sie alle Möglichkeiten der Semaphore von System V IPC, d.h., nehmen Sie alle erforderlichen Gabeln in einer Semaphore-Operation auf.
56 Parallelverarbeitung Folie Message Queues es gibt verschiedene Programmierschnittstellen System V IPC (wird in diesem Kapitel vorgestellt) benutzt einen Schlüsselwert zur Bestimmung der Identifikationsnummer der gewünschten Nachrichtenwarteschlange POSIX IPC Überblick über die Programmierschnittstellen POSIX message queues System V message queues Nachrichtenwarteschlange erzeugen mq_open () msgget () Operationen mq_send () mq_receive () mq_timedsend () mq_timedreceive () mq_notify () Attribute lesen/ändern mq_setattr () mq_getattr () msgsnd () msgrcv () msgctl () Nachrichtenwarteschlange entfernen mq_close () mq_unlink () msgctl ()
57 Parallelverarbeitung Folie 2-57 Möglichkeit zur Datenübertragung zwischen beliebigen Prozessen alle Nachrichten werden im Betriebssystemkern gespeichert (Beim Senden einer Nachricht wird sie aus dem Benutzerdatenbereich in den Betriebssystemdatenbereich kopiert und beim Empfangen umgekehrt wieder in den Benutzerdatenbereich.) Nachrichtenwarteschlangen sind nur für die Interprozesskommunikation auf einem Rechner geeignet und nicht für den Datenaustausch in einem Rechnernetz Nachrichtenwarteschlangen werden als FIFO-Warteschlangen realisiert (Einfach verkettete Liste mit je einem Zeiger auf den Anfang und das Ende der Warteschlange. Am Kopf wird gelesen und am Ende geschrieben.) der Kopf einer Nachrichtenwarteschlange wird durch folgende Datenstruktur repräsentiert (abhängig vom Betriebssystem; siehe msg.h) struct msqid_ds struct ipc_perm msg_perm; /* operation permission structure */ struct msg *msg_first; /* first message on queue */ struct msg *msg_last; /* last message in queue */ ushort msg_cbytes; /* current number of bytes on queue */ ushort msg_qnum; /* number of messages in queue */ ushort msg_qbytes; /* max number of bytes on queue */ ushort msg_lspid; /* pid of last msgsnd */ ushort msg_lrpid; /* pid of last msgrcv */ time_t msg_stime; /* last msgsnd time */ time_t msg_rtime; /* last msgrcv time */ time_t msg_ctime; /* last msgctl time */ ; diese Datenstruktur gibt es für jede msqid
58 Parallelverarbeitung Folie 2-58 die Köpfe der einzelnen Nachrichten in der Warteschlange werden durch folgende Datenstruktur repräsentiert struct msg struct msg *msg_next; /* next message on queue */ long msg_type; /* message type, must be >0 */ short msg_ts; /* message text size */ char *msg_spot; /* message text address */ ; über den Nachrichtentyp können unterschiedliche Nachrichten in einer Warteschlange verwaltet werden (Nachrichtentypen kleiner gleich Null sind für msgrcv reserviert) es können Text- oder beliebig strukturierte Binärdaten übertragen werden (solange die Prozesse wissen, wie sie die Daten interpretieren müssen)
59 Parallelverarbeitung Folie 2-59 der Benutzer übergibt oder empfängt die Nachrichten über folgende Datenstruktur (siehe msg.h) struct msgbuf long mtype; /* type of message */ char mtext[1]; /* message text */ ; da er im Allgemeinen längere Nachrichten senden will, kann er eine der beiden folgenden Methoden wählen a) statische Nachrichtenpuffer #define MAX_MSG_LEN /* max. Laenge einer Nachricht */ typedef struct my_msgbuf /* irgendwelche Komponenten */ long mtype; /* mtype und mtext muessen in dieser */ char mtext[max_msg_len]; /* Reihenfolge hintereinander stehen */ /* irgendwelche Komponenten */ my_msg; b) dynamische Nachrichtenpuffer struct msgbuf *ptr_msgbuf; /* Zeiger auf Nachrichtenpuffer */ int msg_size; /* aktuelle Nachrichtengroesse */ msg_size = ; ptr_msgbuf = (struct msgbuf *) malloc (sizeof (struct msgbuf) - sizeof ptr_msgbuf->mtext + msg_size);
60 Parallelverarbeitung Folie 2-60 Zusammenfassung der Datenstrukturen für Nachrichtenwarteschlangen pool of message queues (struct msqid_ds *) message queue (struct msqid_ds) message (struct msg) operating system data area msg_perm msg_first msg_last msg_next msg_type (z.b. 10) msg_size (z.b. 4) msg_spot msg_next msg_type (z.b. 20) msg_size (z.b. 12) msg_spot (struct msg *) NULL msg_type (z.b. 5) msg_size (z.b. 8) msg_spot msg_perm msg_first msg_last (struct msg *) NULL msg_type (z.b. 1) msg_size (z.b. 4) msg_spot (struct msqid_ds *) NULL (struct msqid_ds *) NULL die msqid wird als Index in das Ankerfeld benutzt Datenstruktur spart viel Speicher im Betriebssystemkern, solange keine oder wenige Nachrichtenwarteschlangen benutzt werden
61 Parallelverarbeitung Folie 2-61 Vorgehensweise: 1) Nachrichtenwarteschlange anlegen (msgget) 2) Nachrichtenwarteschlange benutzen (msgsnd, msgrcv, msgctl) 3) Nachrichtenwarteschlange freigeben (msgctl) allgemeine Kommandos für Nachrichtenwarteschlangen int msgctl (int msqid, int cmd, struct msqid_ds *buf) msqid Identifikationsnummer der Nachrichtenwarte- schlange (wird von msgget geliefert) cmd auszuführendes Kommando IPC_RMID Nachrichtenwarteschlange löschen IPC_STAT Werte des Warteschlangenkopfes liefern buf Zeiger auf Datenpuffer, z. B. bei IPC_STAT die Datenstrukturen für Nachrichtenwarteschlangen müssen explizit gelöscht werden (IPC_RMID)
62 Parallelverarbeitung Folie 2-62 vor jedem Logout muss überprüft werden, ob Nachrichtenwarteschlangen nicht gelöscht worden sind Kommando ipcs -q gibt aus, welche Warteschlangen vorhanden sind ggf. müssen die Warteschlangen manuell gelöscht werden ipcrm -q <msqid> (IRIX, SunOS) ipcrm -Q <msqkey> (IRIX, SunOS) ipcrm msg <msqid> (Linux) Nachrichtenwarteschlange anlegen und die Identifikationsnummer zurückliefern int msgget (key_t key, int msgflg) key vom Benutzer wählbarer eindeutiger numerischer Schlüssel oder IPC_PRIVATE (bei IPC_PRIVATE kennen fremde Programme den Schlüssel nicht und können die Nachrichtenwarteschlange daher nicht benutzen; ein numerischer Schlüssel kann als symbolische Konstante oder Parameter auf der Kommandozeile definiert werden) msgflg Zugriffsrechte und Funktionssteuerung Funktionssteuerung: IPC_CREAT IPC_EXCL neue Nachrichtenwarteschlange erzeugen liefert einen Fehler, falls die Nachrichtenwarteschlange neu angelegt werden soll und der angegebene Schlüssel schon existiert
63 Parallelverarbeitung Folie 2-63 Nachricht an die Nachrichtenwarteschlange senden int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) msqid Identifikationsnummer der Nachrichtenwarte- schlange msgp Zeiger auf einen vom Benutzer definierten Puffer, der als Erstes eine Komponente vom Typ long mit dem Nachrichtentyp und danach die Daten enthält (Linux verwendet hier struct msgbuf * msgp (mindestens bis Version 2.2.x)) msgsz Länge des Datenbereichs im Puffer in Bytes (msgsz <= MSGMAX) msgflg IPC_NOWAIT falls die Nachricht nicht in die Warteschlange eingekettet werden kann, weil dann irgendwelche Begrenzungen überschritten werden, liefert msgsnd den Wert -1 zurück und setzt errno entsprechend 0 der Prozess wird ggf. blockiert, bis die Nachricht in die Warteschlange eingefügt werden kann
64 Parallelverarbeitung Folie 2-64 Nachricht aus der Nachrichtenwarteschlange entnehmen int msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg) msqid Identifikationsnummer der Nachrichtenwarteschlange msgp Zeiger auf einen vom Benutzer definierten Puffer, in den die Nachricht kopiert wird. Der Puffer muss als Erstes eine Komponente vom Typ long für den Nachrichtentyp und danach den Bereich für die Daten enthalten (Linux verwendet hier struct msgbuf * msgp (mindestens bis Version 2.2.x)) msgsz Länge des Datenbereichs im Puffer in Bytes msgtyp gibt den Typ der Nachricht an, die empfangen werden soll 0: die erste (älteste) Nachricht der Warteschlange wird entnommen (unabhängig vom Typ) >0: die erste Nachricht mit dem Typ "msgtyp" wird entnommen <0: die erste Nachricht mit dem kleinsten Typ, der kleiner oder gleich dem absoluten Wert von "msgtyp" ist, wird entnommen (Hiermit können auf einfache Weise Prioritätswarteschlangen implementiert werden. Die Priorität ist umso höher je kleiner der Nachrichtentyp ist. Nachteil: Da alle Nachrichten in einer verketteten Liste gespeichert sind, muss jedes Mal die gesamte Liste durchsucht werden.)
65 Parallelverarbeitung Folie 2-65 msgflg IPC_NOWAIT falls sich die Nachricht nicht in der Warteschlange befindet, liefert msgrcv den Wert -1 zurück und setzt errno entsprechend MSG_NOERROR zu große Nachrichten sollen auf "msgsz"-bytes gekürzt werden. Der abgeschnittene Teil der Daten geht verloren. Der Prozess wird hierüber nicht informiert. 0 der Prozess wird ggf. blockiert, bis die Nachricht in der Warteschlange zur Verfügung steht Rückgabewert: Anzahl der im Puffer abgelegten Bytes oder -1 im Fehlerfall
66 Parallelverarbeitung Folie 2-66 mehrere unabhängige Client-Prozesse können mit einem Server- Prozess über eine Nachrichtenwarteschlange im Multiplex-Betrieb Daten austauschen, wenn sie als Nachrichtentyp z.b. ihre PID benutzen und den Nachrichtentyp für den Server-Prozess kennen client 1 PID = 87 client 2 PID = 65 client 3 PID = 93 type = 1 type = 87 type = 1 type = 65 type = 1 type = 93 message queue type = 1 type = 65, 87, or 93 server Beispiel Realisierung eines Prozesses, der Nachrichten in einer Warteschlange ablegt und eines weiteren Prozesses, der die Nachrichten aus der Warteschlange entnimmt und auf dem Bildschirm ausgibt. gemeinsame Header-Datei (msg_definitions.h) #define MBUF_KEY (key_t) 0x2412) /* arbitrary value */ #define MBUF_PERM (0666) /* "read/write" for everybody */ #define MAX_MSG_LEN 16 /* max. message length */ typedef struct my_msgbuf int msg_len; /* message length in bytes */ long msg_type; /* message type, > 0 */ char msg_data [MAX_MSG_LEN]; /* message text */ my_msg; /* Linux 2.6.x or newer, Cygwin, and Darwin don't support * "struct msgbuf" */ #if defined(cygwin) defined(darwin) defined(linux) struct msgbuf long mtype; /* message type */ char mtext [1]; /* message text */ ; #endif
67 Parallelverarbeitung Folie 2-67 Nachricht an Nachrichtenwarteschlange senden (msg_send.c) int main (int argc, char *argv[]) int msqid, /* message queue id */ msize, /* message length */ ret_val, /* return value of a function */ another; /* another message? */ long msgtyp; /* message type */ struct msgbuf *msgp; /* pointer to message buffer */ char buffer[max_len + 2];/* +2 for '\n' and '\0' */ signed char tmp; /* in IRIX "char" is unsigned */ msqid = msgget (MBUF_KEY, IPC_CREAT MBUF_PERM); if (msqid < 0) printf ("\n\n\nyou can put a message into a message queue.\n\n"); do do printf ("Please enter a message type (1,,1000): "); scanf (" %ld", &msgtyp); while (((tmp = getchar ())!= '\n') && (tmp!= EOF)) ; /* clean up after "scanf ()" */ while ((msgtyp < 1) (msgtyp > 1000)); printf ("Please enter your message (at most %d characters): ", MAX_LEN); if (fgets (buffer, MAX_LEN + 2, stdin) == NULL) buffer[0] = '\0'; msize = strlen (buffer) + 1; /* +1 for '\0' */ if ((strchr (buffer, '\n') == NULL) && (msize > MAX_LEN)) buffer[max_len] = '\n'; buffer[max_len + 1] = '\0'; /* allocate dynamic message buffer and create message */ msgp = (struct msgbuf *) malloc (sizeof (struct msgbuf) - sizeof msgp->mtext + msize); if (msgp == NULL) msgp->mtype = msgtyp; strncpy (msgp->mtext, buffer, (size_t) msize); /* put message into message queue */ ret_val = msgsnd (msqid, msgp, (size_t) msize, 0); if (ret_val < 0) free (msgp); printf ("\ndo you want to send? "); while (another!= 0);
68 Parallelverarbeitung Folie 2-68 printf ("\n\n" "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" "!!!!!!\n" "!!! Check with \"ipcs -q\" that the message queue!!!\n"); return EXIT_SUCCESS; Nachricht aus Nachrichtenwarteschlange lesen (msg_read_1.c) int main (int argc, char *argv[]) int msqid; /* message queue id */ my_msg msg_buf; /* message buffer */ msqid = msgget (MBUF_KEY, IPC_CREAT MBUF_PERM); if (msqid < 0) /* read the "oldest" message from the queue */ msg_buf.msg_len = msgrcv (msqid, (struct msgbuf *) &(msg_buf.msg_type), MAX_MSG_LEN, 0L, IPC_NOWAIT); while (msg_buf.msg_len >= 0) printf ("message length (incl. '\\n' and '\\0'): %d\n" "message type: %ld\n" "message: %s\n\n", msg_buf.msg_len, msg_buf.msg_type, msg_buf.msg_data); msg_buf.msg_len = msgrcv (msqid, (struct msgbuf *) &(msg_buf.msg_type), MAX_MSG_LEN, 0L, IPC_NOWAIT); switch (errno) case E2BIG: fprintf (stderr, "\nmessage is too big for the message " "buffer.\n\n"); exit (EMSGRCV); break; case ENOMSG: fprintf (stderr, "\nmessage queue is (now) empty.\n\n"); break; default: fprintf (stderr, "%s: Unsupported error: %s\n", argv[0], strerror (errno)); exit (EMSGRCV); return EXIT_SUCCESS; beide Programme räumen nicht auf Nachrichtenwarteschlange muss manuell mit ipcrm entfernt werden
69 Parallelverarbeitung Folie 2-69 Aufgabe 2-8: Implementieren Sie einen Broadcast-Server. Ein Client kann sich beim Server registrieren und später wieder abmelden. Beide Aktionen werden bestätigt. Der Server darf eine Registrierung ablehnen, wenn sich bereits eine vorgegebene, maximale Anzahl von Clients registriert hat. Ein registrierter Client kann dem Server Nachrichten senden, die seinen "Namen" und einen Text enthalten. Der Text wird vom Benutzer über die Tastatur eingegeben. Jeder Text ist durch einen Zeilenvorschub abgeschlossen. Der Server sendet jede empfangene Nachricht an alle registrierten Clients. Jeder Client gibt die empfangenen Nachrichten in geeigneter Form aus. Nachrichtenausgabe und Texteingabe sollen parallel erfolgen können, d. h., dass der Client z. B. alle zwei Sekunden überprüft, ob eine Nachricht oder ein vollständiger Text vorliegt (er darf bei keiner Aktion blockiert werden). Der Server kann durch das Kommando quit oder exit (in beliebiger Schreibweise) beendet werden. Bevor der Server sich selbst beendet, sendet er allen registrierten Clients ein Ende-Kommando, das die Clients bestätigen. Falls in dieser Phase weitere Registrierungswünsche eingehen, werden sie abgelehnt. Der Server darf sich erst beenden, wenn er alle Quittungen auf sein Ende-Kommando empfangen hat. Ein Client, der ein Ende-Kommando empfängt oder dessen Registrierung abgelehnt wird, beendet sich nach einer entsprechenden Meldung. Starten Sie den Server und die Clients in verschiedenen Fenstern. Zeigen Sie, dass Ihre Programme das oben beschriebene Protokoll einhalten.
2 UNIX Interprozeßkommunikation. 2.1 Prozesse erzeugen und beenden
Parallelverarbeitung Folie 2-1 2 UNIX Interprozeßkommunikation 2.1 Prozesse erzeugen und beenden Programm: Sammlung von Anweisungen und Daten befindet sich i.a. auf der Festplatte ist im i-node als ausführbar
Besprechung 6. Aufgabe (timed) Semaphore. Prozess 1 Prozess 2 0x Schlüssel=IPC_PRIVATE: Segment ist prozesslokal
Überblick über die 9. Übung Überblick über die 9. Übung. Anlegen des Segments: shmget Besprechung 6. Aufgabe (timed)... /* Schlüssel */ int shmflg; /* Flags */ int shmid; /* ID des Speichersegments */
Ganze Arrays von Semaphoren können auf einmal angelegt werden. In einer Operation können mehrere Semaphore auf einmal modifiziert werden.
Übungen zur Vorlesung Betriebssysteme I Studiengang Informatik SS 05 AG Betriebssysteme FB3 Kirsten Berkenkötter Allerlei Nützliches 1 Semaphore 1.1 Allgemein Semaphore sind unter System V IPC erweitert:
2. Prozesssynchronisation
Tafelübung zu BSRvS1 2. Prozesssynchronisation Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware Lehrstuhl für Informatik 12 TU Dortmund [email protected] http://ess.cs.uni-dortmund.de/teaching/ss2008/bsrvs1/exercises/
Systemprogrammierung I - Aufgaben zur Erlangung der Klausurzulassung für Informatiker und Wirtschaftsinformatiker
Systemprogrammierung I - Aufgaben zur Erlangung der Klausurzulassung für Informatiker und Nachfolgend finden Sie die drei Aufgaben, die Sie als Zulassungsvoraussetzung für die Scheinklausur am 18.7.2001
PROGRAMMIEREN MIT UNIX/Linux-SYSTEMAUFRUFEN
PROGRAMMIEREN MIT UNIX/Linux-SYSTEMAUFRUFEN UNIX/Linux-Interprozesskommunikation, zugehörige Systemaufrufe und Kommandos 7. UNIX/Linux-Shared Memory 8. (Benannte) Pipes UNIX/Linux-IPC-Mechanismen Nachrichtenbasierter
Dämon-Prozesse ( deamon )
Prozesse unter UNIX - Prozessarten Interaktive Prozesse Shell-Prozesse arbeiten mit stdin ( Tastatur ) und stdout ( Bildschirm ) Dämon-Prozesse ( deamon ) arbeiten im Hintergrund ohne stdin und stdout
PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN
PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN 2. UNIX/Linux-Prozessverwaltung und zugehörige Systemaufrufe Wintersemester 2015/16 2. Die UNIX/LINUX-Prozessverwaltung Aufgaben: 1. Erzeugen neuer Prozesse
Prozeß P1 Prozeß P2. Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen
Seite 8 A UFGABE 11 INTERP ROZEßKOMMUNIKATION Das folgende Petrinetz zeigt zwei verkoppelte Prozesse P1 und P2. Die Transitionen a und b beschreiben Aktionen von P1, die Transitionen c und d Aktionen von
Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012
WS 2011/2012 Fakultät Angewandte Informatik Lehrprofessur für Informatik 23.01.2012 Prof. Dr. Robert Lorenz Musterlösung zur Vorlesung Informatik I, Extrablatt zu komplexen Datenstrukturen Aufgabe 45 **
2A Basistechniken: Weitere Aufgaben
2A Basistechniken: Weitere Aufgaben 2A.3 Programmierung unter UNIX/Linux 1. Gegeben sind einige Ausschnitte von C-Programmen, die unter UNIX/Linux ausgeführt werden sollen. Beantworten Sie die zugehörigen
Betriebssysteme. Dipl.-Ing.(FH) Volker Schepper
1. Der Prozess beginnt im Zustand Erzeugt, nachdem sein Vaterprozess den Systemaufruf fork() (s.u.) abgesetzt hat. In diesem Zustand wird der Prozess-Kontext initialisiert. 2. Ist diese Aufbauphase abgeschlossen,
Speicherbasierte Kommunikation (T) Realisierung von Semaphoren (T) Shared Memory (P) Synchronisation mittels Semaphoren (P)
Systempraktikum im Wintersemester 2009/2010 (LMU): Vorlesung vom 26.11. Foliensatz 5 Speicherbasierte Kommunikation (T) Realisierung von Semaphoren (T) Shared Memory (P) Synchronisation mittels Semaphoren
4D Server v12 64-bit Version BETA VERSION
4D Server v12 64-bit Version BETA VERSION 4D Server v12 unterstützt jetzt das Windows 64-bit Betriebssystem. Hauptvorteil der 64-bit Technologie ist die rundum verbesserte Performance der Anwendungen und
Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten
Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten In dem Virtuellen Seminarordner werden für die Teilnehmerinnen und Teilnehmer des Seminars alle für das Seminar wichtigen Informationen,
Einführung in die Systemprogrammierung unter Linux
Einführung in die Systemprogrammierung unter Linux Systemsoftware Praktikum Inhalt Übersicht über benötigte Systemfunktionen Programmieren unter Linux Grundlegendes Message-Queue Shared Memory Semaphore
Tapps mit XP-Mode unter Windows 7 64 bit (V2.0)
Tapps mit XP-Mode unter Windows 7 64 bit (V2.0) 1 Einleitung... 2 2 Download und Installation... 3 2.1 Installation von WindowsXPMode_de-de.exe... 4 2.2 Installation von Windows6.1-KB958559-x64.msu...
SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen
SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen Um die maximale Sicherheit für das Betriebssystem und Ihre persönlichen Daten zu gewährleisten, können Sie Programme von Drittherstellern
Dokumentation IBIS Monitor
Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt
Artikel Schnittstelle über CSV
Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte
1 Vom Problem zum Programm
Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren
Prozesse und Logs Linux-Kurs der Unix-AG
Prozesse und Logs Linux-Kurs der Unix-AG Benjamin Eberle 22. Januar 2015 Prozesse unter Linux gestartete Programme laufen unter Linux als Prozesse jeder Prozess hat eine eindeutige Prozess-ID (PID) jeder
Systemnahe Programmierung in C/C++
Systemnahe Programmierung in C/C++ Signalbehandlung & MMap Knut Stolze [email protected] Lehrstuhl für Datenbanken und Informationssysteme Fakultät für Mathematik und Informatik 2006 11 29
EasyWk DAS Schwimmwettkampfprogramm
EasyWk DAS Schwimmwettkampfprogramm Arbeiten mit OMEGA ARES 21 EasyWk - DAS Schwimmwettkampfprogramm 1 Einleitung Diese Präsentation dient zur Darstellung der Zusammenarbeit zwischen EasyWk und der Zeitmessanlage
Kommunikation von Prozessen: Signale und Pipes
Netzwerk-Programmierung Kommunikation von Prozessen: Signale und Pipes Alexander Sczyrba Michael Beckstette {asczyrba,mbeckste}@techfak.uni-bielefeld.de Kommunikation von Prozessen Parent- und Child-Prozess
Zählen von Objekten einer bestimmten Klasse
Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --
Python Installation. 1 Vorbereitung. 1.1 Download. Diese Anleitung ist für Windows ausgelegt.
Python Installation 1 Vorbereitung Diese Anleitung ist für Windows ausgelegt. 1.1 Download Python kann online unter https://www.python.org/downloads/ heruntergeladen werden. Hinweis: Im CoderDojo verwenden
Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen
Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders
Vorkurs C++ Programmierung
Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:
Architektur Verteilter Systeme Teil 2: Prozesse und Threads
Architektur Verteilter Systeme Teil 2: Prozesse und Threads 21.10.15 1 Übersicht Prozess Thread Scheduler Time Sharing 2 Begriff Prozess und Thread I Prozess = Sequentiell ablaufendes Programm Thread =
Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss
Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige
Datensicherung. Beschreibung der Datensicherung
Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten
FastViewer Remote Edition 2.X
FastViewer Remote Edition 2.X Mit der FastViewer Remote Edition ist es möglich beliebige Rechner, unabhängig vom Standort, fernzusteuern. Die Eingabe einer Sessionnummer entfällt. Dazu muß auf dem zu steuernden
Technische Dokumentation SilentStatistikTool
Technische Dokumentation SilentStatistikTool Version 1.0 Marko Schröder 1115063 Inhalt Einleitung... 3 Klasse Program... 3 Klasse ArgumentHandler... 3 Bereitgestellte Variablen... 3 Bereitgestellte Methoden...
Dr. Monika Meiler. Inhalt
Inhalt 11 Dynamische Feldvereinbarung... 11-2 11.1 Dynamische Vereinbarung von Vektoren... 11-3 11.2 Dynamische Vereinbarung von Matrizen... 11-5 11.3 Die Kommandozeile... 11-8 Propädeutikum 11-1/8 11
Gibt Daten im erweiterten Format aus. Dies beinhaltet die Angabe von Zugriffsrechten, Besitzer, Länge, Zeitpunkt der letzten Änderung und mehr.
ls [optionen] [namen]: ls zeigt den Inhalt von Verzeichnissen. Sind keine namen angegeben, werden die Dateien im aktuellen Verzeichnis aufgelistet. Sind eine oder mehrere namen angegeben, werden entweder
Bedienungsanleitung. Stand: 26.05.2011. Copyright 2011 by GEVITAS GmbH www.gevitas.de
GEVITAS-Sync Bedienungsanleitung Stand: 26.05.2011 Copyright 2011 by GEVITAS GmbH www.gevitas.de Inhalt 1. Einleitung... 3 1.1. Installation... 3 1.2. Zugriffsrechte... 3 1.3. Starten... 4 1.4. Die Menü-Leiste...
Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me
Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me Bevor Sie die Platte zum ersten Mal benutzen können, muss sie noch partitioniert und formatiert werden! Vorher zeigt sich die Festplatte
Lieber SPAMRobin -Kunde!
Lieber SPAMRobin -Kunde! Wir freuen uns, dass Sie sich für SPAMRobin entschieden haben. Mit diesem Leitfaden möchten wir Ihnen die Kontoeinrichtung erleichtern und die Funktionen näher bringen. Bitte führen
Auto-Provisionierung tiptel 30x0 mit Yeastar MyPBX
Allgemeines Auto-Provisionierung tiptel 30x0 mit Yeastar MyPBX Stand 21.11.2014 Die Yeastar MyPBX Telefonanlagen unterstützen die automatische Konfiguration der tiptel 3010, tiptel 3020 und tiptel 3030
Adami CRM - Outlook Replikation User Dokumentation
Adami CRM - Outlook Replikation User Dokumentation Die neue Eigenschaft der Adami CRM Applikation macht den Information Austausch mit Microsoft Outlook auf vier Ebenen möglich: Kontakte, Aufgaben, Termine
Die Dateiablage Der Weg zur Dateiablage
Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen
Kurzanleitung. Toolbox. T_xls_Import
Kurzanleitung Toolbox T_xls_Import März 2007 UP GmbH Anleitung_T_xls_Import_1-0-5.doc Seite 1 Toolbox T_xls_Import Inhaltsverzeichnis Einleitung...2 Software Installation...2 Software Starten...3 Das Excel-Format...4
Durchführung der Datenübernahme nach Reisekosten 2011
Durchführung der Datenübernahme nach Reisekosten 2011 1. Starten Sie QuickSteuer Deluxe 2010. Rufen Sie anschließend über den Menüpunkt /Extras/Reisekosten Rechner den QuickSteuer Deluxe 2010 Reisekosten-Rechner,
Anmeldeverfahren. Inhalt. 1. Einleitung und Hinweise
Anmeldeverfahren Inhalt In dieser Anleitung finden Sie eine detaillierte Beschreibung der verschiedenen Anmeldeverfahren bzw. Zugangsberechtigungen anhand der verschiedenen Szenarien, die für Sie in der
Kommunikations-Management
Tutorial: Wie kann ich E-Mails schreiben? Im vorliegenden Tutorial lernen Sie, wie Sie in myfactory E-Mails schreiben können. In myfactory können Sie jederzeit schnell und einfach E-Mails verfassen egal
Lösung zur Praktikumsaufgabe 1
Lösung zur Praktikumsaufgabe 1 Thema: Semaphore 1. Das Programm in Listing 1 zeigt eine beispielhafte Implementierung. Listing 1: Lösung der Aufgabe 1 (5children-unsync.c) #include #include
Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe
Aufgabenstellung Für ein Baumkataster sollen für maximal 500 Bäume Informationen gespeichert werden, die alle nach der gleichen Weise wie folgt strukturiert sind: Nummer Bauminfo Baumart Hoehe Baum Umfang
MailUtilities: Remote Deployment - Einführung
MailUtilities: Remote Deployment - Einführung Zielsetzung Die Aufgabe von Remote Deployment adressiert zwei Szenarien: 1. Konfiguration der MailUtilities von einer Workstation aus, damit man das Control
ecaros2 - Accountmanager
ecaros2 - Accountmanager procar informatik AG 1 Stand: FS 09/2012 Inhaltsverzeichnis 1 Aufruf des ecaros2-accountmanager...3 2 Bedienung Accountmanager...4 procar informatik AG 2 Stand: FS 09/2012 1 Aufruf
Online-Prüfungs-ABC. ABC Vertriebsberatung GmbH Bahnhofstraße 94 69151 Neckargemünd
Online-Prüfungs-ABC ABC Vertriebsberatung GmbH Bahnhofstraße 94 69151 Neckargemünd Telefon Support: 0 62 23 / 86 55 55 Telefon Vertrieb: 0 62 23 / 86 55 00 Fax: 0 62 23 / 80 55 45 (c) 2003 ABC Vertriebsberatung
Leitfaden zur Installation von Bitbyters.WinShutdown
Leitfaden zur Installation von Bitbyters.WinShutdown für Windows 32 Bit 98/NT/2000/XP/2003/2008 Der BitByters.WinShutDown ist ein Tool mit dem Sie Programme beim Herunterfahren Ihres Systems ausführen
Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge
Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge Ab der Version forma 5.5 handelt es sich bei den Orientierungshilfen der Architekten-/Objektplanerverträge nicht
Zentrale Installation
Einführung STEP 7 wird durch ein Setup-Programm installiert. Eingabeaufforderungen auf dem Bildschirm führen Sie Schritt für Schritt durch den gesamten Installationsvorgang. Mit der Record-Funktion steht
Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe
Aufgabenstellung Für eine Hausverwaltung sollen für maximal 500 Wohnungen Informationen gespeichert werden, die alle nach der gleichen Weise wie folgt strukturiert sind: Art Baujahr Wohnung Whnginfo Nebenkosten
Registrierung am Elterninformationssysytem: ClaXss Infoline
elektronisches ElternInformationsSystem (EIS) Klicken Sie auf das Logo oder geben Sie in Ihrem Browser folgende Adresse ein: https://kommunalersprien.schule-eltern.info/infoline/claxss Diese Anleitung
Handbuch B4000+ Preset Manager
Handbuch B4000+ Preset Manager B4000+ authentic organ modeller Version 0.6 FERROFISH advanced audio applications Einleitung Mit der Software B4000+ Preset Manager können Sie Ihre in der B4000+ erstellten
U7 POSIX-Prozesse U7 POSIX-Prozesse
U7 POSIX-Prozesse U7 POSIX-Prozesse Prozesse POSIX-Prozess-Systemfunktionen Aufgabe 6 U7.1 U7-1 Prozesse: Überblick U7-1 Prozesse: Überblick Prozesse sind eine Ausführumgebung für Programme haben eine
OP-LOG www.op-log.de
Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server
In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.
Tutorial: Wie erfasse ich einen Termin? In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können. Neben den allgemeinen Angaben zu einem
Prozesse und Logs Linux-Kurs der Unix-AG
Prozesse und Logs Linux-Kurs der Unix-AG Andreas Teuchert 27./28. Juni 2012 Prozesse unter Linux gestartete Programme laufen unter Linux als Prozesse jeder Prozess hat eine eindeutige Prozess-ID (PID)
2. Word-Dokumente verwalten
2. Word-Dokumente verwalten In dieser Lektion lernen Sie... Word-Dokumente speichern und öffnen Neue Dokumente erstellen Dateiformate Was Sie für diese Lektion wissen sollten: Die Arbeitsumgebung von Word
Prozesse. Stefan Janssen. [email protected]. Alexander Sczyrba [email protected]
Netzwerk - Programmierung Prozesse Stefan Janssen [email protected] Alexander Sczyrba [email protected] Madis Rumming [email protected] Übersicht Prozesse
Softwarelösungen: Versuch 4
Softwarelösungen: Versuch 4 Nichtstun in Schleife wird ersetzt durch zeitweilige Zurücknahme der Anforderung, um es anderen Prozessen zu erlauben, die Ressource zu belegen: /* Prozess 0 */ wiederhole flag[0]
Systemnahe Programmierung in C Übungen Jürgen Kleinöder, Michael Stilkerich Universität Erlangen-Nürnberg Informatik 4, 2011 U7.fm
U7 POSIX-Prozesse U7 POSIX-Prozesse Prozesse POSIX-Prozess-Systemfunktionen Aufgabe 7 U7.1 U7-1 Prozesse: Überblick U7-1 Prozesse: Überblick Prozesse sind eine Ausführumgebung für Programme haben eine
Benutzung der LS-Miniscanner
Benutzung der LS-Miniscanner Seit Januar 2010 ist es möglich für bestimmte Vorgänge (Umlagerungen, Retouren, Inventur) die von LS lieferbaren Miniscanner im Format Autoschlüsselgröße zu benutzen. Diese
Domänenmodell: Fadenkommunikation und -synchronisation
Domänenmodell: Fadenkommunikation und -synchronisation Alexander Humphreys, Reinhard Rösch, Fabian Scheler 15. Mai 2003 Inhaltsverzeichnis 1 Domänendefinition 1 2 Domänenlexikon 1 3 Konzeptmodelle 4 4
Tutorial - www.root13.de
Tutorial - www.root13.de Netzwerk unter Linux einrichten (SuSE 7.0 oder höher) Inhaltsverzeichnis: - Netzwerk einrichten - Apache einrichten - einfaches FTP einrichten - GRUB einrichten Seite 1 Netzwerk
Zugriff auf die Modul-EEPROMs
MAX-P- und P-Bibliotheken EEPROM-Zugriff 1 Zugriff auf die Modul-EEPROMs Jedes X-Bus-Modul verfügt über ein EEPROM, in dem modulspezifische Daten gespeichert werden. Neben einigen Bereichen, die vom Betriebssystem
DOKUMENTATION VOGELZUCHT 2015 PLUS
DOKUMENTATION VOGELZUCHT 2015 PLUS Vogelzucht2015 App für Geräte mit Android Betriebssystemen Läuft nur in Zusammenhang mit einer Vollversion vogelzucht2015 auf einem PC. Zusammenfassung: a. Mit der APP
Native Zeichenketten (C-Strings)
Native Zeichenketten (C-Strings)... sind in C/C++ char-arrays. D.h. die Deklaration char msg[80]; kann Zeichenketten bis zur Länge 79 enthalten. (Direkte Zuweisungen wie msg="hallo!" sind jedoch nicht
Dokumentation zum Spielserver der Software Challenge
Dokumentation zum Spielserver der Software Challenge 10.08.2011 Inhaltsverzeichnis: Programmoberfläche... 2 Ein neues Spiel erstellen... 2 Spielfeldoberfläche... 4 Spielwiederholung laden... 5 Testdurchläufe...
Dokumentenverwaltung. Copyright 2012 cobra computer s brainware GmbH
Dokumentenverwaltung Copyright 2012 cobra computer s brainware GmbH cobra Adress PLUS ist eingetragenes Warenzeichen der cobra computer s brainware GmbH. Andere Begriffe können Warenzeichen oder anderweitig
Programmierkurs Java
Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen
Speichern. Speichern unter
Speichern Speichern unter Speichern Auf einem PC wird ständig gespeichert. Von der Festplatte in den Arbeitspeicher und zurück Beim Download Beim Kopieren Beim Aufruf eines Programms Beim Löschen Beim
Einrichtung des Cisco VPN Clients (IPSEC) in Windows7
Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Diese Verbindung muss einmalig eingerichtet werden und wird benötigt, um den Zugriff vom privaten Rechner oder der Workstation im Home Office über
Synchronisierung. Kommunikationstechnik, SS 08, Prof. Dr. Stefan Brunthaler 73
Synchronisierung Kommunikationstechnik, SS 08, Prof. Dr. Stefan Brunthaler 73 Übertragungsprozeduren Die Übertragung einer Nachricht zwischen Sender und Empfänger erfordert die Übertragung des Nutzsignals
Benutzerhandbuch - Elterliche Kontrolle
Benutzerhandbuch - Elterliche Kontrolle Verzeichnis Was ist die mymaga-startseite? 1. erste Anmeldung - Administrator 2. schnittstelle 2.1 Administrator - Hautbildschirm 2.2 Administrator - rechtes Menü
Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht:
Beiträge erstellen in Joomla Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht: Abbildung 1 - Kontrollzentrum Von hier aus kann man zu verschiedene Einstellungen
Outlook - CommuniGate Pro Schnittstelle installieren. Outlook - Elemente freigeben. Outlook - Freigegebene Elemente öffnen
Microsoft Outlook 1 Nutzung der Groupware mit Microsoft Outlook 1.1 Outlook - CommuniGate Pro Schnittstelle installieren 4 1.2 Outlook - Elemente freigeben 11 1.3 Outlook - Freigegebene Elemente öffnen
Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten
Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten 2008 netcadservice GmbH netcadservice GmbH Augustinerstraße 3 D-83395 Freilassing Dieses Programm ist urheberrechtlich geschützt. Eine Weitergabe
Installation / Aktualisierung von Druckertreibern unter Windows 7
Rechenzentrum Installation / Aktualisierung von Druckertreibern unter Windows 7 Es gibt drei verschiedene Wege, um HP-Druckertreiber unter Windows7 zu installieren: (Seite) 1. Automatische Installation...
Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze
Ihre Interessentendatensätze bei inobroker Wenn Sie oder Ihre Kunden die Prozesse von inobroker nutzen, werden Interessentendatensätze erzeugt. Diese können Sie direkt über inobroker bearbeiten oder mit
KURZANLEITUNG CLOUD OBJECT STORAGE
KURZANLEITUNG CLOUD OBJECT STORAGE Version 1.12 01.07.2014 SEITE _ 2 INHALTSVERZEICHNIS 1. Einleitung... Seite 03 2. Anmelden am Cloud&Heat Dashboard... Seite 04 3. Anlegen eines Containers... Seite 05
8.3 Sonstiges/Signalbehandlung
8. Sonstiges/Signalbehandlung 8..1 Was sind Signale? Signale bilden in der Sprache C die Funktionalität ab, die in Maschinensprache (bzw. Assembler) von Interrupts bekannt ist: Ein Prozess kann zu beliebiger
FORUM HANDREICHUNG (STAND: AUGUST 2013)
FORUM HANDREICHUNG (STAND: AUGUST 2013) Seite 2, Forum Inhalt Ein Forum anlegen... 3 Forumstypen... 4 Beiträge im Forum schreiben... 5 Beiträge im Forum beantworten... 6 Besondere Rechte der Leitung...
CMS.R. Bedienungsanleitung. Modul Cron. Copyright 10.09.2009. www.sruttloff.de CMS.R. - 1 - Revision 1
CMS.R. Bedienungsanleitung Modul Cron Revision 1 Copyright 10.09.2009 www.sruttloff.de CMS.R. - 1 - WOZU CRON...3 VERWENDUNG...3 EINSTELLUNGEN...5 TASK ERSTELLEN / BEARBEITEN...6 RECHTE...7 EREIGNISSE...7
tentoinfinity Apps 1.0 EINFÜHRUNG
tentoinfinity Apps Una Hilfe Inhalt Copyright 2013-2015 von tentoinfinity Apps. Alle Rechte vorbehalten. Inhalt der online-hilfe wurde zuletzt aktualisiert am August 6, 2015. Zusätzlicher Support Ressourcen
Lizenzen auschecken. Was ist zu tun?
Use case Lizenzen auschecken Ihr Unternehmen hat eine Netzwerk-Commuterlizenz mit beispielsweise 4 Lizenzen. Am Freitag wollen Sie Ihren Laptop mit nach Hause nehmen, um dort am Wochenende weiter zu arbeiten.
Backup der Progress Datenbank
Backup der Progress Datenbank Zeitplandienst (AT): Beachten Sie bitte: Die folgenden Aktionen können nur direkt am Server, vollzogen werden. Mit Progress 9.1 gibt es keine Möglichkeit über die Clients,
Java Kurs für Anfänger Einheit 5 Methoden
Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden
Anleitung - Mass E-Mailer 2.6. 2003 by Patrick Biegel 25.06.2005
Anleitung - Mass E-Mailer 2.6 2003 by Patrick Biegel 25.06.2005 Inhalt Einleitung...3 Neu in der Version 2.6...3 Installation...4 Links...4 E-Mail Form...5 Send E-Mails...7 Edit List...8 Save List...9
