Zusatzübungen
Welche Vorteile hat bei Betriebssystemen die Betriebsart Multi-Tasking gegenüber Single-Tasking?
Die Vorteile der Betriebsart Multitasking liegt bereits im Namen selbst. Im Gegensatz zu Single-Tasking, ist die Maschine in der Lage, mehrere Programme gleichzeitig auszuführen. Das Betriebssystem Windows NT und seine Nachfolger, sowie Linux sind Multitask-Betriebssysteme. DOS hingegen ein Single-Task Betriebssystem.
Der Hauptvorteil des Multitasking für den Benutzer liegt in dem Aspekt, verschiedene Programme nacheinander starten zu können, wobei zwischen diesen Programmen hin- und hergewechselt werden kann, ohne dieses zu beenden. Damit kann beispielsweise ein Texteditor gestartet werden und ein Webbrowser mit einem Musikstreamingdienst simfy, ohne dass ein Prozess für den Benutzer unterbrochen werden muss. (bzw. beendet werden muss.) Natürlich ist ein Prozessor nur in der Lage ein einziges Programm gleichzeitg abzuarbeiten (Von-Neumann-Architektur). Durch geschickte Prozessunterbrechungen, Scheduling, usw. und mithilfe von zusätzlichen Prozessorregistern (vgl. 8086 mit 80386) entsteht dem Benutzer der Eindruck von Gleichzeitigkeit. In Wirklichkeit wird in einer sehr hohen Geschwindigkeit ständig ein Prozess gestoppt, schlafen gelegt und gewechselt, entsprechend wieder auferweckt und so weiter, womit das System nach und nach seine Arbeitsaufträge abarbeitet.
Single-Tasking hingehen ist beispielsweise ein klassisches DOS. Das Disc Operating System, von verschiedenen Herstellern auf den Markt gebracht, kann nur ein Programm starten. Dieses arbeitet, zum Beispiel ein Texteditor. Möchte der Benutzer nun eine Tabelle öffnen, so muss er den Texteditor beenden, bevor das Tabellenalkulationsprogramm gestartet werden kann.
*
Welche UNIX-Rechte schlagen Sie für folgende Dateien vor und wie sieht deren binäre Codierung aus:
Das Programm “date” ist unter Linux/UNIX einem Besitzer und einer Gruppe zugeordnet. Damit das “date-Kommando” korrekt arbeiten kann, muss der Benutzer das Recht haben, das Programm ausführen zu dürfen. Dazu muss das “Execute Flag” entsprechend in den Rechten der Datei so gesetzt sein, dass entweder Gruppe oder Benutzer einen Match ergeben, worauf das System ausführenden Zugriff auf die Datei gewährt. Der Besitzer der Datei ist oft root, also der Systemadministrator des Systems. Der Admin, als “Systemgott” vergibt sich selbst alle Rechte und der Gruppe und den Gästen möglichst wenig. Rechte lassen sich mit CHMOD anpassen.
Ein “chmod 755 date” stellt sinnvolle Rechte für “date” zusammen. Der Besitzer darf lesen, schreiben und ausführen, die Gruppe darf lesen und ausführen und Gäste, bzw. andere ebenso. Es ist auch möglich mit chmod 711 die Rechte der Gruppe und des Gastes so zu setzen, dass es nur Ausführen kann. “date” funktioniert, lässt sich ausführen. Die Datei lässt sich dann allerdings nicht mehr mit einem Gruppen oder Gastbenutzer mit cp kopieren.
- Kommando zum Lesen der Uhrzeit
Das Kommando “date” kann verwendet werden, um die Uhrzeit des Systems auf der Konsole anzuzeigen. Das “date-Kommando” funktioniert unter Linux und UNIX Umgebungen. Unter Windows (cmd) funktioniert “date” ebenfalls, es zeigt die aktuelle Uhrzeit an und fragt anschließend nach dem neuen Datum. Unter Linux und UNIX handelt es sich bei “date” um ein kleinen Programm. Dies befindet sich im /bin Verzeichnis.
- Kommando zum Stellen der Uhrzeit
Das Kommando “date -s 13:37″ stellt die Uhrzeit des Linux/UNIX Systems um. Das Parameter -s steht hierbei für SET. Genaue Informationen finden sich auf der man-page des Kommandos “date” (man date).
- Lesen und Schreiben von Projektdateien
Das Recht für das Lesen und Schreiben einer Datei kann mit “chmod 660 Projektdateiname.extention” gesetzt werden. Damit kann diese Datei unter Linux/UNIX nicht mehr als ausführbare Datei ausgeführt werden. Die erste Zahl des “chmod Kommandos” ist der Besitzer, als derjenige der sich einloggt, etwas ausarbeitet und die Datei speichert. Die zweite Zahl ist die Gruppe. Mit chgrp kann die Gruppe entsprechend eingestellt werden. Das ist genauso wichtig, die das Setzen der Rechte. Alle Benutzer, die in dieser Gruppe sein, haben das Recht, das zu tun, was in der Mitte mit dieser “Zahl” definiert wurde, hier 6 für Lesen und Schreiben. Die letzte Zahl stellt die Rechte der anderen Benutzer dar, also ein Gast oder ein Benutzer, der nicht Besitzer oder Gruppenmitglied ist, der Gruppe die für diese Datei eingestellt wurde. Daher bezeichnet man gerne die letzte Zahl auch als Recht others.
- Lesen und Schreiben privater Textdateien
Private Dateien beinhalten nicht immer Informationen, die für die breite Öffentlichkeit gedacht sind. Aus diesem Grund darf niemand aus der Mehrbenutzergruppe und Gäste auf diese Datei zugreifen. Aus diesem Grund sollte der Besitzer mit chmod 600 dateiname.ext das Recht so setzen, dass nur er auf diese Datei zugreifen kann. Natürlich gibt es neugierige Sysadmins. root darf immer alles. Um root daran zu hindern, geheime Informationen abzurufen, muss die Datei verschlüsselt werden. Das crypt Kommando hilft. Dieses verschlüsselt unter UNIX, wie Solaris die Datei mit einen DES Verfahren. Unter Linux muss es unter Umständen nachinstalliert werden. DES gilt als gebrochen, allerdings dauert das Sägen an dem “Schloss” dennoch etwas, auch heute noch.
Binäre Darstellung der Bits von chmod
********* --> rwx rwx rwx
chmod 755 --> 111 101 101
chmod 600 --> 110 000 000
chmod 711 --> 111 001 001
chmod interpretiert die Zahlen nicht als Dezimalzahlen, sondern als oktdezimale Zahlen.
*
Wir gehen davon aus, dass der Kommando-Interpreter bash-Shell (Unix) in folgendem Verzeichnisbaum verwendet wird.
Mit welchen Kommandos können Sie:
- Das aktuelle Verzeichnis auf den Pfad c (Laufwerk) => 0_verz (Verzeichnis in Ebene 0, oberstes Verzeichnis) => 1_2_verz (Verzeichnis in Ebene 1) => 2_1_verz (Verzeichnis in Ebene 2) setzen
Das Kommando cd wechselt zwischen Verzeichnissen, cd bedeutet change directory. Mit pwd kann der Benutzer ausgeben, wo im Verzeichbaum er sich befindet. Kennt der Benutzer den Baum recht gut, so kann er sein Zielverzeichnis direkt anwählen. Mit cd /0_verz würde der Benutzer in das oberste Verzeichnis springen. Hier wird davon ausgegangen, dass die Struktur direkt in das Wurzelverzeichnis / angelegt wurde. Der Benutzer kann auch mit cd .. in das darüberliegende Verzeichnis wechseln. Das wird solange wiederholt, bis entweder das gewünschte obere Verzeichnis erreicht wurde oder / erreicht worden ist. Verzeichnisse sind unter Unix in einem großen Baum angeordnet und nicht, wie in Windows in Laufwerke unterteilt.
- Im aktuellen Verzeichnis alle Dateien mit der Endung .o auflisten
Um im aktuellen Verzeichnis alle Dateien mit der Endung .o aufzulisten, eignet sind das ls Kommando. Mit ls ./*.o würden alle Dateien mit der Endung .o angezeigt werden. ./ verweist immer auf das aktuelle Verzeichnis. Das kann auch weggelassen werden. Dann ergibt sich ls *.o. Möchte der Benutzer nicht nur Dateinamen sehen, sondern vielleicht auch Größe und Rechte, so lautet der Befehl ls -l *.o oder ls -l ./*.o.
- Eine in 2_1_verz vorhandene Datei beispiel.txt nach 1_2_verz verschieben
Verschieben funktioniert unter Linux/UNIX mit dem mv Befehl. Dieser steht als Abkürzung für Move. Die manpage zu mv verrät Details. Um eine Datei von 2_1_verz nach 1_2_verz zu verschieben, muss der Benutzer entweder den kompletten Pfad kennen oder wissen, dass sich in diesem Falle das Verzeichnis 1_2_verz über dem Verzeichnis 2_1_verz befindet. Mit mv ./beispiel.txt ../beispiel.txt wird eine Datei aus dem aktuellen Verzeichnis, in das nächst höchere verschoben. Oder mit mv /0_verz/1_2_verz/2_1_verz/beipsiel.txt /0_verz/1_2_verz/beipsiel.txt.
*
In einem UNIX-System sei mit umask das beim Erstellen neuer Dateien wirksame Filter auf 022 (oktal) gesetzt. Mit welchen Rechten erscheint dann die neu angelegte Datei new_file? Wer ist Eigentümer der neuen Datei? Auf welche Werte und mit welchen Mitteln sind die Rechte an new_file zu setzen, wenn der Eigentümer alle Recht erhalten soll und alle anderen Teilnehmer keine Rechte daran erhalten sollen?
umask ist ein Kommando für das Abrufen und Setzen der File Creation Mode Mask. Zu deutsch heißt das soviel wie das Standardrecht einer Datei. Der Begriff umask setzt sich aus der ausgeschriebenen Schreibweise User Mask zusammen. Wie der Begriff schon verrät handelt es sich um eine Maske, nicht um eine direkte Zuweisung. Diese Maske wird also etwas sozusagen “filtern”. umask 022 ist eine Art Standardeinstellung unter Linux/UNIX. Legt der Benutzer mit touch eine neue Datei an so wird er feststellen, dass sich die Rechte (rw- r– r–) bei der neuen Datei ergeben. Dies kommt so zustande, dass eine neue Datei mit 666 (s. chmod), als (110 110 110 = rw- rw- rw-) angelegt werden soll. Bevor das aber stattfindet, eine Art Sicherheitsmerkmal aus der UNIX Welt, greift nun die User Mask, also umask. umask zieht von diesem 666o den Wert 022o ab. Natürlich handelt es sich im oktdezimale Zahlen. Also 666o – 022o = 644o. Somit wird chmod 644 automatisch gesetzt. Das gilt für Dateien. Bei Verzeichnissen wird das mit 777 gemacht, weil ein Verzeichnis ausführbar sein muss, damit UNIX/Linux auch es öffnen mag. Also bei Verzeichnissen 777o – 022o = 755o (rwx r-x r-x).
Nehme man an, der Benutzer hat sich als mustermann eingeloggt, also sein Username ist mustermann. whoami liefert den aktuell eingeloggten Usernamen. Legt der Benutzer mit touch meinedatei.txt eine neue Datei mit dem entsprechenden Namen an, so greift einmal die umask Einstellung und zugleich die Zuordnung der Usernummer aus der passwd. Jeder Benutzer wird unter einer Nummer geführt. Angenommen, mustermann wird als UID 1337 geführt, so wird diese Zahl, diesmal eine dezimale Zahl, als Besitzerinformation in das Filesystem geschrieben. In ls -l erscheint natürlich mustermann linkstendierend in der Auflistung, da Linux/UNIX über die passwd entsprechend statt der UID den Username anzeigt. Folgend nach dem username ist die GruppenID, die GID. Diese wird in der Datei groups geführt und entsprechend ebenso eingetragen. Diese Zahl wird bestimmt, durch die passwd, da dort hinterlegt ist, in welche Gruppe sich der Benutzer befindet. Meist wird bei einigen Linux Distributionen zum Benutzernamen eine gleichnamige Gruppe angelegt. Das bedeutet in ls -l wird mustermann in der Mitte zweimal stehen. Das ist links der Username und rechts die Gruppe.
Zusammengenommen:
mustermann@hostname$ umask 022
mustermann@hostname$ touch meinedatei.txt
mustermann@hostname$ ls -l meinedatei.txt
total 0
-rw-r--r-- 1 mustermann mustermann 0 2011-10-22 23:42 meinedatei.txt
Sollen nun andere Benutzer keine Rechte auf diese Datei erhalten, so muss mit chmod nachgebessert werden.
mustermann@hostname$ chmod 600 meinedatei.txt
mustermann@hostname$ ls -l meinedatei.txt
total 0
-rw------- 1 mustermann mustermann 0 2011-10-22 23:42 meinedatei.txt
Solange sich nur der Benutzer mustermann in der gleichnamigen Gruppe befindet, könnte auch 660 verwendet werden, dass ist allerdings nicht ratsam, weil der Benutzer auf Mehrbenutzersystemen meist nicht alleine in einer Gruppe ist.
*
Mit welchen Befehlen können Sie in einer UNIX-Shell
- Die laufenden Prozesse mit Name, Identitätsnummer sowie ggf. weiteren Informationen auflisten
Das Kommando ps listet einen Snapshot aller Prozesse auf. ps kommt durch den Namen Process Snapshot zustande. ps hat viele Parameter, wo “man ps” hilft. Das Kommando ps -aux listet alle laufenden Prozesse mit vielerlei Informationen als Tabelle auf. aux ist in diesem Fall ein zusammengesetztes Parameter. Das bedeutet, dass das “a” das “u” und das “x” eigentlich jeweils für sich alleine stehen und eine eigene Bedeutung haben. “a” steht für die Auswahl aller Prozesse ausgenommen die Sessions von anderen Zugriffspunkten, die nicht mit dem Terminal assoziiert sind. Auf besonderen Computern kann es sein, dass eine solche Liste telefonbücherähnliche Ausmaße annimmt. Lässt der Benutzer das Parameter “a” weg, so werden nur seine Prozesse aufgelistet. Das “u” bedeutet, das ps die Benutzer, die den Prozess gestartet haben mit in der Liste aufgeführt werden. Das “x” löst die Restriktion, dass der Prozess in einem Terminal arbeiten muss. Somit tauchen auch interne Systemprozesse auf, die durch den kernel erzeugt worden sind.
- Den Prozess mit der Identitätsnummer 4711 stoppt (beendet)?
Das Kommando kill kann einem Prozess ein entsprechendes Signal geben.
Der Prozess selbst wird vom Betriebssystem letztendlich vom kernel verwaltet. Der Begriff kernel kommt ursprünglich aus dem Bereich des Militärs, wo der Cornel der Mann mit dem Zepter in der Hand ist. Da um den Kern an sich mehrere Schalen existieren, daher Begriffe wie Ring 0, 1,…, kamen die Programmierer in Richtung des Begriffes kernel, da dies Nußkern bedeutet. Zusätzlich eine kleines Wortspiel zum Cornel. Wiederum bildet das eine Beziehung zum Begriff core, das hiermit der Kern selbst gemeint ist, also das Innerste des kernels. Daher existieren bei Abstürzen unter UNIXs sog. Core Files.
Das kill Kommando sendet ein Signal an das Betriebssystem, bzw. an den Prozess (standardmäßig SIGTERM). Es gibt 31 Signale, die mit kill abgefeuert werden können. kill muss nicht umbedingt die Vernichtung eines Prozesses bedeuten. Der Begriff ist irreführend. kill kommt aus UNIX System 4. Hier gab es noch keine Signale. Heute handelt es sich bei kill um eine sog. Interprozesskommunikation. Das heißt, dass mit kill einem Prozess auch “etwas mitgeteilt” werden kann. Der Benutzer hat einen spezifischen Grund “kill” auszuführen. Die Art und Weise des Signals, also des “Wie” wird kill direkt mit einem Parameter mitgeteilt. Reagiert ein Task nicht, also ein Programm, welches eingefroren ist, kann der Benutzer versuchen das Programm zum Beenden zu bewegen. Das würde mit sigterm geschehen. Würde hier der Task, also das Programm nicht mehr reagieren, so kann mit sigkill ein Beendigung erzwungen werden. Sigkill mit der Nummer 9 ist sozusagen, die UNIX spezifische Prozessbrechstange. Sie nimmt keine Rücksicht auf zu speichernde Daten und sie wird immer ausgeführt, da hier nicht der Prozess, sondern das Betriebssystem direkt agiert. Mit Sigterm würde der Prozess noch schnell zum Ende kommen und sich dann “verabschieden”. Es ist sinnvoll hier und da vorerst rücksichtsvoller Prozesse zum Beenden zu bewegen, als sie aus dem Speicher zu kicken.
mustermann@hostname$ kill -9 4711
Tötet, ob 4711 will oder nicht, unverzüglich diesen Prozess.
mustermann@hostname$ kill -15 4711
Sendet ein Terminierungssignal über Interprozesskommunikation an den Task. Dieser soll sich sofort beenden. Der Task wird, wenn er nicht eingefroren ist, seine letzte Aufgabe durchführen und sich beenden. Vorteilhaft, weil er seine Aufgabe noch komplett durchführt (File Handles schließt und Cache flushed….)