2.2 Adressraumverwaltung Code und Daten Einfachster Fall: 0 length-1.

Post on 06-Apr-2016

212 views 0 download

Transcript of 2.2 Adressraumverwaltung Code und Daten Einfachster Fall: 0 length-1.

2.2 Adressraumverwaltung

Code und Daten

Einfachster Fall:

0 length-1

2.2 Adressraumverwaltung

Code und Daten

Einfachster Fall:

0 length-1

Code Daten

Besser: getrennte Segmente, schreibgeschützer Code

0 cl-1 0 dl-1

Unix: 3 Segmente (oder mehr) mit variable Länge

Code Keller(stack)

statische DatenHalde

Längenänderung durch brk Überlauf(und durch exec, Programm laden, 2.3)

brk(addr) , sbrk(incr)lässt das Datensegment bis Adresse addr-1 reichenbzw. verlängert das Datensegment um incr

Fehler ENOMEM beim Überschreiten der maximalenSegmentgröße

Achtung:

brk wird typischerweise von der Haldenverwaltung einerhöheren Programmiersprache eingesetzt, nicht vom Programmierer

Beispiel C:

malloc impliziert ein sbrk, wenn die Halde überläuft

Weitere Operationen bei Betriebssystemen

mit reichhaltiger strukturierten Adressräumen

mit überlappenden Adressräumen

z.B. mmap, munmap, ...

2.3 Ein/Ausgabesystem

ist meist geräteunabhängig realisiert:

Prozess verfügt über Ein/Ausgabekanäle(channels, ports, open files, ...)

hinter denen sich Datenquellen/senken verbergen(Geräte, Dateien, Prozesse, ...).

Kanal = gepufferter Strom von Bytes

Kanalnummer (in Unix „file descriptor“) 0, 1, 2, ... identifiziert Kanal

Kanal kann auch über mehrere Nummern identifiziert werden.

Standardkanäle in Unix,

vom Befehlsinterpretierer (Shell) so eingerichtet:

0 Standard-Eingabekanal (standard input, stdin),häufig verbunden mit der Tastatur

1 Standard-Ausgabekanal (standard output, stdout)häufig verbunden mit dem Bildschirm

2 Standard-Fehlerkanal (standard error, stderr)häufig verbunden mit dem Bildschirm

! Ein Kanal kann auch gleichzeitig Ein- und Ausgabekanal sein !

Prozess P

Prozess Q

120

3

5

Scanner

4

Dateisystem

Prozesse Kanalnummern Kanäle z.B. Dateien

1

3P

5

2Q

3

Kanalnummern, Kanäle und Datenquellen/senken:

pos

pos

pos

s.u.

Ein/Ausgabe-Operationen:

read(channel,buffer,nbytes)liest – sobald Bytes im Kanal vorhanden – maximal nbytes Bytes von channel nach bufferund liefert die Anzahl der gelesenen Bytes(weniger gelesen wird z.B. bei Dateiende oderZeilenende [beim Lesen von der Tastatur])

Fehler: ungültige KanalnummerKanal ist nur Ausgabekanalnicht behebbarer Lesefehler

write(channel,buffer,nbytes)schreibt – sobald Platz im Kanal vorhanden – maximal nbytes Bytes von buffer nach channel und liefert die Anzahl der geschriebenen Bytes

(i.d.R. = nbytes)

Fehler: ungültige KanalnummerKanal ist nur Eingabekanalnicht behebbarer Schreibfehler

close(channel)macht die Kanalnummer channel ungültig;falls dies die letzte gültige Nummer für den Kanal war,wird dieser gelöscht.

Fehler EBADF falls ungültige Kanalnummer channel

dup(channel)liefert neue – zuvor ungültige – Kanalnummer, diejetzt den gleichen Kanal wie channel identifiziert;gewählt wird die kleinste der ungültigen Nummern.

Fehler EBADF falls ungültige Kanalnummer channel

dup2(old,new)vereinbart, dass die Kanalnummer newden gleichen Kanal wie old identifiziert;falls die Nummer new schon vorher einen Kanal bezeichnete und falls sie die letzte Nummer für diesen Kanal war, wird der Kanal gelöscht.

Fehler EBADF falls ungültige Kanalnummer old

2.4 Interprozesskommunikation(inter-process communication, IPC)

erfolgt typischerweise über Ein/Ausgabekanäle,in Unix u.a. über Pipes („Rohre“):

Pipe = Puffer für Bytes (endliche Kapazität PIPE_MAX)(Variante: Puffer-Paar für

bidirektionale Kommunikation)

Bytes senden mit write

Bytes empfangen mit read

Operation

pipe(channel) mit int channel[2]erzeugt Pipe und richtet einen Eingabekanalfür das Empfangen und einen Ausgabekanalfür das Senden ein;

channel[0] wird mit der Nummer des Eingabekanals belegt,

