2.5.5. Aufgaben des Betriebssystems

Transcrição

2.5.5. Aufgaben des Betriebssystems
2.5.5. Aufgaben des Betriebssystems
■ Ein Betriebssystem ist ein Programm, das dem Benutzer und den Anwendungsprogrammen elementare Dienste bereitstellt. Der
Nutzer eines Betriebssystems ist nicht notwendigerweise ein Programmierer, sondern möglicherweise jemand, der vom
Funktionieren des Rechners keine Ahnung hat. Für einen solchen Benutzer präsentiert sich der Rechner über das Betriebssystem.
Die Dienste, die es bereitstellt, sind das, was der Rechner in den Augen eines solchen Nutzers kann. Seitdem Rechner in viele
Bereiche unseres Lebens Einzug gehalten haben, gibt es immer mehr Menschen, die mit einem Computer arbeiten müssen. Daher
muss das Betriebssystem immer einfacher zu benutzen sein. Erst den graphischen Betriebssystemoberflächen ist es zu verdanken,
dass heute jeder einen Rechner irgendwie bedienen kann und dass es auch leicht ist, mit einem bisher unbekannten Programm zu
arbeiten, ohne vorher umfangreiche Handbücher zu wälzen.
■ Der Rechner mit seinen Peripheriegeräten stellt eine Fülle von Ressourcen zur Verfügung, auf die Benutzerprogramme zugreifen.
Zu diesen Ressourcen gehören
-
CPU (Rechenzeit)
Hauptspeicher
Plattenspeicherplatz
interne Geräte (Erweiterungskarten)
externe Geräte (Drucker, Scanner, etc.)
■ Die Verwaltung dieser Ressourcen ist eine schwierige Aufgabe, da viele Benutzer und deren Programme auf diese Ressourcen
gleichzeitig zugreifen wollen. Die zentralen Bestandteile eines Betriebssystems sind entsprechend der zentralen Aufgaben die
- Dateiverwaltung
- Prozessverwaltung
- Speicherverwaltung
2.5.5.1. Dateiverwaltung
■ Eine wichtige Aufgabe des Betriebssystems ist die Dateiverwaltung. Damit ein Benutzer sich nicht darum kümmern muss, in
welchem Bereich der Festplatte noch Platz ist, um den gerade geschriebenen Text zu speichern, oder wo die Version von gestern
gespeichert war, stellt das Betriebssystem das Konzept der Datei als Behälter für Daten aller Art zur Verfügung. Die Übersetzung
von Dateien und ihren Namen in bestimmte Bereiche der Festplatte nimmt das Dateisystem als Bestandteil des Betriebssystems
vor. Moderne Dateisysteme sind hierarchisch aufgebaut. Mehrere Dateien können zu einem Ordner (engl.: folder)
zusammengefasst werden. Für diese sind auch die Bezeichnungen Katalog, Verzeichnis, Unterverzeichnis (engl.: directory,
subdirectory) in Verwendung. Da Ordner sowohl Dateien als auch andere Ordner enthalten können, entsteht eine hierarchische
(baumähnlich verzweigte) Struktur. In Wirklichkeit ist ein Ordner eine Datei, die Namen und einige Zusatzinformationen von
anderen Dateien enthält. Dateien können sich auf allen Stufen befinden. Von oben gesehen beginnt die Hierarchie mit einem
Wurzelordner, dieser enthält wieder Dateien und Ordner, und so fort. Der linke Teil der folgenden Abbildung zeigt einen
Dateibaum, wie er in dem Betriebssystem Windows XP dargestellt wird. Unter dem Wurzelordner mit Namen "F:" befinden sich
mehrere Unterordner, unter anderem der Ordner "Music". Letzterer enthält die Unterordner "Audioslave", "Beatles" etc. Das Bild
zeigt in der rechten Hälfte alle Dateien im Unterordner "Yello Submarine" des Ordners "Beatles".
■ Jede Datei erhält einen Namen, unter der sie gespeichert und wiedergefunden werden kann. Der Dateinamen ist im Prinzip
beliebig, er kann sich aus Buchstaben Ziffern und einigen erlaubten Sonderzeichen zusammensetzen. Allerdings hat sich als
Konvention etabliert, Dateinamen aus zwei Teilen, dem eigentlichen Namen und der Erweiterung, zu bilden. Ein Punkt"." trennt
den Namen von der Erweiterung. Die vorige Abbildung zeigt z.B. die Datei "01 Yellow Submarine.mp3". Anhand des Namens
macht man den Inhalt der Datei kenntlich, anhand der Erweiterung die Art des Inhaltes. Von Letzterem ist nämlich abhängig, mit
welchem Programm die Datei geöffnet werden kann. In diesem Falle zeigt die Erweiterung ".mp3", dass es sich um eine Datei
handelt, die z. B. mit dem Programm "WinAmp" geöffnet werden kann. Obwohl auch Dateinamen ohne Erweiterung möglich sind,
ist es sinnvoll, sich an die Konventionen zu halten, da auch die Anwenderprogramme von diesem Normalfall (engl.: default)
ausgehen. Ein Anwendungsprogramm wie z.B. Word wird beim ersten Abspeichern einer neuen Datei als default die Endung ".doc"
vorgeben.
■ Es kann leicht vorkommen, dass zwei Dateien, die sich in verschiedenen Ordnern befinden, den gleichen Namen besitzen. Dies ist
kein Problem, da das Betriebssystem eine Datei auch über ihre Lage im Dateisystem identifiziert. Diese Lage ist in einer
baumartigen Struktur wie dem Dateisystem immer eindeutig durch den Pfad bestimmt, den man ausgehend von der Wurzel
traversieren muss, um zu der gesuchten Datei zu gelangen. Den Pfad kennzeichnet man durch die Folge der dabei traversierten
Unterverzeichnisse. Der Pfad zu dem Unterverzeichnis "Beatles" von "Music" in der vorigen Abbildung ist:
F:\Music\Beatles
■ Man erkennt, dass die einzelnen Unterordner durch das Trennzeichen "\" (backslash) getrennt wurden. In den Betriebssystemen
der Unix-Familie (Linux, SunOs, BSD) wird stattdessen "/" (slash) verwendet. Der Pfad, zusammen mit dem Dateinamen (incl.
Erweiterung), muss eine Datei eindeutig kennzeichnen. Die MP3-Datei aus unserem Beispiel hat also den vollständig
qualifizierten Dateinamen
F:\Music\Beatles\Yellow Submarine\01 Yellow Submarine.mp3
■ Viele Speichergeräte arbeiten blockweise indem sie Daten als Blöcke oder Cluster fester Größe (je nach Dateisystem zwischen
512 Bytes und 64 KBytes) in Bereiche des Speichergeräts oder eines Datenträgers speichern. Die Hardware bietet somit dem
System eine Folge von N Blöcken an, die eindeutig adressierbar sind. Das Betriebssystem verwaltet alle N Blöcke in einem
Dateisystem und enthält Routinen zum Lesen und Schreiben von Blöcken für die jeweils verwendeten Gerätetypen, sogenannte
Gerätetreiber. Das vom Betriebssystem verwaltete Dateisystem erspart es den Anwendern, sich um technische Details der
Speichergeräte oder Datenträger kümmern zu müssen. Statt dessen kann eine abstraktere, objektorientierte Sicht verwendet
werden. Für den Benutzer bietet das Speichergerät
- Dateien
- Zugriffsmethoden zum Lesen und Schreiben von Daten
■ UNIX-basierte Betriebsysysteme verwalten ein systemweites Dateisystem, in dem alle Dateien auf allen angeschlossenen Geräten
enthalten sind. MS-DOS und Windows verwalten für jedes Gerät einen unabhängigen Katalog. Ein systemweites Dateisystem hat
Vorteile, wenn viele Festplatten vorhanden sind und der Benutzer gar nicht wissen will, auf welchen Geräten sich die Daten
befinden. Es hat aber Nachteile, wenn Geräte mit auswechselbaren Datenträgern (z.B. Disketten) betrieben werden, da bei jedem
Diskettenwechsel entsprechende Teile des Kataloges geändert werden müssen. In dieser Hinsicht ist ein Dateisystem mit einem
unabhängigen Katalog pro Gerät vorteilhaft, ähnlich auch beim Betrieb von mehreren Festplatten, da der Anwender bestimmen
kann, welche Daten wo gespeichert werden sollen. Beim Ausfall eines Laufwerkes sind nur die Dateien dieses Laufwerkes betroffen
- nicht das gesamte Dateisystem. Wichtige Daten können zur Sicherheit auf mehreren Laufwerken gelagert werden.
-->
Ein Cluster ist eine logische Zusammenfassung von Blöcken eines Datenträgers. "Cluster" ist ein Terminus im WindowsSprachgebrauch, bei anderen Betriebssystemen ist der Terminus "Block" gebräuchlich. Beide Begriffe sind synonym zu
verwenden, jedoch sind die Blöcke des Datenträgers und die des Dateissystems zu unterscheiden. Das Dateisystem kann im
Allgemeinen nur vollständige Cluster adressieren, es ist nicht möglich, einzelne Datenträger-Blöcke oder gar einzelne Bytes
innerhalb eines Clusters zu adressieren. Daher belegen Dateien auf einem Datenträger immer eine ganze Anzahl von Clustern.
Je größer die Cluster sind, desto weniger Verwaltungsaufwand muss für große Dateien aufgewendet werden und desto geringer
wird die statistische Fragmentierung einer Datei. Da für jede Datei im Mittel ein halber Cluster verschwendet wird, sind größere
Cluster hierbei im Nachteil. Die maximal mögliche Anzahl von Clustern auf einem Datenträger variiert je nach Dateisystem.
FAT32 unterstützt bis zu 232, NTFS 264 Cluster. Aus der maximalen Anzahl von Clustern und der gewählten Clustergröße –
typischerweise zwischen 512 und 32 KByte – ergibt sich die maximale Größe eines Dateisystems. Bei einer Clustergröße von
nur 512 Byte kann ein FAT32-Dateisystem beispielsweise bis zu 2200 Gigabyte (232 * 512) groß sein.
■ Das Dateisystem wird mit Hilfe von speziellen Dateien verwaltet, die Informationen über die Dateien enthalten. Diese werden
Kataloge oder Dateiverzeichnisse (engl.: directory) genannt. Eine Katalogdatei enthält für jede Datei einen Eintrag mit
Informationen über
- den Dateinamen, (dazu gehört ggf. auch die "Erweiterung" )
- den Dateityp: Normaldatei oder Katalogdatei
- die Länge der Datei in Bytes
- die Blöcke, aus denen die Datei besteht, ggf. reicht ein Verweis auf den ersten Block
- die Zugriffsrechte, d.h. welche Benutzer diese Datei lesen oder verändern dürfen
- Passwörter zum Schutz der Datei vor unberechtigtem Zugriff
- Statistikdaten wie die Zugriffshäufigkeit, das Datum der letzten Änderung, der Erstellung
■ Das Dateisystem bietet dem Anwenderprogramm mindestens folgende Operationen zur Verwaltung von Dateien:
- Neu:
- Löschen:
- Kopieren:
Anlegen einer noch leeren Datei in einem bestimmten Katalog
Die Datei wird entfernt und damit unzugänglich
Dabei kann implizit eine neue Datei erzeugt oder eine bestehende überschrieben oder verlängert
- Umbenennen:
werden
Änderung des Dateinamens
- Verschieben:
Die Datei wird in einen anderen Katalog übertragen
■ Jede gefüllte Datei besteht aus einer Liste von ihr belegter Blöcke. Im Katalog finden sich Hinweise auf die Blöcke, aus denen die
Dateien bestehen. Daneben muss das Dateisystem eine Pseudodatei verwalten, die aus allen nicht belegten (also noch
verfügbaren) Blöcken eines Datenträger besteht. Eine weitere Pseudodatei besteht aus allen Blöcken, die als unzuverlässig gelten,
weil ihre Bearbeitung zu Hardwareproblemen geführt hat. Unzuverlässige Blöcke werden nicht mehr für Dateien genutzt. Es gibt
also:
- belegte Blöcke,
- freie Blöcke,
- unzuverlässige Blöcke.
-->
Während der Bearbeitung der Dateien ändern sich diese Listen dynamisch.
■ Um eine Datei bearbeiten zu können, muss man sie vorher öffnen. Dabei wird eine Verbindung zwischen der Datei und ihrem
Katalogeintrag, zwischen der Zugriffsmethode, mit der sie bearbeitet werden soll, und einem Anwenderprogramm, das dies
veranlasst, hergestellt. Nach dem Bearbeiten muss die Datei wieder geschlossen werden. Wenn beispielsweise ein Anwender eine
Textdatei editiert, dann muss das Betriebssystem aus dem Dateinamen die Liste der Blöcke bestimmen, in denen der Datei-Inhalt
gespeichert ist. Meist ist dazu nur die Kenntnis des ersten Blockes notwendig. Dieser enthält dann einen Verweis auf den nächsten
Block und so fort. Wird die editierte Datei gespeichert, so müssen möglicherweise neue Blöcke an die Liste angehängt werden,
oder einige Blöcke können entfernt und der Liste der freien Blöcke übergeben werden.
Datei =
Block 1
Block 2
...........
Block N
■ Das Betriebssystem muss also Operationen des Anwendungsprogrammes wie z.B. "Datei lesen" und "Datei speichern" umsetzen in
elementarere Operationen, so genannte Systemaufrufe (engl.: system calls) welche die Hardware ausführen kann. Dazu
gehören:
- Lesen eines oder mehrerer Blöcke
- Schreiben eines oder mehrerer Blöcke
■ Die Systemaufrufe "Neu" oder "Löschen" führen lediglich dazu, dass Blöcke der Liste der freien Blöcke entnommen oder
zurückgegeben werden. Der Inhalt der Blöcke muss nicht gelöscht werden. Aus diesem Grunde sind ist mit bestimmten
Programmen auch möglich versehentlich gelöschte Dateien ganz oder teilweise wiederherzustellen, sobald man den ersten Block
wiederfindet. Sind mittlerweile aber einige Blöcke in anderen Dateien wiederbenutzt worden, ist es zu spät.
■ Das Dateisystem verwaltet eine Datei als Folge von Blöcken. Eine Datei, die nur ein Byte enthält, verbraucht mindestens den
Speicherplatz eines Blockes. Für ein Anwenderprogramm wie einen Texteditor besteht eine Datei aus einer Folge von Bytes. Der
Texteditor muss in der Lage sein, ein bestimmtes Byte zu schreiben, zu löschen oder an einer bestimmten Stelle ein Byte
einzufügen. Die Präsentation der Datei als eine solche Folge von Bytes obliegt dem Betriebssystem. Es stellt daher Systemaufrufe
zur Verfügung, um Dateien byteweise zu lesen und zu schreiben. Selbst der Programmierer des Texteditors muss nichts von der
blockweisen Organisation der Dateien wissen. Für ihn ist die Abbildung von der Bytefolge in die Blockfolge unsichtbar.
2.5.5.2. Prozessverwaltung
■ Ein auf einem Rechner ablauffähiges oder im Ablauf befindliches Programm, zusammen mit all seinen benötigten Ressourcen wird
zusammenfassend als Prozess oder Task bezeichnet. Auf einem Rechner mit einer CPU ist es nicht wirklich möglich, dass
mehrere Prozesse gleichzeitig laufen. Wenn man allerdings mehrere Prozesse abwechselnd immer für eine kurze Zeit (einige
Millisekunden) arbeiten läßt, so entsteht der Eindruck, als würden diese Prozesse gleichzeitig laufen. Die zur Verfügung stehende
Zeit wird in kurze Intervalle unterteilt. In jedem Intervall steht die CPU einem anderen Prozeß zur Verfügung. Dazwischen findet
ein Taskwechsel statt, wobei der bisherige Prozess suspendiert und ein anderer Prozess (re-)aktiviert wird.
■ Ein Prozess kann sich, nachdem er gestartet wurde, in verschiedenen Zuständen befinden. Nach dem Start ist er zunächst bereit
und wartet auf die Zuteilung eines virtuellen Prozessors, auf dem er ablaufen kann. Irgendwann wird er vom Betriebssystem zur
Ausführung ausgewählt - er ist dann aktiv. Wenn er nach einer gewissen Zeitdauer nicht beendet ist, wird das Betriebssystem
ihn unterbrechen (suspendieren), um einem anderen Prozess den Prozessor zuzuteilen. Unser Prozess ist dann erneut bereit. Es
kann aber auch der Fall eintreten, dass der Prozess auf eine Ressource wartet - z. B. auf einen Drucker oder auf eine
Dateioperation. Dann wird er blockiert und erst wieder als bereit eingestuft, falls das Signal kommt, dass seine benötigten
Ressourcen bereitstehen. In der Zwischenzeit können die anderen Prozesse den Prozessor nutzen.
gestartet
aktiv
bereit
beendet
suspendiert
-->
Hat ein Rechner genau eine CPU, so ist höchstens ein Prozess zu jedem Zeitpunkt aktiv. Dieser wird als laufender Prozess
bezeichnet.
Bestandteile eines Prozesses
■ Ein Prozess ist eine Instanz eines in Ausführung befindlichen Programmes. Wenn er deaktiviert wird, müssen alle notwendigen
Informationen gespeichert werden, um ihn später im gleichen Zustand wieder reaktivieren zu können. Dazu gehören:
- sein Programmcode
- sein im Arbeitsspeicher des Rechners befindlichen Daten
- der Inhalt der CPU-Registern einschließlich des Befehlszählers
- eine Tabelle aller geöffneten Dateien mit ihrem aktuellen Bearbeitungszustand
Befehle
Daten
Speicher für Registerinhalte
Speicherabbild des Prozesses
Speicher für die Tabelle offener Dateien
-->
Wenn ein Prozess unterbrochen werden soll, muss der Inhalt der CPU-Register in den vorgesehenen Arbeitsbereich gerettet
werden. Wenn ein wartender Prozess aktiviert werden soll, muss der Inhalt der Register, so wie er bei seiner letzten
Unterbrechung gesichert wurde, wieder geladen werden.
Threads
Jeder Prozess besitzt seinen eigenen Speicherbereich. Demgegenüber sind Threads (engl.: thread = Faden) Prozesse, die keinen
eigenen Speicherbereich besitzen. Man nennt sie daher auch leichtgewichtige Prozesse (engl.: lightweight process). Der Aufwand
(der so genannte overhead) zur Erzeugung und Verwaltung von Threads ist deutlich geringer als bei Prozessen. Gewöhnlich laufen
innerhalb eines Prozesses mehrere Threads ab, die den gemeinsamen Speicherbereich nutzen. Threads sind in den letzten Jahren
immer beliebter geworden. Moderne Sprachen, darunter Java, haben Threads in die Sprache integriert.
Multitasking
■ Für die Verwaltung der Prozesse hat das Betriebssystem verschiedene Möglichkeiten. Die einfachste Methode besteht darin,
Prozessen eine Priorität zuzuordnen und jeweils dem bereiten Prozess höchster Priorität die CPU zuzuordnen, bis dieser Prozess
nicht mehr bereit ist oder ein anderer Prozess höherer Priorität rechenwillig wird. Eine allein durch Prioritäten gesteuerte
Verwaltung begünstigt also den Prozess mit höchster Priorität. Zeitpunkt und Dauer der Ausführung von Prozessen geringerer
Priorität sind nicht vorhersehbar. Diese Form des Multitasking ist das von älteren Windows-Versionen und Mac OS bis Version 9
bekannte kooperative Multitasking. Dabei ist es jedem Prozess selbst überlassen, wann er die Kontrolle an das Betriebssystem
zurückgibt. Es hat den Nachteil, dass Programme, die nicht kooperieren, bzw. die Fehler enthalten, das gesamte System zum
Stillstand bringen können. Diese Methode ist daher nur in einfachen Fällen möglich.
■ Eine bessere Methode besteht darin, die Zuteilung des Betriebsmittels CPU nicht allein von der Priorität eines Prozesses abhängig
zu machen, sondern jedem bereiten Prozess per Zeitscheiben in regelmäßigen Abständen die CPU zuzuteilen. Diese Methode
bezeichnet man als präemptives Multitasking. Das Betriebssystem führt eine neue CPU-Zuteilung durch, wenn der laufende
Prozeß entweder
- eine bestimmte Zeit gerechnet hat, oder
- wenn er auf ein Ereignis warten muss.
■ Ein solches Ereignis könnte die Ankunft einer Nachricht von einem anderen Prozess sein oder die Freigabe eines Betriebsmittels
wie Laufwerk, Drucker, Modem, das der Prozess zur Weiterarbeit benötigt. Je nach System werden als Dauer einer Zeitscheibe 1
Millisekunde, 10 Millisekunden oder mehr gewählt.
■ Die meisten Betriebssysteme führen allerdings nur eine sehr einfache Zeitscheibenzuteilung für die bereiten Prozesse durch.
Dieses Verfahren wird round robin (engl. für Kreislauf) genannt und besteht darin, alle Prozesse, die bereit sind, in einer
zyklischen Liste anzuordnen. Die bereiten Prozesse kommen in einem bestimmten Turnus an die Reihe und erhalten jeweils eine
Zeitscheibe. Prozesse, die nicht mehr bereit sind, werden aus der Liste entfernt, solche, die soeben bereit geworden sind, werden
an einer bestimmten Stelle in der Liste eingehängt. Die Verwaltung der Prozesse erfolgt durch einen Teil des Betriebssystems, den
sogenannten Scheduler, der selbst als einer der Prozesse betrieben wird, die in der Liste enthalten sind. Er wird einmal pro
Rundendurchlauf aktiv und kann den Ablauf der anderen Prozesse planen.
2.5.5.3. Speicherverwaltung
■ Eine der Aufgaben des Betriebssystems besteht in der Versorgung der Prozesse mit dem Betriebsmittel Arbeitsspeicher. Dabei
sollen die Prozesse vor gegenseitiger Beeinträchtigung durch fehlerhafte Adressierung gemeinsam benutzter Speicherbereiche
geschützt werden Die wesentlichen Verfahren zur Speicherverwaltung, die im Folgenden beschrieben werden sollen, sind:
- Swapping
- Paging
■ In den frühen Tagen des Computers waren Speicher klein und teuer. Traditionell löste man dieses Problem durch Verwendung
eines Sekundärspeichers, z. B. einer Festplatte. Der Programmierer zerlegte das Programm in einzelne Segmente, die jeweils in
den Speicher passten. Um das Programm auszuführen, wurde das erste Segment in den Hauptspeicher geladen und ausgeführt.
War es abgearbeitet, las es das nächste Segment ein, rief das nächste Segment auf, usw. Der Programmierer war dafür
verantwortlich, das Programm zu segmentieren und festzulegen, wo die einzelnen Segmente im Sekundärspeicher angeordnet
werden sollen, und wie die Überlagerungen zwischen dem Haupt- und dem Sekundärspeicher zu transportieren sind. Im
Allgemeinen musste er den gesamten Segmentierungsprozess ohne Unterstützung durch den Computer verwalten.
■ 1961 schlugen Forscher im britischen Manchester eine Methode zur automatischen Durchführung des Segmentierungsprozesses
vor. Diese Methode, die man heute virtuellen Speicher (Virtual Memory) nennt, hatte den klaren Vorteil, dass sie den
Programmierer von all diesen Verwaltungsaufgaben entlastete. Das Konzept basierte auf der Trennung von Adressraum und
Speicherstellen. Man betrachte als Beispiel einen typischen Computer aus jener Zeit. Er hatte möglicherweise ein 16-BitAdressfeld in seinen Instruktionen und 4096 Speicherwörter. Auf diesem Computer konnte ein Programm 65.536 Speicherwörter
adressieren. Der Grund, warum es genau 65.536 (216) 16-Bit-Adressen sind, ist, dass jede einem anderen Speicherwort entspricht.
Man beachte, dass die Anzahl der adressierbaren Wörter nur von der Bitanzahl in einer Adresse abhängt und nichts mit der Anzahl
der tatsächlich verfügbaren Speicherwörter zu tun hat. Der Adressraum bestand bei diesem Computer aus den Zahlen 0, 1, 2, ...,
65.535, weil das der Bereich der möglichen Adressen ist. Möglicherweise hatte der Computer aber auch weniger als 65.535
Speicherwörter.
-->
Vor der Erfindung des virtuellen Speichers unterschied man zwischen den Adressen unter 4096 und denen bei oder über 4096.
Diese beiden Teile galten als nützlicher bzw. unnützer Adressraum, weil die Adressen oberhalb von 4095 nicht den tatsächlichen
Speicheradressen entsprachen. Man unterschied nicht zwischen Adressraum und Speicheradressen, weil die Hardware eine
Eins-zu-Eins-Entsprechung der beiden Bereiche auferlegte.
■ Im Detail besagt das Konzept, den Adressraum und die Speicheradressen zu trennen, Folgendes: Zu einem beliebigen Zeitpunkt
können 4096 Speicherwörter direkt adressiert werden, müssen aber nicht den Speicheradressen 0 bis 4095 entsprechen. Wir
könnten dem Computer z. B. "sagen", dass ab jetzt das Speicherwort an Adresse 0 zu benutzen ist, wenn die Adresse 4096
referenziert wird. Bei einer Referenz auf Adresse 4097 ist das Speicherwort an Adresse 1 zu benutzen, bei einer Referenz auf
Adresse 8191 das Speicherwort an Adresse 4095, usw. Anders ausgedrückt: Wir haben eine Abbildung des Adressraums auf die
tatsächlichen Speicheradressen definiert, wie die folgende Abbildung zeigt:
Adressraum
8191
4096
Abbild
u
ng
4KHauptspeicher
0
4095
0
■ Eine interessante Frage ist: Was passiert, wenn ein Programm, an eine Adresse zwischen 8192 und 12287 verzweigt? Auf einer
Maschine ohne virtuellen Speicher würde das Programm einen Fehler verursachen und beendet werden. Auf Maschinen mit einem
virtuellen Speicher würden folgende Schritte ablaufen:
-->
1.
2.
Der Inhalt des Arbeitsspeichers wird auf Platte gespeichert.
Die Wörter 8192 bis 12287 werden auf der Platte ausfindig gemacht.
3.
4.
Die Wörter 8192 bis 12287 werden in den Arbeitsspeicher geladen.
Die Adressabbildung wird so geändert, dass sie die Adressen 8192 bis 12287 auf die Speicherlokationen 0 bis 4095
5.
abbildet.
Die Ausführung wird fortgesetzt, als wäre nichts Ungewöhnliches passiert.
Diese Technik der automatischen Segmentierung nennt man Paging, und die Programmhappen, die von der Platte eingelesen
werden, Seiten (Pages).
■ Wir nennen die Adressen, die das Programm referenzieren kann, den virtuellen Adressraum (Virtual Address Space) und die
realen, festverdrahteten Speicheradressen den physikalischen Adressraum (Physical Address Space). Eine Speicherabbildung
(Memory Map) oder Seitentabelle (Page Table) referenziert virtuelle auf physikalische Adressen. Wir gehen davon aus, dass auf
der Platte ausreichend Platz vorhanden ist um den gesamten virtuellen Adressraum (oder zumindest den zu benutzenden Teil) zu
speichern.
Implementierung von Paging
■ Eine wichtige Voraussetzung für einen virtuellen Speicher ist eine Platte, auf der das komplette Programm und alle Daten geführt
werden können. Konzeptionell ist es einfacher, sich die Kopie des Programms auf der Platte als Original und die hier und da in den
Arbeitsspeicher überführten Teile als Kopien vorzustellen, und nicht umgekehrt. Natürlich ist es wichtig, das Original auf dem
neuesten Stand zu halten. Wird die Kopie im Arbeitsspeicher geändert, sollten sich diese Änderungen (letztendlich) auch im
Original widerspiegeln.
■ Der virtuelle Adressraum wird in eine Reihe von Seiten gleicher Größe gegliedert. Die Größen reichen heute von 512 Byte bis 64
Kbyte pro Seite, gelegentlich werden aber auch Größen von 4 Mbyte benutzt. Die Seitengröße ist immer eine Potenz von 2. Der
physikalische Adressraum wird ebenso in Segmente aufgeteilt, wobei jedes Stück die gleiche Größe wie eine Seite hat, so dass
jedes Stück Arbeitsspeicher genau eine Seite aufnehmen kann. Diese Arbeitsspeicherstücke für die Seiten nennt man
Seitenrahmen (Page Frames). Der Arbeitsspeicher in der folgenden Abbildung umfasst nur einen Seitenrahmen. In der Praxis
enthält er normalerweise Tausende.
■ Die nebenstehende Abbildung zeigt eine Möglichkeit, die
ersten 64 KByte eines virtuellen Adressraums in Seiten von je
4 KByte aufzuteilen. Diesen virtuellen Speicher würde man
mit Hilfe einer Seitentabelle implementieren, die so viele
Einträge hat, wie es Seiten im virtuellen Adreßraum gibt. Wir
zeigen der Einfachheit halber nur die ersten 16 Einträge.
Versucht das Programm, auf ein Wort in den ersten 64 KByte
seines virtuellen Adressraums zuzugreifen, ungeachtet
dessen, ob es Instruktionen oder Daten holen oder Daten
speichern will. erzeugt es zuerst eine virtuelle Adresse
zwischen 0 und 65532 (unter der Annahme, dass
Wortadressen durch 4 teilbar sein müssen).
Links die ersten 64 Kbyte des virtuellen Adreßraums, in 16 Seiten von je 4 Kbyte aufgeteilt;
Rechs ein in acht Seitenrahmen von je 4 Kbyte aufgeteilter 32-Kbyte-Arbeitsspeicher
Seitenersetzung
■ Eine referenzierte virtuelle Seite befindet sich nicht immer im Arbeitsspeicher, weil der Arbeitsspeicher nicht für alle virtuellen
Seiten Platz hat. Erfolgt eine Referenz auf eine Adresse einer Seite, die nicht im Arbeitsspeicher ist, nennt man das Seitenfehler
(Page Fault). Nach Eintritt eines Seitenfehlers muss das Betriebssystem die erforderliche Seite von der Platte lesen, ihre neue
physikalische Speicherstelle in die Seitentabelle eingeben und dann die Instruktion wiederholen, die den Seitenfehler verursacht
hat. Ein Programm, das auf einer Maschine mit einem virtuellen Speicher läuft, kann man starten, ohne dass sich auch nur ein
Programmteil im Arbeitsspeicher befindet. Die Seitentabelle muss lediglich entsprechend gesetzt werden, so dass sie darauf
hinweist, dass sich jede einzelne virtuelle Seite nicht im Arbeits-, sondern im Sekundärspeicher befindet. Versucht die CPU, die
erste Instruktion zu holen, ergeht sofort ein Seitenfehler, so dass die Seite mit der ersten Instruktion in den Speicher geladen und
in die Seitentabelle eingetragen wird. Dann kann die erste Instruktion beginnen. Hat die erste Instruktion zwei Adressen und
befinden sich beide Adressen auf verschiedenen Seiten, die sich ihrerseits beide von der Instruktionsseite unterscheiden, treten
zwei oder mehr Seitenfehler ein, und zwei weitere Seiten werden herbeigeholt, bevor die Instruktion schließlich ausgeführt wird.
Die nächste Instruktion kann wieder mehrere Seitenfehler verursachen, usw.
■ Im Idealfall kann man die Arbeitsmenge, die ein Programm vorwiegend nutzt, im Speicher halten, um Seitenfehler zu reduzieren.
Programmierer wissen aber selten, welche Seiten sich in der Arbeitsmenge befinden. Deshalb muss das Betriebssystem diese
Menge dynamisch feststellen. Fordert ein Programm eine Seite an, die sich nicht im Arbeitsspeicher befindet, muss die
angeforderte Seite von der Platte geholt werden. Um für sie Platz zu schaffen, muss aber irgendeine andere Seite auf die Platte
zurückgeschickt werden. Folglich benötigt man eine Methode, der die zu entfernende Seite bestimmt. Die meisten Betriebssysteme
versuchen vorherzusagen, welche Seiten im Speicher dahingehend am wenigsten brauchbar sind, dass sie die geringste nachteilige
Wirkung auf das laufende Programm haben.
■ Eine Möglichkeit hierfür ist es vorauszusagen, wann die nächste Referenz auf eine Seite erfolgt, und die Seite zu entfernen, deren
vorhergesagte nächste Referenz am weitesten in der Zukunft liegt. Anders ausgedrückt: Statt eine Seite zu entfernen, die in Kürze
wieder gebraucht wird, versucht man, eine auszuwählen, die über lange Zeit nicht gebraucht wird. Diese Methode heißt LRU
(Least Recently Used).
■ Ein weitere Methode, FIFO (First-In First-Out), entfernt die jeweils zuletzt geladene Seite, unabhängig davon, wann diese Seite
zuletzt angefordert wurde. Für jeden Seitenrahmen gibt es einen Zähler. Anfangs werden alle Zähler auf 0 gesetzt. Nach der
Bearbeitung eines Seitenfehlers wird der Zähler der momentan im Speicher befindlichen Seite um eins erhöht, während der Zähler
für die gerade eingebrachte Seite auf 0 gesetzt wird. Wird es nötig, eine Seite zu entfernen, wird die mit dem höchsten Zähler
gewählt. Weil ihr Zähler der höchste ist, hat sie die höchste Zahl an Seitenfehlern. Das bedeutet, dass sie vor allen übrigen, im
Speicher befindlichen Seiten geladen wurde und damit aller Wahrscheinlichkeit nach lange nicht mehr gebraucht wird.
Swapping
■ Eine weitere Methode zur Speicherverwaltung in das so genannte Swapping. Hierbei befinden sich zu einem gegebenen Zeitpunkt
einige Segmentmengen im Speicher. Bei einer Referenz auf ein Segment, das sich momentan nicht im Speicher befindet, wird
dieses geholt. Ist kein Platz dafür vorhanden, müssen eines oder mehrere Segmente zuerst auf die Platte ausgelagert werden. In
dieser Hinischt ist das Swapping von Segmenten mit dem Paging vergleichbar: Segmente werden nach Bedarf geholt und
ausgelagert.
■ Die Segmentierung wird beim Swapping aber anders als beim Paging implementiert. Swapping besitzt einen entscheidenden
Nachteil: Seiten haben eine feste Größe, Swapping-Segmente nicht.
■ Die obige Abbildung zeigt das Beispiel eines physikalischen Speichers, der anfangs fünf Segmente enthält. Man betrachte, was
passiert, wenn in (a) Segment 1 ausgelagert und das kleinere Segment 7 an seine Stelle gesetzt wird. Wir gelangen zu der
Speicherkonfiguration von (b). Zwischen Segment 7 und Segment 2 liegt ein ungenutzter Bereich, also ein Loch. Dann wird
Segment 4 durch Segment 5 (c) und Segment 3 durch Segment 6 ersetzt (d). Nachdem das System eine Weile lief, wird Speicher
in Stücke aufgeteilt, von denen einige Segmente und andere Löcher enthalten. Dieses Phänomen nennt man externe
Fragmentierung (External Fragmentation), weil außerhalb der Segmente in den dazwischenliegenden Löchern Platz
verschwendet wird.
2.5.6. Das Betriebsssystem Unix
■ Im Prinzip liefert das Betriebssystem eine hardwareunabhängige Schnittstelle zum Rechner. Dennoch sind Betriebssysteme von
den Stärken und Schwächen oder von besonderen Fähigkeiten spezieller CPUs beeinflusst. So sind Betriebssysteme wie MS-DOS,
Windows 9x, Windows 2000 und Windows XP nur auf Rechnern einer Bauart (x86-Architektur) verfügbar, während andere
Betriebssysteme wie UNIX und Windows NT auf vielen Hardware-Plattformen (darunter auch die x86-Architektur) verfügbar
sind. Auf Workstations und im wissenschaftlichen Umfeld dominiert seit Anfang der achtziger Jahre das Betriebssystem UNIX. Auf
PCs gewinnt der frei erhältliche UNIX-Abkömmling Linux immer mehr an Boden. Im Vergleich zu Windows ist es technisch
ausgereifter, stabiler und schneller. Aufgrund der weiten Verbreitung von UNIX und Linux wollen wir exemplarisch den Umgang mit
diesem Betriebssystem behandeln. Wir betrachten hier UNIX aus der Sicht eines Benutzers.
■ Das UNIX-Dateisystem ist als Baum organisiert. Die Dateisysteme der einzelnen Benutzer sind Unterbäume des globalen
Dateibaumes. Die Wurzel dieses Baumes heißt root und wird mit einem Schrägstrich "/" (slash) abgekürzt. Die inneren Knoten
sind Unterverzeichnisse, die Blätter sind die eigentlichen Dateien. In UNIX zählt man auch die Verzeichnisse zu den Dateien.
Schließlich werden auch Geräte (Drucker, Terminals, Platten, Maus etc.) logisch wie Dateien behandelt. In die einem Bildschirm
zugeordnete Datei kann man nur schreiben, von der zu einer Tastatur gehörenden Datei nur lesen. Löscht man diese Dateien, so
kann man das zugehörige Gerät nicht mehr ansprechen. Diese Philosophie hat den Vorteil der Einfachheit. Wenn der Benutzer
weiß, wie er ein Datum in eine Datei schreibt, so weiß er auch, wie er es druckt: Es wird einfach in die dem Drucker zugeordnete
Datei geschrieben. Angesichts der zahlreichen Implementierungen von Unix kann man nur schwer über den Aufbau des
Dateisystems Aussagen treffen, da sich alle in gewisser Weise unterscheiden. Allgemein läßt sich die folgende Struktur annehmen:
■ Für die Organisation des UNIX-Dateibaumes
haben sich gewisse Konventionen eingebürgert.
Einige Unterverzeichnisse haben eine spezielle
Bedeutung:
bin
:
Systemdateien
(binär)
dev
:
Gerätedateien
(devices)
lib :
usr :
Bibliotheken
(libraries)
Benutzerdateien (user)
etc
Sonstige Systemdateien
:
Zugriffsrechte
■ Wie wir bereits gesehen haben, befindet sich unter den elementarsten Diensten jedes Betriebssystems die Dateiverwaltung.
Dateien müssen erzeugt, verändert, abgespeichert, umbenannt und gelöscht werden. Ferner muss der Zugang zu ihnen den
anderen Benutzern des Rechners ermöglicht oder verweigert werden. Das UNIX-System hat für viele spätere Systeme in diesem
Bereich Maßstäbe gesetzt und ist insbesondere auf Workstations zum de facto-Standard geworden.
■ UNIX ist ein Mehrbenutzersystem. Das Dateisystem jedes Benutzers ist ein Unterbaum des globalen Dateisystems, meist direkt
unter dem Verzeichnis usr angehängt. Die Wurzel dieses Benutzer-Dateibaumes heißt auch home directory des Benutzers. Jede
Datei hat einen owner. Wie der Name schon andeutet, besitzt dieser die Datei, kann also die Zugriffsrechte anderer Benutzer auf
diese Datei vergeben. Jeder Benutzer kann auf beliebige Dateien in dem Dateibaum zugreifen, sofern ihm die notwendigen
Zugriffsrechte gewährt werden. Auf diese Weise können Ressourcen des Systems gemeinsam genutzt werden.
■ Wie bereits erwähnt, hat jede Datei einen Besitzer (owner), welcher festlegen darf, wer welche Zugriffsberechtigung hat. Es gibt
drei Arten des Zugriffs:
r
w
x
:
:
:
Lesezugriff
Schreibzugriff
Ausführung
(r = read)
(w = write)
(x = execute)
Die Schreibberechtigung w schließt das Recht für Änderungen und das Löschen der Datei ein. Die Ausführungsberechtigung x ist
nur für die Ausführung von Programmdateien und den Zugriff auf Verzeichnisse relevant. Die Benutzer werden in drei Klassen
eingeteilt:
user
:
der Besitzer (owner) der Datei
group
others
:
:
die Arbeitsgruppe, zu der der owner gehört
alle anderen Benutzer des Systems
Für jede dieser Benutzerklassen können die drei Zugriffsarten jeweils erlaubt oder verweigert werden. Der Systemverwalter legt
fest, zu welcher group der Benutzer gehört.
Unix-Shells
■ Wenn ein Benutzer unter Unix Kommandos auf der Systemkonsole eingibt, werden diese vom Kommandointerpreter, einer so
genannten shell, an das Betriebssystem weiter gereicht. Dahinter steckt die Vorstellung, dass sich der Kommandointerpreter wie
eine Schale (engl.: shell) um den Betriebssystemkern legt. Die Shell vermittelt zwischen den Wünschen des Benutzers und den
Ressourcen des Betriebssystems. Sie nimmt Kommandos entgegen, analysiert diese und sorgt dafür, dass das Betriebssystem die
gewünschten Aktionen ausführt. Nach einer abgeschlossenen Aktion wartet die Shell auf das nächste Kommando. Der UNIXBenutzer hat verschiedene Shells zur Auswahl. Einige davon sind die Bourne-Shell, die Korn-Shell, die C-Shell oder die tcShell. Diese unterscheiden sich nur wenig, was die elementaren Kommandos betrifft. Stärker sind die Unterschiede erst
hinsichtlich der Art ihrer Programmierbarkeit und des Komforts, den sie bieten. Der Benutzer kann durchaus mehrere Shells
gleichzeitig benutzen. Durch das Kommando csh, öffnet er z. B. eine neue C-Shell.
Unix-Kommandos
■ Auf der Kommandoebene unterscheidet sich UNIX nicht sehr von DOS. Für den geübten Benutzer erweist es sich aber als weit
mächtiger und flexibler. Für jedes Kommando existiert ein Eintrag im Online Manual, welcher mit dem Befehl
man <kommando>
abgerufen werden kann. Man erhält eine komplette Beschreibung des Befehls <kommando>. Füllt der Eintrag mehrere Seiten, so
kann mit der Leertaste vorwärts und mit b (backward) rückwärts geblättert werden, q oder Ctrl-c brechen die Ausgabe ab. Als
Beispiele versuche man:
man
man
pwd
man
Wir können im Rahmen dieses Seminars nicht jedes Kommando einzeln besprechen. Im Folgenden einige wichtige Kommandos zur
Dateiverwaltung:
cp
mv
rm
Datei kopieren (copy)
Datei umbenennen (move)
Datei löschen (remove)
rmdir
ls
cat
Verzeichnis löschen (remove directory)
Dateiliste anzeigen (list directory)
Datei-Inhalt anzeigen
mkdir
neues Verzeichnis erstellen (make directory)
lp
Datei drucken (line-print)
Kommandooptionen
■ Die meisten UNIX-Befehle können durch Optionen noch verändert und damit den Benutzeranforderungen angepasst werden.
Optionen werden in der Regel durch einen Buchstaben mit vorgestelltem Bindestrich (dash) gekennzeichnet. Man kann auch
mehrere Optionen zu einer Zeichenkette zusammenfassen und mit vorgestelltem "-" dem Befehl anhängen. Die Syntax des Befehls
ls, wird im Manual mit
ls [[Optionen] Dateien]
angegeben. Wie üblich sind die Teile in den eckigen Klammern optional. Ein Beispiel für die Benutzung des ls-Befehls ist:
ls -al *. dvi
Hier wird der ls-Befehl mit den Optionen -a (all) und -l (long) aufgerufen. Gemeint ist: "Liste in langer Form (d. h. mit
Zusatzinformationen) die Dateien auf, deren Namen auf ". dvi" enden, und zwar alle (auch die versteckten)." Die wichtigsten
Optionen des ls-Befehles sind im folgenden zusammengestellt:
-C
-c
-d
(columns)
(creation date)
(directories)
Mehrspaltige Ausgabe.
Zeige Datei in der Reihenfolge ihrer Erzeugung.
Zeige nur die Verzeichnisse.
Softlinks
■ Statt eine Kopie einer Datei, die im UNIX-Dateisystem vorhanden ist, in das eigene Verzeichnis zu kopieren (und damit erneut
Speicherplatz zu verschwenden), kann man mit dem Befehl ln einen sogenannten Softlink erzeugen. Ein Softlink verhält sich
logisch wie eine Datei, die Dateien liegen aber physikalisch in einem entfernten Verzeichnis. Die Befehle
ln
Quelldatei Zieldatei
und
cp
Quelldatei Zieldatei
sind also weitestgehend äquivalent. Jede (physikalische) Datei hat die Anzahl der auf sie zeigenden Softlinks als Attribut. Sie kann
physikalisch erst gelöscht werden, falls kein Softlink mehr vorhanden ist, der auf sie zeigt.
Standard-Eingabe/-Ausgabe
■ Viele UNIX-Kommandos, die mit Eingabe und/oder Ausgabe arbeiten, erwarten, wenn nichts anderes vereinbart wird, die Eingabe
von der Tastatur und liefern die Ausgabe an den Bildschirm. Da sowohl Tastatur als auch Bildschirm als Dateien behandelt werden,
kann man sie auch durch andere Dateien ersetzen. Man spricht von einer Umlenkung (redirection) von Standardeingabe und
Standardausgabe. Die Umlenkung der Standardausgabe geschieht mit den Zeichen ">" (bzw. ">>") und die Umlenkung der
Standardeingabe durch das Zeichen "<". In einem UNIX-Befehl bedeuten
>
>>
Datei
Datei
Ersetze Standardausgabe durch Datei
Hänge Standardausgabe an Datei an
<
Datei
Ersetze Standard-Input durch Datei
Beispielsweise kann man mit dem Kommando
ls -l
*. tex
>dokumente
eine Datei dokumente erzeugen, die die Liste aller Dateien mit Endung ". tex" enthält. Auf dem Bildschirm erscheint kein Zeichen,
denn Standardausgabe ist jetzt die Datei dokumente. Erwartet ein UNIX-Kommando einen Text als Argument, so wird, falls dieser
nicht angegeben wird, meist Standardeingabe angenommen. Das Folgende Kommando versendet eine E-Mail mit der Datei text.txt
als Inhalt:
mail -s [email protected] < text.txt
Dateibearbeitung
■ Die bisherigen Kommandos dienten im Wesentlichen der Navigation und Orientierung im UNIX-Dateisystem. Zur Verarbeitung und
Veränderung von Dateien gibt es eine Reihe von effektiven und vielseitigen Kommandos, von denen wir jetzt eine kleine Auswahl
vorstellen. Wenn eine Ausgabe erzeugt wird, so geht diese immer zur Standardausgabe, also zum Terminal, wenn nichts anderes
vereinbart wurde. Fehlt eine Eingabedatei, so wird die Eingabe von der Standardeingabe, also von der Tastatur, erwartet. Das
Kommando
cat [options] [files]
konkateniert die angegebenen Dateien.
Beispiel:
cat
Kapitel.1
Kapitel.2
Kapitel.3
> Buch
fügt die Dateien zu einer neuen Datei Buch zusammen.
■ Das Kommando sort [options] [file] sortiert die Datei.
Beispiel: sort -u namelist > namelist.sortiert (Sortiere die Datei namelist, entferne Duplikate (-u = unique) und speichere das
Ergebnis in namelist.sortiert)
■ Das Kommando wc
[options] [file] zählt die Zeilen (-1 = lines), Worte (-w) und Buchstaben (-c = characters).
Beispiel: wc -wc romeo-julia (Zähle die Worte (-w) und Zeichen (-c) in romeo-julia)
■ Das Kommando chmod
[options] mode filename setzt die Zugriffsberechtigungen (permissions) einer Datei für die
verschiedenen Benutzerklassen u (user), g (group) und o (others). Die Attribute können sein: r (read), w (write) und x (execute).
Beispiel: chmod
ug = rw
meineDatei (Setze das Lese- und Schreibrecht für Benutzer und Gruppe)
■ Das Kommando grep [options] regexp [files] sucht in den angegebenen Dateien nach dem angegebenen regulären Ausdruck
(Muster einer Zeichenkette) regexp.
Beispiel: grep -l Hugo * (Gib die Namen aller Dateien an, in denen das Wort Hugo vorkommt)
Pipes
■ Viele UNIX-Kommandos transformieren Eingabe nach Ausgabe. Eingabe und Ausgabe sind in diesem Zusammenhang meist
Dateien (speziell auch Tastatur und Bildschirm). Solche Kommandos heißen oft Filter, aber es ist besser, sich diese als Röhre
(engl.: pipe) vorzustellen.
Kommando 1
Eingabe
Ausgabe
■ Oft wird die Ausgabe des ersten Kommandos als Eingabe des nächsten benötigt. Es liegt daher nahe, beide Kommandos zu
verknüpfen, was mit der Röhrenvorstellung folgendermaßen dargestellt werden kann:
Eingabe
Kommando 1
Kommando 2
Ausgabe
■ Auf der Kommandozeilenebene kann man mit dem Zeichen "|" zwei Kommandos zu einer Pipe zusammen setzen. Die Ausgabe
eines Befehls wird zur Eingabe des nächsten, ohne dass temporäre Dateien angelegt werden müßten. Bereits die wenigen bisher
bekannten Befehle können mit Pipes zu interessanten Aufgaben kombiniert werden.
Beispiele:
Wie viele Dateien befinden sich im aktuellen Verzeichnis? ls | wc -w
Sortiere alle Zeilen einer Datei nach dem ersten Buchstaben. cat /etc/passwd | sort
■ Gelegentlich möchte man von einer pipe auch ein Zwischenergebnis abzweigen. Für diesen Vorgang wird ein T-Stück benötigt.
Dieses wird durch das Kommando tee realisiert:
Kommando 1
Eingabe
tee
Kommando 2
■ Beispiel:
Speichere alle Kunden aus Köln in der Datei Koeln. Gebe aber nur deren Anzahl auf dem Bildschirm aus:
grep
-i
koeln Kndn | tee Koeln | wc -1
Ausgabe
Hausaufgaben
(1) Erläutern Sie den Unterschied zwischen Swapping und Paging.
(2) Beschreiben Sie das Konzept der Pipes unter Unix.

Documentos relacionados