Dieser Text ist (a) noch in Arbeit und (b) erst mal nicht öffentlich (deswegen auch nicht mit dem Rest meiner Seiten verknüpft). Da man Öffentlichkeit aber nicht verhindern kann, sollte der Text mit diesen Fakten im Hinterkopf konsumiert werden. Andere haben die Verknüpfung vorgenommen; ok, danke der Ehre. Der Text steht bis zur Fertigstellung unter strengem deutschen Urheberrecht, also keine Verwertung  ohne meine schriftliche Genehmigung.

Bis zur Fertigstellung empfehle ich "The unix programming environment" von Mark Burgess. Da die Original-URL 
(http://www.iu.hioslo.no/~mark/unix/unix.html) seit geraumer Zeit nicht mehr erreichbar ist, habe ich eine
lokale Kopie vorrätig.


VHS-Kurs "Unix 1(Linux)", Rohfassung

24. Februar 2000

© Claus Schönleber, Kiel

Linux

Vor wenigen Jahren hätten nur wenige gewußt, was unter dem Begriff Linux zu verstehen ist, heute hört man sogar in Bereichen Menschen über Linux diskutieren, die sich selbst bisher eigentlich zu Anhängern anderer Betriebssystemphilosophien gezählt haben.

Die Entstehung von Linux

Nicht einmal Linus Thorvalds kann genau sagen, wann die Geschichte von Linux begann, aber übereinstimmend kann man 1991 als signifikanten Startpunkt der ganzen Angelegenheit betrachten. Die Entstehungsgeschichte zeigt, wie aus einer kleinen Idee eines Einzelnen ein Millionenmarkt entstehen kann, der inzwischen Arbeitsplätze und Verdienstmö1glichkeiten geschaffen hat, und sogar etablierte Märkte zu verschieben in der Lage war und noch ist.

Im April 1991 begann Linus Benedict Torvalds, sich für das Task-Switching von 386er Prozessoren zu interessieren. Deswegen schrieb er einen einfachen Taskswitcher für zwei Prozesse, die nichts anderes taten als Buchstabenreihen auf dem Bildschirm auszugeben. Daraufhin arbeitete er an einem Tastaturtreiber. Nach der Fertigstellung von Treibern für die seriellen Schnittstellen stand ihm im Prinzip schon ein minimales Terminalprogramm zur Verfügung. Diese Kombination könnte man schon als einen recht einfachen Kernel bezeichnen. Mit der Umstellung von Assembler auf die Sprache C verkürzte sich die Entwicklungszeit, vor allem durch effizientere Fehlersuchverfahren.

Zu diesem Zeitpunkt kristallisierte sich wohl die Idee heraus, daraus ein komplettes Betriebssystem herzustellen, das seinen Vorgänger Minix übertreffen sollte. Großes Zwischenziel war die Implementation des C-Compilers gcc auf Minix und später auf dem entstehenden Linux. Es folgten Festplattentreiber und Dateisystem und damit war die Minimalversion eines Betriebssystems geschaffen.

Mit der Anfang 1992 erschienen Version 0.12 erschien erstmals eine stabile Version, die einige Hardwarevarianten unterstützte. Von jetzt an verbreitete sich Linux sehr schnell. Zuerst als

Linuxmarkt

Zwischen den ersten Thorvaldschen Programmierversuchen und der Gegenwart liegt die Erschließung eines Multimillionendollarmarktes. Heute gibt es nicht nur mehrere Organisationen, die sich - neben den verdienten Privatpersonen und vielen Universitäten - um die Aktualisierung und eine gewisse Standardisierung von Linux bemühen, sondern unzählige Firmen, die auf der Linuxwelle mitreiten und durchaus erheblichen Umsatz damit machen. Das schließt den explodierenden Büchermarkt und unzählige Sc hulungen ein, aber auch die sogenannten Distributionen.

Alleine die US-Distributoren (so Red Hat) haben im Jahre 1997 schätzungsweise 750.000 Stück CD-ROM-Ausgaben verkauft, verglichen mit 450.000 im Jahr davor. Nicht so gut schätzen lassen sich die Kopiervorgänge über das Internet (ftp, WWW). Alleine über den ftp-Server der Firma Red Hat sind ungefähr 100.000 Kopiervorgänge in 12 Monaten gezählt worden. Sogenannte mirror sites haben im selben Zeitraum 382 Abzüge durchgeführt und ihren Klienten zur Verfügung gestellt. Man kann also davon ausgehen, daß der Umfang der Linuxabzüge nur von den US-Distributoren innerhalb von 12 Monaten näherungsweise bei 1 Million liegt. Davon werden sicherlich einige Kopien lokal vervielfältigt worden sein. Weltweit dürften mehrere Millionen Implementationen arbeiten, so daß das Umsatzvolumen wohl den Bereich der dreistellige Millionen in DM erreichen dürfte. Zwar wird Linux kostenlos abgegeben, aber die Distributoren lassen sich die Produktionskosten der CD-ROM und selbsterstellte Handbücher bezahlen, so daß der Preis für eine Distribution auf CD-ROM bei uns für Preise zwischen ungefähr 30 DM und 100 DM liegt. Und selbst das Kopieren von Linux über das Netz ist ja nicht kostenlos, denn es müssen Strom-, Leitungs- und Providergebühren berücksichtigt werden. Alles in allem ist Linux heute ein ernstzunehmender Marktfaktor im Bereich der PC-Betriebssysteme und zunehmend Konkurrent für etablierte Softwarefirmen.

Daß Linux nicht mehr nur ein Spielsystem für Freaks ist,. Läßt sich leicht nachweisen. So gehören zu den Firmen, die Linux im harten Alltagsbetrieb einsetzen, auch der Autoverleiher Sixt, die Mercedes-Benz-Abteilungen PKW-Vorentwicklung und F&E, zahlreiche Provider, das Nachrichtenarchiv dejanews und auch im Film: einige der Trickeffekte des Spielfilms "Titanic" wurden ebenfalls auf Linuxsystemen gerechnet. Dies ist nur die Spitze des Eisberges, ellenlange Listen von Firmen, Militärs und Organisationen sind überall zu finden.

Distributionen

Der enorme Siegeszug von Linux läßt sich nicht alleine auf die Leistungsfähigkeit oder den günstigen Preis zurückführen. Qualität alleine war noch nie Argument für signifikante Marktanteile. Ziemlich früh entwickelten sich deswegen Linuxpakete, in denen nicht nur der Betriebssystemkern, sondern auch die nötigen Werkzeuge, Installationsskripte und Applikationen untergebracht waren. Vor allem die Installation und Administration von Linux sind die Hauptargumente, ob das System im Alltag einsetzbar ist oder nicht. So entwickelten sich schnell verschiedene Pakete, die sich vor allem im Komfort bei der Installation unterschieden. Diese Pakete sind eben die Distributionen. Nicht nur Linuxfreaks, sondern auch Firmen adaptierten diese Praxis und es entwickelte sich ein reger Markt für verschiedene "Linuxe", die sich nicht nur äußerlich unterscheiden. Heute sieht sich der Interessierte einer Vielzahl von Linuxvarianten gegenüber und es bleibt nichts anderes übrig, als dich selbst durch diesen Dschungel hindurchzukämpfen, sich von Experten überzeugen zu lassen oder einschlägigen Testberichten Glauben zu schenken.
Slackware is a popular distribution of Linux maintained by Patrick Volkerding. It is easy to install and fairly complete, and may be obtained both from the Internet as well as on CD-ROM from a number of vendors. The Slackware distribution consists of a number of ``disk sets'', each one containing a particular type of software (for example, the d disk set contains development tools such as the gcc compiler, and the x disk set contains the X Window System software). You can elect to install whatever disk sets you like, and can install new ones later.

Das Betriebssystem

Linux ist ein Abkömmling der Unix-Betriebssystemfamilie. Im Gegensatz zu den üblichen PC-Betriebssystemen wie zum Beispiel MS-DOS und MS-Windows, handelt es sich bei Linux - wie bei allen Vertretern derselben Familie - um ein Mehrbenutzerbetriebssystem. Das bedeutet, daß erheblich mehr Aufwand getrieben werden muß, damit die Daten der einzelnen Benutzer nicht nur nicht durcheinanderkommen, sondern vor gegenseitigen unbefugten Zugriffen geschützt werden. Im Folgenden werden die zum Verständnis von Linux nötigen Einzelheiten erklärt. Darüberhinausgehende Erläuterungen sind der einschlägigen Fachliteratur zu entnehmen.

Aufgaben des Betriebssystems

Ein Betriebssystem hat vielfältige Aufgaben. Die wichtigsten sind

In einem Mehrbenutzersystem darf ein Benutzer nicht direkt auf Systemressourcen zugreifen. Es wäre fatal, wenn ein Benutzer A gerade den Drucker benutzen möchte und ein Benutzer B reservierte ihn für sich. Deswegen gibt es zwischen Hardware und Benutzer ein Zwischenstück, den Kern. Damit ein Programm, daß in dieser Umgebung arbeiten soll, trotzdem mit dem Rest des Systems kommunizieren kann, stellt der Kern definierte Schnittstellen nach außen zur Verfügung, die Systemaufrufe. Nicht jeder Benutzer kann alles aufrufen, manche dieser Aufrufe sind priviligiert und können nur vom Systemverwalter verwendet werden.

Alles wäre jedoch ziemlich zweckfrei, wenn man bearbeitete Daten und Programme nicht lagern könnte. Dazu braucht man ein Dateisystem. Und damit es für den Benutzer nicht so kompliziert wird, werden gleich alle vorhandenen Ressourcen, zum Beispiel Platten, Drucker oder Terminals, ebenfalls als Dateien behandelt. Damit fällt auch das von MS-Betriebssystemen bekannte Unterscheiden der verschiedenen Plattenlaufwerke weg. Alles ist in einem einzigen Baum untergebracht.

Schließlich benötigt man noch eine Schnittstelle, mit der sich der Benutzer dem Betriebssystem verständlich machen kann. Diese Komponente ist eigenständig und austauschbar; sie wird Shell genannt. Dazu kommen dann noch die üblichen Werkzeugen und Hilfsmittel, ohne die ein Arbeiten unmöglich wird. Angefangen beim einfachen Kopierprogramm bis hin zu komplexen Entwicklungssystemen, alles ist unter Unix eigenständiges Programm. Kurz: Es gibt keine "internen" Befehle im Betriebssystem. Dagegen gibt es sehr wohl "interne" Befehle in den Shells.

Dateisystem

Für die theoretische Einleitung wird eine prinzipielle theoretische Darstellung benutzt, die sich an das Minixdateisystem anlehnt. In der Referenz finden Sie dann das unter Linux heute verwendete Second Extended Dateisystem EXT2_FS beschrieben.

Das erste Dateisystem, das unter Linux benutzt wurde, ist das Minix-Dateisystem. Es war auf Disketten zugeschnitten und wird heute in der Regel auch nur noch dafür verwendet. Als Standarddateisystem wird heute das Second Extended File System (von Rémy Card) verwendet. Es ist sehr leistungsfähig und hat seinen Vorgänger, das Extended File System, abgelöst.

Ein Dateisystem unter Linux ist eine Einheit, die aus folgenden Teilen besteht:

Der Bootsektor wird nur benötigt, wenn tatsächlich von dieser Platte ein Bootvorgang gestartet werden soll. Er ist aber immer als Teil der Einheit vorhanden. Der Superblock enthält die generellen Parameter des Dateisystems, die inodes enthalten Informationen der Dateien. Die Daten selbst finden sich dann in den Datenblöcken.

Dabei ist zu beachten, daß "Block" mit den "Sektoren" einer Platte nichts zu tun hat.

Das EXT2-Dateisystem hat diese Struktur weiterentwickelt. Um die Betriebssicherheit zu erhöhen, wurde etwas mehr Redundanz hinzugefügt. So besteht ein EXT2-Dateisystem aus zwei Komponenten:

Die Blockgruppen wiederum sind aufgeteilt in: Dadurch enthält jede Blockgruppe die für dieses Dateisystem wichtigen Informationen in Kopie. Ein beschädigter Superblock, sonst eine sehr unangenehme Situation, kann so relativ leicht wiederhergestellt werden. Nebenbei werden auch Zugriffszeiten kleiner, weil der Abstand zwischen inodes und Dateien geringer wird.

Innenansicht

Dateien haben viele verschiedene Eigenschaften; so muß klar sein, wer der Besitzer der Datei ist, wann das letzte Mal darauf zugegriffen wurde, den Typ, die Größe, und so weiter. Diese Informationen werden im inode (index node) abgelegt. Der inode ist der zentrale Punkt im Dateisystem der Unix-Familie. Inodes stehen auf der Platte und sind statisch. Man muß also dafür sorgen, daß genügend inodes in geeigneter Konfiguration zur Verfügung stehen. Zur Bearbeitung werden diese Daten vom Kern gelesen und stehen dann im Speicher zur Verfügung. Diese Instanz der inodes enthält weitere zur aktuellen Bearbeitung notwendige Parameter.

Zugriffsrechte

In einem Mehrbenutzersystem muß eine Methode gefunden werden, die es erlaubt, Zugriffsberechtigungen differenziert zu vergeben. In Betriebssystemen der Unix-Familie hat man drei Klassen eingeführt:

Mit Benutzer ist die Person gemeint, der die Datei gehört. Das muß nicht bedeuten, daß die Datei auch von demselben Benutzer angelegt worden ist. Eine Gruppe ist eine irgendwie willkürlich definierte Anzahl von Benutzern, die zu einem Projekt, einer Arbeitsgruppe oder irgendeiner anderen Anhäufung von Leuten von Leuten gehören, welche zusammen auf einen gemeinsamen Datenbestand oder dieselben Programme zugreifen muß. Und Welt? Nun ja, das ist der ganze Rest, der es irgendwie schafft, an die Dateien heranzukommen.

Die Verteilung der Rechte kann man zum Beispiel an den Einträgen des Verzeichnisses ablesen, in dem die Datei liegt. Die Rechte werden mit zehn Zeichen dargestellt. Davon ist das erste Zeichen zuständig für den Typ, die restlichen neun Zeichen werden in drei Abschnitte zu je drei Zeichen eingeteilt, die in dieser Reihenfolge für die Rechte des Benutzers (user), der Gruppe (group) und den rest der Welt (world) gelten. Jeder Abschnitt ist wieder in drei Spalten eingeteilt: Leserechte ("r", read), Schreibrechte ("w", write) und Ausführungsrechte ("x", execute). Ein "-" steht dabei für "verboten", der jeweilige Buchstabe für die Zuteilung des entsprechenden Rechts.

-rw------- 1 meier users 1211 Mar 31 12:06 Abrechnung
-rw-r----- 1 meier users 10055 Mar 10 01:09 Notiz
-rw-r--r-- 1 meier users 1127 Mar 1 14:30 message
drwxr-xr-x 2 meier users 2048 May 2 21:17 Privat

In der Abbildung sieht man einen Auszug aus einem Verzeichnis des Benutzers meier, der zur Gruppe users gehört. Es enthält drei Dateien (Abrechnung, Notiz und message) und ein Unterverzeichnis (Privat). Abrechnung ist nur für den Benutzer lesbar und beschreibbar, Gruppe und Welt haben keinerlei Zugriff. Notiz ist ebenfalls für den Benutzer les- und beschreibbar, die Gruppe users hat nur Leserechte, der Rest der Welt gar keine Rechte. Die Datei message hingegen kann vom Benutzer gelesen und verändert werden, Gruppe und Welt haben jeweils Leserecht. Der vierte Eintrag ist ein Unterverzeichnis (ein "d" in der ersten Spalte), das vom Benutzer gelesen, beschrieben und geöffnet werden kann, der Rest der Welt hat zwar Leserecht und darf öffnen, aber nicht hineinschreiben.

Es gibt noch einen Benutzer, der keinerlei Beschränkungen unterworfen ist und der das Ziel aller ist, die keinen oder nur beschränkten Zugang zu einem System haben: der Superuser. Sein Name ist root und er darf alles. Es gibt im Betriebssystem nichts, was verhindern könnte, daß er etwas lesen, schreiben oder löschen darf. Nur Verschlüsselung hilft gegen eventuelle Neugier eines Superusers. Er hat soviel Macht, daß er sich sogar selbst den Zugang ins System versperren kann. Nur: dann kommt auch er nicht mehr hinein. Vorgänge, die unter dem Benutzer root laufen, sollten also sehr, sehr vorsichtig durchgeführt werden.

Inodes

Ein inode enthält folgende Daten:

Während der Bearbeitung im Speicher werden zusätzlich folgende Parameter benutzt: Bei der Installation von Linux kann man bei einigen Distributionen (zum Beispiel S.u.S.E.) die Dichte der inodes einstellen. Einfach gesagt, kann man damit entscheiden, wieviel Plattenplatz man verschwenden wird. Die Dichte gibt an, wie groß Dateien auf einer Partition durchschnittlich werden. Die Kapazität der Plate wird durch den Dichte-Wert geteilt, als Ergebnis erhält man die verfügbare Anzahl der inodes. Dadurch ergibt sich eine durchschnittliche Dateigröße, die andeutet, mit welchen Dateigrößen man die Platte optimal füllen kann. Weichen die tatsächlich benutzten Dateigrößen von diesem theoretischen Durchschnittswert ab, wird Plattenplatz verschwendet. Werden durchweg größere Dateien verwendet, so ist der vorbereitete Platz für die inodes verschwendet; legt man durchweg kleinere Dateien an, gehen irgendwann die inodes aus, und man kann dann keine Datei mehr anlegen, obwohl noch Platz auf der Platte vorhanden ist. Die Kunst ist also, vorauszusehen, welche überwiegende Dateigröße man in einem Dateisystem verwenden wird, um die Platte optimal auszunutzen, also weder zu viele inodes zu reservieren, noch Platz für Dateien zu verschwenden.

Da die Größe von inodes statisch ist, ergibt sich das Problem, wie man möglichst große Dateien mit möglichst kleinen inodes erreichen kann. Eine direkte Referenzierung der belegten Plattenblöcke geriete zu schnell an Grenzen, nur kleine Dateien wären überhaupt möglich. Das ist nicht akzeptabel. Andrerseits kann man die inodes auch nicht beliebig groß machen, denn die meisten Dateien in einem Unix-Dateisystem sind tatsächlich recht klein (unter 10 kB) und der Plattenplatz soll ja hauptsächlich für Dateien, nicht für Verzeichniseinträge genutzt werden können. Deswegen wird der erste Teil der von der Datei belegten Plattenblöcke direkt, der nächste Teil indirekt (einfach indirekt), ein weiterer indirekt indirekt (doppelt indirekt) und der Rest dreifach indirekt referenziert. Bei einer Plattenblockgröße von 1 kB und 256 möglichen Blöcken pro Indirektblock können so 16 GB pro Datei adressiert werden.

Außenansicht

Während bei einer DOS-FAT nur eine Tabelle arbeitet, werden bei einem Unix-Dateisystem mehrere Tabellen mit unterschiedlichen Aufgaben benutzt. Das hilft, eventuell auftretende Fehler besser abzudämpfen.

Superblock

Die Eigenschaften des Dateisystems sind im Superblock zusammengefaßt. Für jedes Dateisystem existiert ein Superblock. Er enthält folgende Daten:

Für die Bearbeitung sind während des Aufenthaltes im Speicher noch weitere Parameter vorhanden: Ein- und Ausgabegeräte

Zur Eingabe und Ausgabe werden zwei Kategorien benutzt, die praktisch alle Problemstellungen in diesem Bereich erschlagen. Die erste Kategorie sind die Blockdevices. Solche Geräte erwarten und verwalten Daten in Blöcken gleicher Größe. Typischerweise geschieht der Zugriff auf solche Geräte mit wahlfreiem Zugriff (random access), auf die Datenblöcke kann also unabhängig voneinander zugegriffen werden. Beispielsweise werden Platten in der Regel als Blockdevices angesehen.

Der zweite Typ sind Characterdevices. Daten werden diesen Geräten als Datenstrom angeboten und von diesen auch als ebensolche geliefert. Es gibt keine Struktur, nur eine Kette von Zeichen. Der Zugriff geschieht sequentiell (sequential access). Typischerweise sind Terminals, Drucker und manche Netzschnittstellen als Characterdevices ausgelegt.

Wie man leicht einsieht, ist diese Kategorisierung nicht nur unvollständig, sondern auch unscharf. Denn es hängt nur von der bevorzugten Sichtweise ab, wie man zum Beispiel eine Platte oder ein Band implementiert. Die Bewegungen des Schreib-Lesekopfes der Platte können ohne Schwierigkeiten auf die Spulvorgänge des Bandlaufwerkes abgebildet werden. Vielleicht dauert der Zugriff beim Bandlaufwerk etwas länger; das ist allerdings keine prinzipielle Hürde. Beide können sowohl als Blockdevice als auch als Characterdevice installiert werden; alleine die gewünschte Funktionalität entscheidet, als was das Gerät sich darstellen soll. Unvollständig deswegen, weil es Geräte gibt, die in keine der beiden Kategorien passen. Das wohl bekannteste Beispiel für solche Geräte sind Systemuhren. Trotzdem ist das Konzept vorteilhaft, denn für das Betriebssystem ist diese Sichtweise bequem. Es muß sich nicht mit den sehr unterschiedlichen Eigenschaften der Geräte hermuschlagen, es kann das Gerät einfach als Datei betrachten. Den Rest erledigt ein Gerätetreiber (device driver).

Alle diese Spezialdateien findet man üblicherweise im Verzeichnis /etc. Auffällig daran, wenn man sich die Liste anzeigen läßt, sind die zusätzlichen Einträge, die aus zwei Zahlen bestehen. Das sind die major number und die minor number. Die major number gibt die Geräteklasse an, zu der das durch die Spezialdatei beschriebene Datei gehört, zum Beispiel Festplatte, ISDN-Karte oder Floppylaufwerk. Alle Geräte, die zu einer solchen Klasse gehören, besitzen also dieselbe major number und deswegen auch Zugriff auf denselben Gerätetreiber. Die minor number hingegegen identifiziert ein bestimmtes Gerät aus dieser Klasse, jedes Gerät einer Klasse besitzt also eine andere minor number. Die minor number wird dem entsprechenden Gerätetreiber als Parameter geliefert.

Swap

Da der Arbeitsspeicher oft nicht ausreicht, um alle Prozesse gleichzeitig im Speicher zu behalten, muß der Teil, der gerade nicht bearbeitet wird, auf einen speziellen Plattenbereich ausgelagert werden. Dieser Plattenbereich ist der Swap-Bereich.

Beim Partitionieren der Platte entsteht die Frage, wie groß der Swap-Bereich werden soll, um das System effizient arbeiten zu lassen. Die Meinungen gehen in diesem Bereich etwas auseinander. So empfiehlt eine Seite, den Swap-Bereich in einer Größe zwischen 64 und 96 MB einzurichten, andere empfehlen eine Größe des zwei- bis vierfachen Arbeitsspeichers. Dabei muß beachtet werden, daß eine Swap-Partition unter Linux maximal 128 MB groß werden kann. (4096 - 10) * 8 * 4096 = 133890048 bytes = 130752 blocks = 127.6875 Mb. Benötigt man mehr, so kann man mehrere solcher Partitionen einrichten (maximal 16). Die Manpages von mkswap empfehlen andere Größen:

Linux VFS

Zwar benutzte Linux am Anfang das Minix-Dateisystem als Entwicklungsumgebung; aber dieses Dateisystem ist ziemlich beschränkt in seiner Leistungsfähigkeit. Um die Umstellung auf andere Dateisysteme leichter zu gestalten, wurde eine Zwischenschicht entwickelt, das Virtual Filesystem (VFS).

Dieses bietet eine einheitliche Schnittstelle für Systemaufrufe ins Dateisystem und kann dann jeweils den Übergang zu einem realen Dateisystem anbieten. Systemaufrufe von Prozessen werden vom Kern an das VFS weitergeleitet. Dieses wiederum ruft seinerseits den richtigen Systemaufruf des realen Dateisystems, was nun seinerseits die Kontrolle übernimmt.

Das VFS definiert einen Satz Funktionen, die jedes Dateisystem benutzt. Diese Schnittstelle besteht aus einem Satz Operationen, die zu drei Arten von Objekten gehören: Dateisysteme, i-nodes und geöffnete Dateien. Das VFS kennt dabei die Dateisysteme, die im Kern unterstützt werden. Es benutzt hierfür eine Tabelle, die während der Kernkonfiguration definiert wird. Jeder Eintrag in dieser Tabelle beschreibt ein spezifisches Dateisystem, während der mount-Operation wird, kommt die passende Funktion zum Einsatz. Später werden alle realen Aufrufe über diese Tabelle geregelt.

Prozesse

Der Begriff des Prozesses ist zentral in modernen Betriebssystemen. Er unterscheidet sich relevant von dem des Programms. Während ein Programm einfach die Liste aller Befehle ist, die zum Beispiel auf einer Platte gespeichert liegt, ist, vereinfacht gesagt, ein Prozeß eine reale Instanz eines Programms, also das Programm in tatsächlicher Ausführung. Von einem Programm kann es zu jedem Zeitpunkt mehrere Prozesse im Speicher geben, die unterschiedliche Datenbestände bearbeiten.

Da auf einer Ein-Prozessormaschine natürlich auch stets nur eine Befehlssequenz zur Zeit abgearbeitet werden kann, dem Benutzer aber die Möglichkeit gegeben werden soll, mehr als einen Prozeß zur selben Zeit in Ausführung zu halten, muß das Betriebssystem dafür sorgen, daß der gerade angeforderte Prozeß auch zur Ausführung kommt, also zwischen den einzelnen Prozessen hin- und hergeschaltet wird. Das wird multiprogramming genannt, manchmal auch Pseudoparallelismus. Schwieriger wird es, wenn tatsächlich mehr als eine CPU vorhanden sind; dann steht tatsächlich Parallelverarbeitung zur Verfügung, was vom Betriebssystem noch mehr verlangt. Wir betrachten hier allerdings nur Maschinen mit einer CPU.

Zu jedem Prozeß gehören außer dem auszuführenden Programm noch weitere Daten, wie zum Beispiel der Programmzähler, der Zustand der benutzten Register und weitere Variablen. Bei dem Wechsel von einem Prozeß A zu einem Prozeß B (der pro Sekunde mehrmals stattfinden kann), muß der zu Prozeß A gehörende Satz von Parametern bis zum nächsten Ausführungszyklus gerettet werden. Dabei sind alle ablaufenden Prozesse gegenseitig voreinander geschützt und können nur jeweils auf ihre Datenbestände zugreifen. Ist eine Kommunikation zwischen zwei Prozessen doch notwendig, so kann diese über definierte Systemaufrufe stattfinden und vom Kern kontrolliert werden.

Um neue Prozesse zu kreieren, wird der Systemaufruf fork benutzt. Es ist die einzige Möglichkeit dies zu tun. Neu erzeugte Prozesse heißen Sohnprozeß oder Sohn, der erzeugende Prozeß heißt Vaterprozeß oder Vater. Wem das zu sexistisch klingt, mag Vater gegen Mutter und Sohn gegen Tochter austauschen. Das Prinzip bleibt dabei erhalten.

Beim fork-Systemaufruf wird eine exakte Kopie des erzeugenden Prozesses hergestellt. Danach allerdings sind beide Prozesse voneinander unabhängig und müssen getrennt voneinander betrachtet werden. In der Regel wird der neu erzeugte Prozeß andere Aufgaben erhalten und so auch einen anderen Inhalt bekommen müssen. Diesen kann man dem neuen Prozeß mit dem exec-Systemaufruf (den es in mehreren Varianten gibt) mitteilen. Mit exec wird dem neuen Prozeß mitgeteilt, in welcher Datei sich der neue Code befindet. Er wird gelesen, eingerichtet und ausgeführt. Ab jetzt ist der neu erzeugte Prozeß nicht nur selbständig, er arbeitet auch seine neue Aufgabe ab.

Prozesse erhalten Nummern, die Prozeßnummern (pid), mit denen sie indentifizierbar werden. Diese Prozeßnummer wird willkürlich vergeben, sie wird nur während einer aktuellen Ausführung mit dem Prozeß assoziiert, ist der Prozeß beendet, verliert auch die Bindung an diese bestimmte Prozeßnummer ihre Gültigkeit. Die zu jedem Prozeß gehörenden Parameter werden in eine Prozeßtabelle eingetragen und stehen dort dem System zur Verfügung.

Irgendwo muß der Vorgang der Prozeßerzeugung einmal initiiert werden, und das geschieht beim Starten des Betriebssystems erzwungenermaßen. Hierbei wird ein Prozeß mit der Prozeßnummer 0 gestartet, der seinerseits einen Prozeß mit der Prozeßnummer 1 erzeugt (fork). Prozeß 0 wird swapper genannt, Prozeß 1 heißt init.

Prozesse können während der Abarbeitung verschiedene Zustände einnehmen. Vereinfacht ausgedrückt können sie drei Zustände einnehmen:

Ein Prozeß in Ausführung ist der Prozeß, von dem ein Teil des Codes tatsächlich gerade von der CPU abgearbeitet wird. Blockiert ist ein Prozeß dann, wenn er nicht ausgeführt werden kann, weil auf irgendein externes Ereignis gewartet werden muß. Bereit ist ein Prozeß, wenn er zwar ausführbar wäre, aber zur Zeit warten muß, weil ein anderer Prozeß abgearbeitet wird.

Die Strukturen von Hard- und Software bilden oftmals gesellschaftliche Strukturen ab, und so verwundert es nicht, daß es eine Instanz gibt, die zur Koordinierung der Prozesse eingerichtet wurde. Da Prozesse (wenn dieses Bild erlaubt ist) egoistische Entitäten sind - jeder will selbst so schnell wie möglich fertig werden und beansprucht deswegen alle Systemressourcen erstmal für sich - gibt es den Scheduler. Er entscheidet, welcher Prozeß wann ein Zeitfenster erhält und welche Systemressourcen er dann in Anspruch nehmen darf. Zur Verfahrensweise von Schedulern gibt es reichhaltige Literatur.



[work in progress]