channel[1] wird mit der Nummer des Ausgabekanals belegt,

Fehler EMFILE beim Überschreiten der maximalenAnzahl von Kanälenu.a.

Fehler beim Benutzen von Pipes:

Kopf des Puffers ist keinem Kanal mehr zugeordnetwrite generiert Unterbrechung SIGPIPE

Ende des Puffers ist keinem Kanal mehr zugeordnetund der Puffer ist leerread erkennt „Dateiende“ (end-of-file)

Zyklisch über Pipes verbundene Prozesseund alle Puffer vollund alle Prozesse hängen in write Verklemmung, nicht gemeldet!

Typische Benutzung von Pipes:

pipe(channel);

if(fork()!=0) { /* parent process */ ... write(channel[1],...) ...

else { /* child process */... read(channel[0],...) ...

zuzüglich Fehlerbehandlung

Beachte: Kindprozess erbt Kanäle des Erzeugerprozesses

2.5 Dateiverwaltung

Dateien werden durch Namen identifiziert:

einfacher Dateiname, z.B. sortPfadname (pathname), z.B. /usr/bin/sort

Verschiedene Dateiarten (Untertypen von „Datei“ in OO BS):

DatenProgrammVerzeichnis, Ordner (directory, folder)Pseudodatei (special file): E/A-Gerätu.a.

Prozess besitzt aktuelles Verzeichnis (working directory):

alle Pfadnamen, die nicht mit / beginnen,werden automatisch vorne um den Namen desaktuellen Verzeichnisses erweitert

Operation

chdir(name) mit char *namesetzt das aktuelle Verzeichnis auf name

Fehler ENOENT wenn das Verzeichnis name nicht existiert u.a.

Erzeugen und Öffnen von Dateien:

open(name,flags)

erzeugt und/oder öffnet die Datei name gemäßden Angaben in flags und liefert die Nummereines Kanals, über den auf die Datei zugegriffenwerden kann. Die flags sind u.a.

O_CREAT erzeugen, falls nicht vorhanden O_RDONLY nur Lesezugriff O_WRONLY nur Schreibzugriff O_RDWR Lese- und Schreibzugriff

Fehler EACCES wenn gewünschter Zugriff nicht erlaubt u.a.

Direktzugriff möglich mit

lseek(channel,offset,whence)setzt die Zugriffsposition in der über channelerreichbaren Datei

bei whence = 0 auf offset, bei whence = 1 auf aktuelle Position + offset,bei whence = 2 auf Dateilänge + offset.

Fehler ESPIPE wenn channel sich auf eine Pipe bezieht

u.a.

Laden von Programmen mit Varianten von exec , z.B.

execv(program,argv) mit char *argv[]

ersetzt das laufende Programm durch das in der

Datei program vorgefundene Programm,

springt an den Anfang von main und

übergibt dabei die Zeichenketten im Feld argv als

Parameter für main.

Routinen für die Unterbrechungsbehandlung gehen verloren !

Fehler EACCES wenn Datei nicht als Programm ladbar u.a.

+ weitere Operationen für

Abfragen/Setzen von Dateieigenschaften

Maßnahmen zum Zugriffsschutz

usw.

2.6 C-Bibliotheken

Dringende Leseempfehlung zu Unix:

man –s1 intro Benutzerschnittstelle (Shell)

man –s2 intro Systemschnittstelle

man –s3 intro Weitere Bibliotheken

/usr/include Help-Dateien .h/usr/lib Bibliotheken

2.6.1 Weitere Bibliotheken

man –s3 intro

liefert eine Übersicht über die in Abschnitt 3 der Dokumentation beschriebenen

Bibliotheken für C

mit einer Vielzahl von Prozeduren („C library functions“)jenseits der in Abschnitt 2 beschriebenen Systemaufrufe,

z.B.

malloc (2.2)

printf formatierte Ausgabe auf stdout

fopen gepufferte Datei-Ein/Ausgabefread...

sqrt, ... mathematische Funktionen

etc. etc.

2.6.2 Nichtsequentielle Benutzung

Falls Threading unterstützt wird –

• Achtung bei nebenläufiger Benutzung von Bibliotheken!• Nicht jede Prozedur ist thread-safe!• Gegebenenfalls Sperrsynchronisation vornehmen!

Z.B. in Solaris ist jeder Bibliotheksprozedur zugeordnet einMT-Level (multi-threading level):

Unsafe, Safe, MT-Safe, Async-Signal-Safe

Unsafe: unsicherBeispiel: rand(3)

Safe: sicherBeispiel: malloc(3)

MT-Safe: sicher, mit interner NebenläufigkeitBeispiel: sqrt(3)

Async-Signal-Safe: wie MT-Safe, sogar beim Auftretenvon (Software-)Unterbrechungen(durch Unterbrechungsunterdrückungwährend kritischer Abschnitte)Beispiel: write(2)

+ Varianten