Aufgaben eines Betriebssystems
In dieser Lerneinheit beschäftigen wir uns damit, was ein Betriebssystem so tut. Warum hat eigentlich jeder (mindestens) eins auf seinem Rechner? Braucht man das wirklich? Welche Betriebssysteme gibt es überhaupt? Welche Geräte haben ein Betriebssystem?
Um alles besser zu verstehen ist es wichtig zu wissen, welche Hardware es gibt und wie sie grob funktioniert. Hier findet ihr eine Selbstlerneinheit zu diesem Thema und könnt euch vorab informieren.
Ich hoffe, dass am Ende dieser Selbstlerneinheit all eure (und meine) Fragen beantwortet sind und ihr auf die Frage "Was macht eigentlich ein Betriebssystem?" eine gute Antwort parat habt.
Des Weiteren möchte ich erwähnen, dass in dieser Selbstlerneinheit viele Popups verwendet werden. Der Zweck dieser Popups ist, dass ihr etwas Zeit zum nachdenken habt und nicht aus Versehen vorlesen könnt.
Betriebssysteme und Ich
Welches Betriebssystem habe ich?
Das lässt sich relativ zuverlässig und fix über diese Seite herausfinden: www.wieistmeineip.de (Funktioniert auch mit Smartphones)
Versucht es einfach mal mit allen Geräten die eine Internetverbindung herstellen können.
Gängige Betriebssysteme für DesktopPC's und Server:
- Diverse Windows Versionen (XP, Vista, 7, 8)
- Diverse Linux Distributionen (Ubuntu, Debian, openSUSE, Knoppix, Fedora, etc.)
- Diverse Mac OS X Versionen
Gängige Betriebssysteme für Smartphones/Tablets:
- Android
- Apple iOS
- Windows Phone 8
Hier noch eine schön ausführliche Liste von Betriebssystemen: Liste(wikipedia)
Es gibt auch noch andere Geräte, die Betriebssysteme verwenden und bisher noch nicht erwähnt wurden: z.B. in (HighTech-)Kaffeemaschinen, Autos, etc.
Was tut ein Betriebssystem, das ich sofort bemerken kann?
- Beim Hochfahren wird das Betriebssystem "gebootet", ggf. sieht man einen Ladebildschirm (z.B. mit dem Windows Logo).
- Danach sieht man (heutzutage) bei vielen Betriebssystemen seinen Desktop, d.h. eine Grafische Nutzeroberfläche (GUI).
- Auf diesem Desktop liegen allerhand Verknüpfungen, Dateien oder sonstiger Kram.
- Manche Betriebssysteme (z.B. neuere Windows-Versionen) aktualisieren sich auch "automatisch" oder teilen dem User mit, dass neue Updates(Aktualisierungen) verfügbar sind, um beispielsweise Sicherheitslücken zu schließen oder neue Funktionen bereitzustellen.
Betriebssysteme: Stammbäume
Unix - Vater von vielen: [Unix_History]
Linux - Kleiner Pinguin mit vielen Freunden: [Linux_distro_timeline]
Windows-Stammbaum: [Windows_Stammbaum]
Anfänge der Digitalcomputer und der Betriebssysteme
Um die Aufgaben heutiger Betriebssysteme besser zu verstehen, macht es Sinn sich die Entwicklung der Betriebssysteme näher anzuschauen. Die Entwicklung der Betriebssysteme hängt sehr stark mit der Entwicklung der Hardware zusammen. Wo waren also die Anfänge?
Während bzw. kurz nach dem zweiten Weltkrieg wurden die ersten funktionierenden Digitalcomputer gebaut(Z3, ENIAC, etc.). Programmiert wurden diese Rechner durch Steckkarten oder Verdrahtung von Stromkreisen. Wer den Rechner nutzen wollte, trug sich in einen Aushang ein, programmierte dann im Maschinenraum und hoffte, dass bei der Ausführung seines Programmes keine der vielen Röhren durchbrennen würde. Welches Betriebssystem wurde hier verwendet? Keins.
Durch die Verwendung von Lochkarten konnten Programme "vorgeschrieben" werden, d.h. der Programmierer stanzte sein Programm auf Lochkarten anstatt im Maschinenraum alles neu zu verdrahten. Dadurch wurde auch die Stapelverarbeitung möglich. (Betriebs)systeme: FMS, IBSYS. Die damaligen Systeme haben die Programme eigentlich nur von FORTRAN in Maschinensprache übersetzt. Die damaligen Maschinen hatten aber ein großes Problem: Software war an die Hardware gebunden. Das heißt beim Übergang zu einer schnelleren Maschine war die Software nichtmehr kompatibel.
IBM versuchte dieses Problem mit einer Familie von softwarekompatiblen Rechnern zu lösen. Das OS/360 konnte auf allen Modellen dieser Familie arbeiten und brachte einige bahnbrechende Neuerungen mit sich. Die wohl wichtigste Neuerung ist das Mutliprogramming. Vorher wurden mehrere Jobs einfach hintereinander ausgeführt. Hatte ein Job viel Ein-/Ausgabe (z.B. bei der Datenverarbeitung), so war die teure CPU während dieser Zeit ungenutzt (=> Verschwendung). Multiprogrammierung sorgt dafür, dass Jobs, die auf ein "externes" Ereignis warten, die CPU-Nutzung an einen anderen Job "übergeben" (=> Höhere CPU-Auslastung). Eine Weiterentwicklung dieses Verfahren ist das Multitasking, bei dem die Nutzung der CPU in kleinen Zeitabschnitten mit anschließendem Wechsel erfolgt (=> Jobs werden scheinbar gleichzeitig ausgeführt). Durch Multiprogrammierung/-tasking erhöht sich die Komplexität um ein 10- bis 100-faches, da viele neue Funktionen bereitgestellt werden müssen(z.B. muss gesteuert werden, welcher Prozess wann und wie oft die CPU nutzen darf).
Vereinfacht kann man sich das so vorstellen: Ohne Multitasking könntet ihr nur ein Fenster/Programm gleichzeitig benutzen. Angenommen man arbeitet gerade an einer Powerpoint Präsentation für ITG und möchte dafür im Internet recherchieren, so müsste man PowerPoint immer beenden bevor man den Browser öffnet (=> Sehr umständlich/unpraktisch).
Prozesse, Zustände und Kommunikation
Prozesse
Bevor wir Prozesse detailliert besprechen, wenden wir uns erstmal den Programmen zu, da diese den meisten geläufiger sind. Was kann man mit Programmen im Allgemeinen machen?
<popup name="Antworten">
- Ein Programm kann aufgerufen/gestartet werden.
- Ein Programm kann beendet werden.
- Ein Programm kann "laufen" gelassen werden.
- Ein Programm kann (meistens) minimiert werden.
</popup>
Außerdem entscheidet der Benutzer mit welchem Programm er wann arbeiten möchte. Beispiel(wie vorher): Ihr macht eine PowerPoint Präsentation und möchtet dann im Internet nach Informationen suchen. Ihr wechselt also "das aktive Programm" zu eurem Browser und lasst euer Präsentationsprogramm warten.
Sehen wir uns mal die formelle Definition für Prozesse an:
- Definition Prozess: "Ein Prozess ist in der Informatik „der Vorgang einer algorithmisch ablaufenden Informationsverarbeitung“. Als Spezialfall „in Betriebssystemen ist ein Prozess ein Vorgang, der durch ein Programm kontrolliert wird, welches zur Ausführung einen Prozessor benötigt“"(Prozess(Informatik))
Oder kurz: Ein Prozess ist ein Programm in Ausführung. (Ausführung meint hier alles zwischen Start und Beenden)
Was hat/braucht so ein Prozess eigentlich alles und warum?
In der Regel sollen Prozesse ja irgendwas tun. Damit der Prozess weiß, was er tun soll, braucht er Anweisungen(Instruktionen) und Dinge auf die er diese Anweisungen anwenden kann (Variablen). Was ein Prozess womit in welcher Reihenfolge tut, steht im Programmcode (=> Ein Prozess hat Programmcode). Desweiteren müssen diverse Daten (Code, Adressen, Variablen, etc.) irgendwo gespeichert sein, d.h. ein Prozess muss Platz im Hauptspeicher haben.
Prozesse in Windows
In Windows werden Prozesse Tasks genannt. Welche Prozesse bei euch gerade aktiv sind könnt ihr im Taskmanager (Tastenkürzel: strg+alt+esc) nachschauen. Dort findet ihr auch weitere Details wie zum Beispiel die CPU-Nutzung in % oder den bereits erwähnten Platz im Hauptspeicher. Klickt man den Reiter "Leistung" an, bekommt man (u.a.) angezeigt wieviele Prozesse gerade aktiv sind. Unter der Option "Ansicht -> Spalten auswählen..." können weitere Details eingeblendet werden. Zum Beispiel: CPU-Zeit. Hier könnt ihr genau ablesen, welcher Prozess wie lange den Prozessor nutzen durfte(seit der Prozess gestartet wurde).
Zustände
Um effizient zu bleiben, muss das Betriebssystem auch wissen, welcher Prozess denn überhaupt rechnen möchte.
Nehmen wir zum Beispiel an, ihr seid am Bahnhof und wollt euren Zug erwischen, der bald abfährt. Vor euch blockiert allerdings eine Horde älterer Damen den Weg, weil sie dabei sind ihre Brillen aus den Handtaschen zu kramen um dann in aller Ruhe die Anzeigetafel mit den Abfahrtszeiten zu bestaunen. D.h. obwohl ihr den Weg zu eurer Bahn nutzen möchtet, müsst ihr warten, weil andere den Weg blockieren, obwohl sie ihn (noch) gar nicht nutzen möchten. Ärgerlich. Und vor allem: Ineffizient!
Lösung?: Die älteren Damen zur Seite schieben wo sie niemanden stören und sich dann schleunigst auf den Weg machen. Die Damen können ja immernoch loslaufen, wenn sie auch tatsächlich laufen möchten.
Für das echte Leben ist diese Lösung ungeeignet, da sie oft als unhöflich empfunden wird. Für unsere Prozesse ist diese Lösung allerdings optimal. Warum sollte ein Prozess den Prozessor nutzen dürfen, wenn er erst noch nach seiner Brille suchen muss? Deswegen haben Prozesse sogenannte Prozesszustände. Welche Prozesse könntet ihr euch vorstellen?(Hinweis: 1. Ich hätte wohl kaum sone lange Geschichte erzählt, wenn sich daraus kein Zustand ableiten ließe; 2. Denkt daran was man mit Programmen so tun kann):
<popup name="Welche Prozesszustände sind wichtig/sinnvoll?">
- Ready: der Prozess ist bereit und wartet auf Zuteilung eines Prozessors. (Ihr im Bahnhof)
- Running: der Prozess ist einem Prozessor zugeteilt. (Ihr lauft tatsächlich zu eurem Zug)
- Waiting: der Prozess wartet auf ein externes Ereignis. (Die älteren Damen, die nach ihrer Brille suchen)
- Terminated: der Prozess wurde beendet. (Programme kann man ja auch beenden...)
- New: der Prozess wurde erstellt. (... und starten!)
Wie diese Prozesse ineinander übergehen können zeigt folgende Abbildung.
Kommunikation
Ein weiterer Aspekt von Prozessen ist die sogenannte Inter-Process-Communication(IPC). Wieso ist es sinnvoll, dass Prozesse miteinander kommunizieren können?
- Mitbenutzung von Information, z.B. mehrere Prozesse teilen sich Sensordaten.
- Sinnvoll, weil dann nicht jeder Prozess einen eigenen Sensor braucht.
- Ihr habt vermutlich auch nicht für jede Person aus eurer Familie ein eigenes Badezimmer.
- Beschleunigung der Ausführung, wenn z.B.eine Aufgabe in mehrere kooperierende Teilaufgaben geteilt wird.
- Sinnvoll, da die Arbeit nur einmal gemacht werden muss.
- Wer schonmal Hausaufgaben abgeschrieben hat kennt das.
- (Modularität von Programmen)
Wie kommunizieren Prozesse miteinander?
1. Message Passing:
- Grob kann man sich das so vorstellen, als würden sich Prozesse kleine Briefchen mit 1en und 0en schicken. Um Briefchen zu verschicken braucht man nur die Adresse des Empfängers.
- Prozesse richten ein Postfach/eine mailbox (d.h. einen Bereich im Speicher) ein, das beschrieben und gelesen werden kann (Und zwar von jedem Prozess der die ID des Postfachs kennt).
- Alternativ lässt sich Message Passing auch via Pipes verwirklichen. Zwischen den beiden Prozessen wird also ein Rohr gelegt, durch das dann Pakete verschickt werden(genauer:Pipes sind ein Mechanismus mit dem ein gepufferter Datenstream zwischen zwei Prozessen realisiert wird).
2. Shared memory:
- Hier teilen sich einfach zwei oder mehr Prozesse einen gemeinsamen Speicherbereich.
Welche Probleme könnte dieser gemeinsame Speicher mit sich bringen?
Prozessscheduling
Wie wir bereits gesehen haben, wird die CPU bestimmten Prozessen zugeteilt. Diesen Vorgang nennt man Scheduling. Bevor wir uns überlegen, wie diese Zuteilung funktionieren kann, sollten wir uns Gedanken machen wie sich Prozesse verhalten. Es gibt eigentlich nur 2 Arten von Prozessverhalten die unterschieden werden. Die Unterteilung erfolgt in CPU-intensive und I/O (Input/Output)-intensive Prozesse, konkret bedeutet das: CPU-intensive Prozesse rechnen mehr, I/O-intensive rechnen weniger (und warten dafür öfter auf I/O). Welche Möglichkeiten haben wir nun die Zuteilung vorzunehmen?
Um das zu veranschaulichen, bedienen wir uns eines (zugegeben sehr weit hergeholten) Beispiels:
Vor der Damentoilette hat sich eine (Warte)schlange gebildet. Die einen wollen sich nur frisch machen, um danach Feedback von ihren Freunden zu bekommen (I/O-intensiv). Die anderen wollen das tun, was man auf der Toilette nunmal tut (CPU-intensiv). Aus unerfindlichen Gründen gibt es einen Türsteher, der entscheidet, wer die Toilette als nächstes benutzen darf.
Welche Möglichkeiten hat er um zu entscheiden, wer als nächstes dran ist?
<popup name="Schedulingstrategien für das Damentoiletten Problem">
First Come First Served (FCFS):
Wer ganz vorne in der Schlange steht, darf als nächstes auf die Toilette.
Realisiert wird das beim Computer über eine Warteschleife. Der erste/älteste Prozess, der die CPU angefragt hat, wird zugeteilt (und rechnet bis er fertig ist). Vorteile: Fair und einfach zu realisieren Nachteile: ggf. lange Wartezeiten; CPU-intensive Prozesse können IO-intensive verzögern (Wer sich nur mal frisch machen will, muss teilweise lange warten, weil andere die Toilette lange in Anspruch nehmen)
Shortest Job First (SJF):
Wer am wenigsten Zeit auf der Toilette verbringen wird, darf als nächstes.
Beim Computer wird die Berechnungszeit geschätzt und abhängig davon der nächste Prozess der CPU zugeordnet. Vorteile: Kurze Jobs werden sehr schnell abgearbeitet (Die Damentoilette wird in der gleichen Zeit (relativ zu FCFS) öfter benutzt => Erhöhter Durchsatz) Nachteile: ggf. kommen lange Jobs erst spät, in Extremfällen sogar gar nicht zum Zug; Außerdem muss die verbleibende Berechnungszeit für jeden Prozess bestimmt werden (Wer länger auf der Toilette braucht, kommt vielleicht gar nicht dran... ungut für die Realität; Außerdem müsste der Türsteher jede Dame fragen wie lange sie vor hat auf der Toilette zu bleiben => höherer Aufwand)
Prioritätsscheduling:
Wir definieren Priorität für unser Beispiel mal als Dringlichkeit. Dabei spielt es keine Rolle, ob man ganz dringend aufs Klo muss oder ob man sich (nur) ganz dringend frisch machen muss.
Der Türsteher fragt also jede Dame die sich neu in der Schlange anstellt danach, wie dringend sie die Toilette benutzen muss. Wird die Toilette wieder frei, so kommt diejenige an die Reihe, die am dringendsten muss.
Zurück zur digitalen Welt:
Manchmal ist es wünschenswert bestimmte (wichtige) Prozesse zu bevorzugen (z.B. beim Auto).
Hier wird jedem Prozess eine Priorität zugeordnet; Hier darf immer der Prozess rechnen, der die höchste Priorität hat (und natürlich ready ist);
- Vorteile: Wichtige Prozesse bekommen mehr CPU-Zeit, weniger wichtige eben weniger. (Wers kaum noch halten kann, kommt früher dran als Damen mit einer Stahlblase...)
- Nachteile: Starvation(Verhungern) eines Prozesses mit niedriger Priorität ist möglich, d.h. er darf einfach nie rechnen.
- Anekdote: Als 1973 eine IBM 7094 am MIT heruntergefahren wurde, hat man einen Prozess entdeckt, der 6 Jahre zuvor abgeschickt wurde. Dieser Prozess hatte eine so niedrige Priorität, dass er nie (bzw. nicht bis zu Beendigung) rechnen durfte.
Aging Scheduling:
Aging ist eine Erweiterung des Pritoritätsschedulings.
Der Türsteher stellt fest, dass eine Dame, die sich vor einigen Stunden mit niedriger Dringlichkeit angestellt hat, immer noch wartet. Er sieht sich gezwungen seine Schedulingstrategie zu ändern: Je länger jemand wartet, umso höher wird seine Priorität (logisch, denn wenn ihr auf die Toilette müsst und damit wartet wirds auch immer dringender).
Beim Computer wird die Priorität eines Prozesses einfach in bestimmten Zeitabständen erhöht, wenn er nicht rechnen durfte. => Starvation wird verhindert.
Lotteriescheduling:
Die Damen weigern sich in einer Schlange zu stehen und der Türsteher hat keine Ahnung mehr, wer ganz vorne gestanden hat oder wer am dringensten muss. Also verteilt er Lose an die Damen und zieht immer mal wieder eine Gewinnerin, die dann die Toilette benutzen darf.
In gewissen Zeitabständen werden Lose ausgwertet, der Gewinner der Lotterie darf bis zu nächsten Ziehung rechnen. </popup>
Eine sehr wichtige Schedulingstrategie wird leider nicht sinvoll durch unser Beispiel abgedeckt. Trotzdem versuchen wirs mal.
Round-Robin-Scheduling: Wir haben wieder eine Warteschlange und benutzen die FCFS Strategie, mit einer kleinen Änderung: Ist eine Dame nach einer Minute noch nicht fertig mit ihrem Toilettengang, so muss sie ihre Tätigkeit unterbrechen und sich wieder ganz hinten anstellen.
- Funktioniert ähnlich wie FCFS; Man hat eine Warteschlange in der die (ready) Prozesse auf Zuteilung warten; Außerdem wird jedem Prozess ein Quantum (=Zeitabschnitt/-dauer in dem er die CPU benutzen darf) zugeteilt; Ist ein Prozess am Ende seines Quantums nochnicht fertig, kommt es an den Anfang der Warteschlange; Dann ist der Prozess am Ende der Warteschlange an der Reihe und kann die CPU "ein Quantum lang" nutzen.
- Das Quantum kann man verändern; Welche Vorteile/Nachteile hat ein kurzes Quantum?(z.B. die Damen dürfen die Toilette nur für 10Sekunden benutzen)
- Vorteile: Hohe Reaktionszeit (Man kommt relativ schnell dran)
- Nachteile: Je öfter gewechselt wird, desto mehr Prozessorzeit wird zum Wechseln der Prozesse verschwendet (konkret: Der Gang zur Toilette geht auch von den 10 Sekunden ab. d.h. die Damen haben deutlich weniger Zeit um ihre Bedürfnisse zu stillen, weil sie die Zeit zum laufen mit einberechnen müssen).
- Was passiert wenn das Quantum unendlich bzw. sehr groß wird? (d.h. Jede Dame darf die Toilette benutzen, solange sie braucht) => Round Robin wird zu FCFS.
- Das Quantum kann man verändern; Welche Vorteile/Nachteile hat ein kurzes Quantum?(z.B. die Damen dürfen die Toilette nur für 10Sekunden benutzen)
Wo werden welche Schedulingstrategien eingesetzt und warum?
- Bei Echtzeitsystemen idR Prioritätsscheduling; Wenn z.B. beim Auto ein wichtiger Prozess nicht rechtzeitig die Kontrolle übernimmt kann es sehr gefährlich werden.
- Bei Interaktiven Systemen (wie z.B. unsere Desktop-PCs) will man vorallem eine schnelle Antwortzeit und die Bedürfnisse des Users erfüllen (Keiner wartet gerne mehrere Sekunden bis sich ein Fenster schließt [Die meisten fangen dann an panisch auf das Schließen-Symbol zu hämmern]).
- Oftmals werden auch mehrere Warteschlangen (z.B. 3) verwendet (die ersten beiden nach Round Robin, die letzte mit FCFS); Wird ein Prozess im Quantum der ersten RR Schlange nicht fertig, so rutscht er in die zweite, usw. Dadurch können Prozesse mit geringer Rechenzeit schnell abgearbeitet werden.
Speichermanagement
Eine weitere Ressource unseres Computers ist der Speicher (sowohl Haupt- bzw. Arbeitsspeicher als auch der Festplattenspeicher). Auch hier hat unser Betriebssystem die "Finger" drin. Um das nächste Thema zu verstehen, ist es wichtig die Hardware zu verstehen. Prinzipiell gilt: Je schneller ein Speichermedium, desto geringer die Kapazität und Persistenz (Hauptspeicher ist in der Regel deutlich schneller und deutlich "kleiner" als der Festplattenspeicher).
<popup name="Persistenz"> Persistenz ist (in etwa) die Fähigkeit Daten über einen längeren Zeitraum zu speichern. Das Speichermedium Cache ist zum Beispiel relativ transient (= Gegenteil von persistent), d.h. macht man den Computer aus sind die Daten im Cache weg. Speichermedien wie die Festplatte sind dagegen persistent (Daten bleiben erhalten auch wenn der Computer für mehrere Stunden aus ist). </popup>
Was passiert eigentlich, wenn der Hauptspeicher voll ist und wir mehr Platz benötigen? Was könnte man tun?
Zur Verdeutlichung bedienen wir uns mal wieder eines wunderbaren Beispieles... Es ist Montag morgens und ihr macht euch bereit für die Schule. Eine neue Woche voller Spaß am Lernen in diversen Fächern(Prozesse) wartet auf euch. Um möglichst selten eure Schultasche/ euren Rucksack(Hauptspeicher) packen zu müssen, macht ihr eure Tasche voll mit Unterlagen(Daten) der Fächer, die als nächstes anstehen. Ihr nehmt die Unterlagen aus eurem Schrank(Festplatte) und stoßt auf ein Problem:
Es ist euch nicht möglich alle Unterlagen aller Fächer für den heutigen Tag einzupacken. Wie könntet ihr vorgehen, um dieses Problem zu lösen?
<popup name="Mögliche Vorgehensweisen"> Einfach ignorieren und warten bis die letzte Stunde eines Faches vorbei ist (Dann werden die Unterlagen nicht länger gebraucht) und ihr könnt neues Zeug in eure Tasche packen. Beim Computer: warten bis ein Prozess beendet ist und seinen Speicherplatz freigegeben hat => Alle anderen Prozesse (die zusätzlichen Speicher benötigen) müssen warten. Keine gute Lösung. Ihr wartet ja auch nicht bis zum Ende des Schuljahres um eure Tasche neu zu packen.
Die Unterlagen des "ältesten" Faches wegschmeißen. Dann könntet ihr in der Großen Pause nach Hause laufen und neue Unterlagen in eure Tasche packen => Ihr habt die Unterlagen für die kommenden Stunden rechtzeitig dabei. Nachteil: Naja, ihr braucht die Unterlagen des "ältesten" Faches vermutlich spätestens eine Woche später wieder... Wegwerfen ist also auch keine gute Idee.
Beim Computer: Die Daten des ältesten Prozesses zu löschen macht Probleme, wenn diese wieder benötigt werden.
Besser: Nichts Wegwerfen. In der Großen Pause heimlaufen, gerade nicht benötigte (= alte) Unterlagen in euren Schrank packen und benötigte aus dem Schrank holen. => Ihr verliert/zerstört keine Unterlagen und habt trotzdem alles rechtzeitig dabei.
Beim Computer: Die gerade nicht benötigten Daten aus dem Hauptspeicher werden auf die Festplatte ausgelagert und benötigte Daten von der Festplatte in den Hauptspeicher geladen. Dieses Vorgehen nennt sich Swapping. Die ausgelagerten Daten werden z.B. in eine Auslagerungsdatei auf die Festplatte gepackt. Da die Festplatte aber(wie oben bereits erwähnt) relativ langsam ist, dauert dieser Vorgang auch lange.
</popup>
Die Größe der Auslagerungsdatei lässt sich einsehen und einstellen. Bei Windows 7 geht man z.B. wie folgt vor: <popup name="Weg zur Auslagerungsdatei"> Start-Button drücken => Systemsteuerung (Neues Fenster poppt auf)=> System und Sicherheit => System => Erweiterte Systemeinstellungen (Neues Fenster poppt auf: "Systemeigentschaften") => Reiter "Erweitert" auswählen => Beim Unterpunkt Leistung auf Einstellungen klicken (neues Fenster poppt auf:"Leistungsoptionen")=> Reiter "Erweitert" auswählen => Virtueller Arbeitsspeicher </popup>
Welche Probleme können durch Swapping entstehen?
Auf dem Bild sieht man einen möglichen Ein- bzw. Auslagerungsablauf bezüglich des Hauptspeichers. Die Daten der Prozesse werden als P1-P5 bezeichnet. Sobald der Platz im Hauptspeicher nicht ausreicht um neue Daten aufzunehmen, wird der Speicherbereich eines älteren Prozesses auf die Festplatte ausgelagert und freigegeben.
Fällt Ihnen etwas auf? <popup name="Auffälligkeit"> In den letzten 3 Zeitschritten bleiben immer wieder Löcher (Holes) zurück, in die (je nach Größe) keine Daten eines ganzen Prozesses hineinpassen. Dieser Speicherplatz bleibt ggf. ungenutzt. => Verschwendung. Dieses Problem nennt man externe Fragmentierung.
Interne Fragmentierung entsteht, wenn man den Hauptspeicher in gleichgroße Blöcke aufteilt und den Prozessen eine bestimmte (ausreichende) Anzahl dieser Blöcke zuteilt. Beispiel: 4kB Blöcke, 5kB Daten eines Prozesses => der Prozess benötigt 2 Blöcke => 3kB verschwendet. </popup>
Dateien und Dateisysteme
Was sind Dateien und warum braucht man sie?
Was sind Dateien? Dateien sind vermutlich jedem von uns bekannt. Aber was sind eigentlich Dateien und woraus sind Dateien aufgebaut?
Kurzfassung: Dateien enthalten Daten, die wiederum aus Informationen bestehen. Toll. Was wissen wir schon über Dateien(am besten mal eine Textdatei auf dem Desktop erstellen)? Offensichtlich hat eine Datei einen Namen. Außerdem gibt es wohl unterschiedliche Dateitypen (Textdatei, Musikdateien,etc.), die durch ihre Endung identifiziert werden können (z.B. Textdatei.txt , Musikdatei.mp3 , etc.). Wenn wir (unter Windows) auf eine Datei rechtsklicken können wir ganz unten Eigenschaften anwählen. D.h. so eine Datei hat wohl auch Eigenschaften.
So könnte das ganze aussehen wenn man draufklickt (Die Textdatei in diesem Beispiel enthält bereits Text... daher auch die "Größe")
Man sieht, dass sogar so etwas "einfaches" wie eine Textdatei jede Menge Daten (z.B. Erstellungszeitpunkt, Letzte Modifikation, etc.) neben den eigentlich "relevanten" Daten enthält. Eigentlich sind Dateien also ("nichts weiter" als) eine Abstraktion von "Lese/Schreibe von Speicheradresse A bis Speicheradresse B", Bits und Bytes die auf der Festplatten rumliegen und gelesen/beschrieben werden können.
Warum braucht man Dateien? Dateien sind vorallem für die Persistenz wichtig. Manche Daten von Prozessen sollen ja erhalten bleiben, auch wenn der Prozess beendet wurde. Wenn man zum Beispiel mehrere Stunden damit verbringt eine Selbstlerneinheit zum Thema "Was macht ein Betriebssystem" zu schreiben, möchte man ja auch, dass das nicht verloren geht.
Man braucht Dateien auch, damit mehrere Prozesse gleichzeitig auf Informationen zugreifen können.
Außerdem kann man in Dateien größere Datenmengen speichern als der Hauptspeicher(aufgrund seiner begrenzten Kapazität) speichern kann.
Zusammenfassend kann man sagen: Dateien sind einfach handlicher und praktischer.
=> Wir stellen 3 Anforderungen an Dateien:
- Dateien sollen große Datenmengen speichern können.
- Daten sollen nach Beendigung von Prozessen erhalten bleiben (wenn gewünscht)
- Auf Dateien muss von mehreren Prozessen gleichzeitig zugegriffen werden können.
Strukturierung von Dateien
Wir wissen bereits, wie Dateien "für uns" aussehen (Dateiname.bla) und wir wissen, wie Dateien "physisch" aussehen (Speicherbereich). Wer/Was kümmert sich eigentlich darum, dass wir Dateien anstelle von Speicherbereichen sehen? Natürlich das Betriebssystem (bzw. ein Teil davon). Wie das genau gemacht wird schauen wir uns jetzt einmal an:
Möglichkeiten der Strukturierung(Implementierung)
Als Beispiel nehmen wir dieses Szenario:
Welche Möglichkeiten haben wir, Datei A und Datei B zu platzieren?
1. Als Zusammenhängende (d.h. aufeinanderfolgende) Speicherblöcke:
<popup name="Zusammenhängende Blöcke">
<popup name="Vorteile/Nachteile"> Vorteil: Einfach, Lesen der Datei sehr schnell
Nachteil: Fragmentierung, Dateilänge muss bei der Erstellung einer Datei bekannt sein </popup>
2. Als verkettete Listen: Verkettete Listen: Jeder Block der Datei enthält einen Zeiger auf den nächsten Block. Der letzte Block zeigt "nirgendwo" hin. D.h. um eine Datei von der Festplatte zu lesen braucht man nur die Speicheradresse des ersten Blocks. Der erste Block enthält nämlich die Adresse des zweiten, der zweite die des dritten, etc.
<popup name="Verkettete Listen"> <popup name="Vorteile/Nachteile"> Vorteil: Fragmentierung wird verhindert.
Nachteil: Wahlfreier Zugriff(Lese Block X, danach Lese Block Y) sehr langsam; Da die Referenz auf den nächsten Block mitgespeichert werden muss, bleibt weniger Platz für die eigentlichen Daten.
Eine Weiterentwicklung der verketteten Listen wäre z.B. FAT (File-Allocation-Table). Dabei werden die Verknüpfungen nicht in den Blöcken selbst, sondern in einer Tabelle im Hauptspeicher gespeichert. => Schnellerer Wahlfreier Zugriff, schnelleres Finden eines freien Speicherblockes; Dafür wird aber (viel) Platz im Hauptspeicher benötigt.
</popup>
3. INode (Indexknoten): Der erste Speicherblock einer Datei enthält Zeiger auf anderen Datenblöcke. Der erste Block wird INode genannt und enthält keine (eigentlichen) Daten. <popup name="INode"> <popup name="Vorteile/Nachteile"> Vorteil: Weniger Platz im Hauptspeicher benötigt (relativ zu FAT) und alle Vorteile von FAT.
(Nachteil: Was passiert wenn ein INode nicht ausreicht um alle Daten zu referenzieren? => Mehrstufige INodes) </popup>
Der Teil des Betriebssystems, der für Dateien verantwortlich ist heißt Dateisystem. Davon gibt es wahnsinnig viele. Unter Windows wurde früher FAT verwendet, heutzutage mehr NTFS. Linux unterstützt sogar über 40 verschiedene Dateisysteme (z.B. ext3, ext4).
Die verschiedenen Dateisysteme unterscheiden sich zum Beispiel in Lesegeschwindigkeit, Schreibgeschwindigkeit, Dateiblock suchen, max. Dateigröße, Sicherheit der Daten, etc.
Zusatzmaterial
Ihr habt nochnicht genug? Hier gibts noch mehr.
Race Condition
In diesem Abschnitt geht es darum, was passiert wenn 2 Prozesse die selbe Variable manipulieren.
Da manche, die diese Selbstlerneinheit lesen, vielleicht noch keine Programmiererfahrung haben, nehmen wir mal wieder ein Beispiel zur Veranschaulichung.
Im Folgenden Bild sehen wir die Zwillingsbrüder Dek und Ink Remento, sowie 3 Kästen mit Blättern (von denen nur das im mittleren Kasten mit der Zahl 5 beschrieben ist). Brüder bekommen unterschiedliche Aufgaben: Dek soll die Zahl um 1 verringern (dekrementieren), die resultierende Zahl auf sein Blatt schreiben und das Blatt dann in den mittleren Kasten legen, sodass die 5 verdeckt wird. Ink soll die Zahl um 1 erhöhen (inkrementieren), die resultierende Zahl auf sein Blatt schreiben und das Blatt auch in den mittleren Kasten legen, sodass die 5 verdeckt wird.
Beide fangen gleichzeitig an.
Jetzt kommen wir zum entscheidenden Punkt: Welche Zahl wird zu lesen sein, wenn beide ihre Blätter im mittleren Kasten abgelegt haben?
Das ist natürlich davon abhängig, wer schneller war. Das Blatt des Langsameren liegt am Ende oben.
Ihr erinnert euch sicher noch daran, dass sich Prozesse bestimmte Ressourcen (wie z.B. Speicher) teilen können um effektiver arbeiten zu können. Was passiert jetzt aber, wenn die Prozesse auf die gleiche Ressource zugreifen und (wie Ink & Dek) nicht auf das achten, was der andere macht/gemacht hat? => Die Informationen des schnelleren gehen verloren. Die Situation, bei der eine Ressource von mehreren Prozessen manipuliert wird und das Ergebnis vom Timing der Ausführung abhängt, bezeichnet man als Race Condition. Oftmals ist das unerwünscht. Stellt euch zum Beispiel vor ihr wollt ein Schulprojekt ausdrucken und kurz nachdem ihr auf "drucken" gedrückt habt, drückt euer Vater an seinem Computer auch auf "drucken" um lustige Katzenbilder auszudrucken... der Drucker würde euer Schulprojekt komplett vergessen und erstmal die Katzenbilder ausdrucken. Blöd gelaufen.
Aber warum passiert das eigentlich nie? => Diese Situation kann man verhindern.
Welche Möglichkeit hat man, das zu verhindern?
Um sicherzustellen, dass immer nur ein Prozess gleichzeitig auf eine Ressource zugreifen kann bietet sich der sogennante Wechselseitige Ausschluss an. Konkret bedeutet das, man führt etwas ein, was den Zugriff auf diese Ressource kontrolliert (zum Beispiel einen Semaphor), d.h. man muss eine Ressource erst reservieren bevor man sie benutzen darf.
Ein Semaphor ist eine recht einfache Datenstruktur. Sie enthält einen ganzzahligen Wert (0,1,2,3,...), der angibt wieviele Prozesse (gefahrlos) gleichzeitig auf diese Ressource zugreifen können (als Beispiel: wenn man 3 Drucker und 16 Computer hat wäre der Wert 3 sinnvoll).
Außerdem stellt diese Datenstruktur 2 Operationen (S bezeichnet im folgenden den Semaphor bzw. seinen Ganzzahlwert):
- wait(S): Warte solange bis S größer als 0 ist. Wenn S größer 0, erniedrige S um 1 und reserviere damit die Ressource für dich.
- signal(S): Erhöhe S um 1 und gib damit die Kontrolle über die Ressource ab.
Was können wir daraus schließen?:
- der aktuelle Wert von S gibt immer an wieviel Ressourcen verfügbar sind.
- Wenn niemand S reserviert hat, gibt der Wert von S an, wieviele Ressourcen maximal verfügbar sind.
Diese Lösung bezeichnet man auch als aktives Warten. Die Prozesse, die eine Ressource anfragen, tun das während ihrer Rechenzeit(aktiv). Wenn die Ressource belegt ist, müssen sie natürlich warten => Verschwendung der Prozessorzeit.
Was passiert wenn 2 Prozesse gleichzeitig den Semaphor erniedrigen wollen? Dann hätten wir ja wieder die selbe Situation wie vorher!
Lösung: Man macht das Reservieren/Freigeben atomar, d.h. diese Aktion kann nur 1 Prozess gleichzeitig aufrufen und die Aktion kann nicht unterbrochen werden.
Die bisher vorgestellten Lösungen verursachen noch eine Menge Probleme. Ein großes Problem des aktiven Wartens z.B. ist die Prioritätsumkehr: Angenommen ein Prozess extrem hoher Priorität benötigt eine Ressource, die von einem Prozess extrem niedriger Priorität belegt ist. Der Prozess niedriger Priorität kann ggf. nie die Ressource freigeben, weil er nie rechnen darf, wenn der Prozess mit hoher Priorität rechnen kann. => Ein riesen Problem.
Zu den ganzen Problemen der vorgestellten Lösungen gibt es auch wieder Lösungen auf die ich hier nicht näher eingehen möchte. Wer Interesse an dem Thema hat kann sich ja im Internet dazu weiter informieren.
RAID-Systeme
In diesem Abschnitt geht es darum, wie man Daten auf Festplatten gegen Ausfälle(z.B. eine Festplatte geht kaputt) sichern und wie man den Zugriff auf Daten beschleunigen kann. Im Grunde macht man aus mehreren physischen Disks(Festplatten) eine logische. (RAID = Redundant Array of Independent Disks)
Redundanz: Bezeichnet das mehrfache Vorhandensein von Informationen.
RAID-0
Ausgangsbedingungen: Mindestens 2 Festplatten
Vorgehensweise: Man zerlegt Datenblöcke in Streifen gleicher Größe(striping) und schreibt sie abwechselnd auf die Festplatten. D.h. Datei A wird in Streifen A1, A2, A3, A4, etc. zerlegt und dann (bei 2 Festplatten) abwechselnd auf FP1(Enthält dann A1, A3, etc.) und FP2(A2,A4,etc.) geschrieben.
Vorteil: Da die beiden Festplatten gleichzeitig/parallel gelesen werden können, erhält man einen Performancegewinn.
Nachteil: Fällt eine der Festplatten aus, sind ALLE Daten weg. => Keine Redundanz.
RAID-1
Ausgangsbedingungen: Mindestens 2 Festplatten
Vorgehensweise: Man speichert die Daten immer auf allen Festplatten(Duplizieren, Mirroring). Bei 2 Festplatten und Datenblöcken A1, A2, A3, etc. bedeutet das: FP1 (enthält A1,A2,A3,etc.) und FP2 (enthält A1,A2,A3,etc.) haben die gleichen Daten gespeichert.
Vorteil: Bei Ausfall einer Festplatte, sind die Daten auf den anderen noch erhalten. => Redundanz
Nachteil: Die Datei wird auf jeder Festplatte abgespeichert. Bei 2 Festplatten verbraucht jede Datei also den doppelten Speicherplatz.
Ausfallsicherheit: RAID-0 vs RAID-1:
Vorsicht hier wird gerechnet
<popup name="Rechenbeispiel Ausfallsicherheit"> Angenommen eine Festplatte fällt mit einer Wahrscheinlichkeit von 10% (p=0.1) innerhalb von einem Jahr aus. Wie hoch ist dann die Wahrscheinlichkeit (bei 2 Festplatten), dass Daten verloren gehen?
Datenverlust = Einige Daten gehen verloren.
RAID-0: Daten gehen verloren, wenn mindestens eine Festplatte ausfällt.
p(Mindestens 1 Ausfall)= 1-p(Kein Ausfall) = 1-(0.9)^2 = 1-0.81 = 0.19 => 19% Wahrscheinlichkeit für Datenverlust pro Jahr.
RAID-1: Daten gehen erst verloren, wenn beide Festplatten ausfallen.
p(Beide fallen aus)=0.1^2= 0.01 => 1% Wahrscheinlichkeit für Datenverlust pro Jahr.
Ohne RAID ist "die Hälfte der Daten" weg, wenn eine Festplatte ausfällt. D.h. auch hier beträgt die Wahrscheinlichkeit für einen Datenverlust 19% pro Jahr, allerdings gehen bei RAID-0 wahrscheinlich nicht nur die Hälfte, sondern direkt alle Daten drauf.
</popup>
RAID-2 bis RAID-4 lassen wir hier mal aus, da sie eigentlich nur eine "schlechtere" Version von RAID-5 sind.
RAID-5
Ausgangsbedingungen: mindestens 3 Festplatten (In diesem Szenario werden 4 Festplatten verwendet, aber es geht auch mit 3)
Vorgehensweise: Aufeinanderfolgende Datenblöcke werden auf verschiedene Festplatten (1-4) gespeichert. Zusätzlich werden noch Paritätsinformationen (können benutzt werden um Datenfehler zu korrigieren) auf die vier Festplatten verteilt. Was passiert wenn eine der Festplatten ausfällt? Mithilfe der anderen Festplatten und der Paritätsinformationen können die Daten rekonstruiert werden.
<popup name="Beispiel">
Datenblöcke: A1, A2, A3 ; B1, B2, B3 ; C1, C2, C3
Paritätsinfos: Ap, Bp, Cp
FP1: A1, B2, C3
FP2: A2, B3, Cp
FP3: A3, Bp, C1
FP4: Ap, B1, C2 </popup>
Vorteile: Höhere Sicherheit als ohne RAID, Höhere Performance (4 Festplatten lesen gleichzeitig), weniger (sinnlos) "verschwendeter" Speicherplatz.
Nachteile: Benötigt relativ viele Festplatten, auch Paritätsinformationen verbrauchen Speicherplatz.
Weitere Aspekte von Betriebssystemen
Das was ihr in dieser Selbstlerneinheit über Betriebssysteme gelernt habt, ist bei weitem noch nicht alles. So ein Betriebssystem macht nämlich verdammt viel.
Weitere Dinge die ein Betriebssystem macht:
- Es kontrolliert Eingabe und Ausgabe.
- Es sichert den Speicher ab, sodass kein Prozess in einen Speicherbereich schreiben (und auch nicht davon lesen) kann, der nicht zu diesem Prozess gehört.
- Es abstrahiert vom physischen Speicher zum logischen Speicher (Man muss die physische Speicheradresse nicht kennen um etwas zu speichern). Um das vernünftig zu machen sind auch allerhand Überlegungen notwendig gewesen.
- Auch zu Dateisystemen gäbe es noch jede Menge zu sagen... (z.B. Journaling, Dateiattribute, etc.)
- Und genauso zu Dateien an sich (Dateitypen: Regular Files, Device Files, etc.)
- Scheduling von Festplattenzugriffen
- Grafische Nutzer Oberfläche (GUI)
- Sicherheitsmechanismen des Systems
- ...
Abschließende Fragen / Zusammenfassung
Am Ende dieser Selbstlerneinheit solltet ihr auf die Frage "Was macht ein Betriebssystem?" irgendwas sagen können... z.B. Verdammt viel.
Hier noch ein kleines Quiz um euren Lernerfolg zu testen
Manchmal sind mehrere Antwortmöglichkeiten richtig.
1.Welches Konzept ermöglicht es Prozesse pseudogleichzeitig auszuführen? (Multithreading.) (!Multileveling.) (!Grafische Nutzeroberfläche.) (!Stapelverarbeitung.)
2.Welche Prozesszustände haben wir kennengelernt? (New.) (!Old.) (Waiting.) (Running.) (!Gone Fishing.)
3.Wie kommunizieren Prozesse untereinander: Inter-Process-Communication? (!Jugendsprache -aka Slang.) (Briefchen schreiben - aka Message Passing.) (!Anrufen - aka Calling.) (Gemeinsamer Speicher - aka shared memory.)
4.Welche Prozessschedulingstrategien gibt es wirklich? (Round-Robin-Scheduling.) (Prioritätsscheduling.) (!Round-Dieter-Scheduling.) (!Wer ist der coolste Prozess Scheduling.) (First Come First Served.)
5.Was beschreibt der Begriff Persistenz? (Die Langlebigkeit von Daten.) (!Die Größe der Daten.) (!Die Version es Betriebssystems.)
6.Dateien haben? (Einen Namen.) (Einen Speicherbereich auf der Festplatte.) (!Viel Geld.) (Eine Struktur.)
7.Fragmentierung bedeutet? (Verschwendung von Speicherplatz.) (!Verschwendung von Steuergeldern.) (!Ungenaues Arbeiten.)
8.Welche Dateistrukturen kennt ihr? (Inode) (Verkettete Listen) (!Dreiecksstruktur)
9.Welche Dateisysteme gibt es? (!WTF) (FAT) (!LOL) (NTFS)
10.Welchen Anforderungen sollten Dateien genügen? (Persistenz) (Hohe Kapazität) (Mehrere Prozesse sollen gleichzeitig zugreifen können)
11.Für Informatiker bedeutet FAT? (!Übergewicht) (File Allocation Table) (!Französische, Angsteinflößende Touristen) (!Funktionsfähige, Ansehnliche Tastaturen) (!Function Accepted Type)