Das Betriebsystem ist für die Verteilung und Kontrolle der (Hardware- und Software-) Resourcen zuständig. Vor allem an Mehrbenutzersystemen ist es für die effiziente Arbeit des Systems zuständig. Bei Personal Computern soll es die Arbeit des Benutzers vereinfachen.
Die Betriebssystemstruktur besteht im Zweifelsfall aus dem was der Hersteller nach der Bestellung liefert, aber im allgemeinen sind die Hauptfunktionen eines Betriebssystem: Prozess Managment, Input/Output, Speicher Managment, und das File system. Und die Hauptkomponenten sind der Kernel, die Prozesse, die System Calls und die Device Driver.
Ein Prozess ist ein Programm in Ausführung und benötigt Resourcen wie CPU-Zeit, memory, files und I/O devices. Das Prozess Managment umfasst das Kreieren und Löschen von User- und Kernel-Prozessen, Schalfenlegen und Wiederaufwecken von Prozessen, und Mechanismen zur Prozess- Kommunikation, Synchronisation und des Deadlock Handlings.
System Calls stellen die Schnittstelle zwischen den Prozessen und dem Betriebssystem dar. Mit denen wird auf die Services des OS (Tastatur, Terminal-Output, etc.) zugriffen. Die System Calls werden durch Bibliotheken des OS ergänzt.
Der Kernel ist der Kern und die zentrale Stelle des OS.
Hauptspeicher ist ein grosses Array von Words oder Bytes der schnell verfügbar Daten für die CPU und I/O devices vörrätig hält. Memory Managment wird hardwaremässig durch die MMU (Memory Management Unit) unterstüzt und ermöglicht mit dem Virtual Memory, dass sich Programmierer nicht um Speicher-Beschränkungen sorgen machen müssen, und auch Programme die grösser als der zur Verfügung stehende Speicher sind ausgeführt werden können. Memory Management umfasst die Kontrolle wer wieviel und welchen Speicher belegt, die Belegung und Freigabe von Speicher und damit die Entscheidung welches Programm als nächstes den Speicher belegen darf.
Das Betriebssystem stellt Dateien als Abstraktion für die Details der einzelnen Speichermedien zur Verfügung. Das File Management umfasst das Kreieren und Löschen von Dateien und Verzeichnissen, und grundlegende Mainpulationen dieser.
Mit dem I/O Management stellt das Betriebssystem einheitlich Schnittstellen für den Zugriff auf die Geräte zur Verfügung und versteckt die Eigenehiten der Geräte.
Bei einem Makrokernle werden neben den Grundfunktionen zusätzliche Dienste in den Kernel integriert und damit im Kernel-Mode ausgeführt. Die Ausführung im Kernel-Mode bietet Vorteile (z.B. direkter Zugriff auf Devices), allerdings führen Fehler in den zusätzlichen Diensten gleich zu einem kompletten Kernel-Error, und auch das Updaten einer dieser Komponenten kann normalerweise nur über einen kompletten Reboot erfolgen (Ausnahme z.B. der Modul Konzept des Linux Kernels).
Ein Mirkokernel bietet nur grundsätzliche Funktionen wie threads, inter-process commuincation und memory management an. Alle weiteren Dienste und auch Device Treiber werden als Przesse im User-Space realisiert. Dies hat ein sehr flexibles und modulares System mit hoher Stabilität zur Folge.
Siehe 1.3 und 1.4.
Mit System Calls und traps.
Mit Interrupts.
Top-Half und Bottom-Half. Top-Half werden durch System Calls, Traps und Page Faults ausgelöst und es wird dadurch in den Kernel Mode gewechselt. Bottom-Halfs werden durch Interrupts ausglöst, der aktuelle Prozess wird für kurze Zeit unterbrochen.
Nach der Auslösung eines Hardware-Interrupts wird die aktuelle Anweisung des Prozesses noch beendet. Danach wird der Prozess schlafen gelegt und zur Ausführung des Interrupts-Handlers gesprungen. Nach der Abarbeitung der Interrupt-Handlers wird wieder zum Prozess zurück geswitcht.
Die unterschiedlichen Prioritäten spiegeln die unterschiedliche Wichtigkeit der Interrupts wieder, und dienen der Auseinanderhaltung der Geräte.
Ein Software-Interrupt wird in einem Hardware-Interrupt-Handler ausgelöst, nachdem die kritische Arbeit (wie z.B. das Sichern der I/O-Daten) erledigt ist, um zu einem späteren Zeitpunkt noch die (zeitlich) unkritischen Teile eines Interrupts-Handlers zu erledigen.
Ein Prozess it ein Programm in Audführung der Resourcen (wie CPU time, memory, files und I/O devices) benötigt.
Erzeugen und Löschen von Prozessen, Scheduling der Prozesse, Kommunikations und Synchronisations-Mechanismen, Deadlock handling.
new - ein gerade kreierter Prozess
ready - ein Prozess der bereit zur Ausführung ist
running - ein Prozess der gerade ausgeführt wird
waiting - ein Prozess der auf ein Ereigniss wartet
terminated - ein Prozess der beendet wurde
Der Process Control Block (PCB) enthält alle Informationen die für unterschiedliche Prozesse nicht gleich sind. process number, program counter, registers, process priority, memory limits, list of open files...
Wenn der Prozessor nichts mehr zu tun hat (idle; unterschiedliche Gründe) muss entschieden werden, welcher Prozess als nächstes die CPU zugeteilt bekommt bzw. ausgeführt wird. Der short-term-scheduler wählt häufiger aus der process-ready-queue den nächsten Prozess aus. Der long-term-scheduler wählt seltener aus allen Prozessen im Hauptspeicher aus.
Kriterien: CPU Auslastung, Durchsatz (Prozesses pro Zeiteinheit), Wartezeit, Antwortzeit
Algorithmen: First-Come First-Served (FIFO), Round Robin, Shortest First, Priority Scheduling (statische und dynamische Priorität), Multiple-Processor Scheduling, Asymmetric Multiprocessing, Real-Time Scheduling.
Nicht-Präemtives Scheduling wechselt den Prozess nur der Prozess terminiert, oder der Prozess von running auf waiting wechselt. Beim Präemptiven Scheduling kann der Prozess auch dann gewechselt werden, wenn ein Prozess von waiting auf ready wechelt, oder ein Prozess von running auf ready wechelt. Ausserdem kann beim Präemtiven Scheduling die CPU vom Scheduler entzogen werden, wärend Nicht-Präemtives Scheduling auf der Kooperationsprinzip beruht.
Die Aufgabe des Dispatchers ist es den Wechsel zwischen zwei Prozessen zu realisieren. 1. den Status des laufenden Prozess in den PCB sichern, 2. neuen Prozess durch den Short-Term-Scheduler auswählen, 3. den Status des ausgewählten Prozesses aus dem PCB laden, 4. den PC (Program Counter) entsprechend dem PCB setzen und in den User Mode wechseln
Threads sind Leightweight Prozesse von denen es beliebig viele innerhlab eines Prozesses geben kann und die auf die Resourcen des gesamten Prozesses zugreifen können. Threads haben eigenen Stack, program counter (PC) und Zustand (running, ready...) aber sind nicht unabhängig voneinander und das switching zwischen Ihnen ist einfach.
User-Level Threads benutzne keinen system call fürs switching und sind daher OS unabhängig, daher ist das switching sehr schnell und effizient. Häufig werden sie über user-level libs realisiert. Aber wenn der Kernel signle-threaded ist, blockiert ein system call eines user-level thread den kompletten Prozess mit allen threads.
shared memory (Anwendungabhängig)
Kumminikation über Nachrichten (send, receive)
- Direkte Kommunikation (send(process A, message), receive(process B, message))
Indirekte Kommuniaktion (mailboxes oder ports)
Buffering (Nachrichten werden in eine Queue geschrieben)
Prozesse müssen synchronisiert werden um Daten inkonsistenzen zu vermeiden.
Gegenseitiger Ausschluss bedeutet, dass nur ein Prozess einen kritischen Abschnitt bewältigen darf, die anderen müssen warten.
Semaphoren sind ein high-level synchronisations tool. Im Prinizip ein Integer der mit speziellen ununterbrechbaren Operationen zählt wieviel oder ob ein Prozess in einem kritischen Abschnitt ist. Um das Busy-Waiting auf das Freiwerden zu vermeiden, können sich die Prozesse selber in den waiting-Status versetzen, bis die Semaphore wieder decrementiert wird.
Deadlock heisst, dass zwei Prozesse gegenseitig auf die Resourcen warten, die vom anderen Prozess gerade belegt wird.
Starvation hingegen bedeutet, dass ein Prozess ausgehungert wird, weil er z..B. in einer Semaphoren-Queue auf eine Resource wartet.
- spezielle Protokolle ???
- deadlock zulassen, erkennen und entfernen
- mutual-exclusion
- hold-and-wait: wie bei DBs müssen Prozesse alle Resourcen auf einmal belegen und auch wieder frei geben => vermutlich schlechte resourcen ausnutzung
- No preemption: bei Anforderung einer neuen Resource werden die bisher belegten frei gegeben, und alte und neue Resourcen kommen auf die Liste der gewünschten Resourcen
Starvation ?????
Um den Speicher so gut wie möglich auszunutzen und so vielen Prozessen wie möglich zur Verfügung stellen zu können. Und damit Programme auch grösserals der Hautpspeicher sein können.
Relocation - die Prozesse sollten im Speicher verschiebbar sein
Protection - der Speicher eines Prozesses sollte vor Zugriffen anderer geschützt sein
Sharing - Prozesse sollten Speicherbereiche teilen können
Locical organisation - für verschiedene Module sollten unterschiedliche Protection-Grade möglich sein
Physical organisation - der Hauptspeicher sollte durch Secondary-Speicher (z.B. Plattenplatz) erweiterbar sein
Fixed Partitioning - der Speicher wird in Blöcke (gleicher oder steigender Größe) eingeteilt, und Programme werden in Blöcke <= Größe des Programms geladen. Sehr einfach, führt aber zu interner Fragmentierung und AnzahlProzesse <= Anzahl der Speicherblöcke.
Swapping - komplette Prozesse aus dem Speicher aus- und wieder einlagern (ist das eine Verwaltungsmethode?).
Dynamic Partitioning - Prozesse bekommen so viel Speicher wie sie brauchen,die Speicherbereiche sind also flexibel. Gute Speicherausnutzung, aber externe Fragmentierung durch die unterschiedlichen Grössen der Porzesse (dies kann durch Compaction = dynamic relocation verhindert werden).
Paging - der Speicher wird in Seiten gleicher Grösse eingeteilt, von denen ein Prozess beliebig viele (unzusammenhängende) zugeteilt bekommt. Jeder Prozess bekommt eine Page Table mit deren Hilfe die Page-Adressen in reale Adressen umgerechnet werden können.
Die Speicheradressen setzt sich aus drei Teilen (Offsets) zusammen. Der erste Teil ist die Adresse im Page Directory des Prozesses, mit ihr wird der richtige Page Table adressiert. Der zweite Teil kann mit Hilfe des Process Page Tables in die physische Page Nummer umgerechnet werden. (Aus der sich mit der Pagegröße dann die physische Startadresse der Page im Speicher errechnen lässt.) Der zweite Teil gibt den Offset innerhalb der Page an, den Wert der noch auf die Startadresse der physischen Page drauf gerechnet werden muss, um die endgültige Adresse im Speicher zu erhalten.
Die MMU ist ein Hardware-Teil welche das umrechnen von logischen in physische Speicheradressen übernimmt (s.o.), damit dies nicht bei jedem Speicherzugriff per Software erledigt werden muss.
Das Virtual Memory Konzept beduetet, dass nicht das komplette Programm im Speicher vorhanden sein muss. Dies ist für das Programm aber nicht ersichtlich, da die jeweils benötigten Bereiche nachgeladen werden. Der Vorteil liegt darin, dass auch Programme ausgeführt werden können die größer als der Hauptspeicher sind, und dass sich Programmierer keine Gedanken um Speicherbegrenzungen machen müssen. Der Nachteil ist, dass dieses Konzept in einem Real-Time System zu zu grossen Verzögerungen führen würde, und daher für diesen Anwendungsfall ungeeignet ist.
Swapping an Sich bedeutet zunächst einmal, dass Teile des Hauptspeichers (im Zweifelsfall ein ganzer Prozess) auf einen Sekundärspeicher ausgelagert werden, um bei Bedarf von dort wieder in den Primär-Speicher geladen zu werden. Paging bedeutet hingegen, dass nur einzelne Pages ausgelagert und wieder geladen werden. Ja beide Techniken lassen sich kombinieren.
Durch das Valid-Invalid Bit des Page Table Entrys.
Optimal Algorithm - die Seite die am längsten nicht gebraucht werden wird, wird ausgelagert. Zukunftswissen = unmöglich!
First-In-First-Out (FIFO) - die älteste Seite wird ersetzt.
Least-Recently-Used (LRU) - die Seite auf die am längsten nicht bzw. am wenigsten zugriffen wurde, wird ersetzt.
Clock-Hand-Algorithm - bei Zugriff auf eine Seite wird ein Referenz-Bit gesetzt. Ist dieses Bit innerhalb einer gewissen Zeit nicht gesetzt, kann die Seite ersetzt werden.
Two-Handed-Clock-Algorithm - in einem zweiten Cyclus wird das Referenz-Bit immer wieder auf Null gesetzt.
Weil jeder Zugriff das Update mehrerer Strukturen in Speicherverwaltung nach sich ziehen würde.
Er besteht aus den erwähnten Control-Bits und der Frame-Adresse. Die Control-Bits geben Auskunft darüber ob sie Seite im Hauptspeicher ist, seit dem Laden verändert wurde, für andere Prozesse zum sharing freigegeben ist etc.
Trashing bedeutet, das System ist mehr mit Swpping als mit der Ausführung von Instruktionen beschäftigt. Es kann durch das bilden von Working-Sets verhindert werden. In diesen wird (durch Beobachtung) festgehalten welche Seiten ein Prozess auf jeden Fall zum arbeiten braucht, damit diese nicht gleich wieder ausgelagert werden.
Appilcation - ???
Complexity of Control
Unit of transfer - byte streams oder large blocks
Data representation - encoding schemes
Error conditions - wie die Geräte auf Fehler reagieren
character-stream oder block orientiert
sequentiell oder random access
synchron oder asynchron
Weil Prozesse auf die Beendigung der I/O-Requests warten müssen.
Und weil bestimmte Pages wärend des I/O im Hauptspeicher bleiben müssen ???
Buffer: Singel-Buffer, Double-Buffer, Circluar-Buffer
Kernel -> Kernel I/O Subsystem -> Device Driver -> Device Controller -> Device
FIFO, Priority, Last In First Out, Shortest Seek Time First, SCAN (Elevator)
Eigenschaften: Seekt time + Rotational delay = Acces time ( + transfer time)
Es sollte die Anforderungen der Benutzer und des Data Management erfüllen.Dies bedeutet, dass die Daten in den Files korrekt sind, und eine möglichst optimale Performance, sowohl aus Sicht des Benutzers als auch des gesamten Systems, bieten. Ausserdem sollte es möglichst viele Medien unterstützenund den Datenverlust minimieren. Des weiteren sollte es eine standardisierteSchnittstelle für den Zugriff bieten, und auch die Erfordernisse einesMultiuserbetriebs erfüllen.
Access Methode - sequentiell, indiziert, etc.
Logical I/O - files und records, basis daten über Dateien
Basic I/O Supervisor - start und ende der I/O Operationen, Optimierung
Basic File System (or physical I/O level) - Datenblöcke austauschen, Blöcke imHauptspeicher puffern
Device Driver - direktes Ansprechen der Geräte
Dateien auffinden und lokalisieren, Directorys für die Dateien und deren Metadaten verwalten, Zugriffscontrolle, Zugriff auf offene Dateien blocken,freien Speicher für Dateien allozieren, freien Speicher verwalten
Pile File - Daten werde hintereinander geschrieben, keine festen Strukturen, Zugriff nur über Suche möglich
Sequential File - fixe Struktur, im Prinzip eine DB-Tabelle auf die Updates als Batches realisiert werden, Zugriff über Schlüsselattribut
Indexed Sequential File - s.o. aber mit Index für die Suche und Zugriff, mehrere Indizes möglich, Überlauffile nötig
Direct or Hashed File - Hashfunktion errechnet aus Key field den direkten Zugriff
Verzeichniss sind selber Dateien die nur aus Verweisen auf anderen Dateien und Verzeinisse bestehen und unter anderem folgende Daten enthalten können: Attribute, Location, Ownership, Name, etc.
Synchronisation ist notwendig um Inkonsistenzen zu vermeiden => locking.
Mandatory - wenn gelocked, dann werden alle Zugriffe gesperrt.
Advisory - wenn gelocked, sollten weitere Lockversuche verhindert werden
Shared - für Lesezugriffe
Exclusive - für Schreibzugriffe
Bit Vector - jedes Bit repräsentiert einen Block
Linked List - freie Blöcke verweisen in einer Liste immer auf den nächsten
Grouping - eine Linked List bei der grössere freie Blöcke zusammengefasst werden
Bei einem Netzwerk-Betriebssystem weiss der Nutzer, dass mehrere Rechner die Dienste erbringen, da er sie jeweils einzeln nutzne müssen/können. Bei einem verteilten Betriebssystem hingegen muss der Benutzer nicht merken bzw. wissen, was lokal oder remote passiert, da remote services Nutzer-transparent passieren.
Resource Sharing
Computation Speedup
Reliabilty
Communication (???)
Die Maschienen sind hochgradig spezialisiert auf ihre jeweiligen Aufgabe. Server sind hoch performante Rechner die Resourcen anbieten, Clients sind Enduser-freundliche Workstation.
RPCs verlagern eine Operation komplett auf einen remote Rechner. Zunächst erfragt der Client durch den Matchmaker/Portmapper auf welchem Port des Servers er die Funktion erreichen kann. Nach der Anwort wird die ursprüngliche Nachricht an den neuen Port auf dem Server geschickt und der Client wartet bis der Service ihm die Antwort zusendet.
Middleware soll das OS und das Networking kapseln, so dass jeder Rechner völlig transparent auf alle angebotenen Resourcen im Netz zugreifen kann, egal welche Plattform, OS etc. auf Server und Client laufen. Die Middleware platziert sich als zusätzliche Schicht über der Netzwerk-Kommunikation. Alle Anwendungen Client und Server greifen auf die gleiche Middleware API zu um miteinander zu kommunizieren.
Clustering ist eine Alternative zu SMP, bei der mehrere Rechner alle den identischen Dienst anbieten. Ein Cluster ist ein Zusammenschluss mehrerer Rechner zu einer extern einzigen Einheit.
Beim transferieren eines Prozesses auf einen anderen Rechner ergibt sich das Problem, dass die belegten Resourcen des Prozess nicht umbedingt mit transferiert werden können. Eigentlich müsste es in einer verteilten Umgebung eine zentrale Instanz geben, die den Überlick über alle Stati hat, um die üblichen Probleme wir Starvation, Deadlocks und Mutual Exclusion richtig handeln zu können. Dies ist allerdings sehr aufwendig (und vernichtet auch einige Vorteile der verteilten Umgebung ;). Distributed Mutual Exclusion kann über Nachrichten gelöst werden, das Problem des Delays durch das Netzwerk ist dabei aber nicht wirklich lösbar.
Amoeba ist ein objektorientiertes, verteiltes Betriebssystem, bei dem die unterschiedlichen Nodes über LAN und WAN kommunizieren.
Dateien können nach dem erstellen nicht mehr geändert werden. Statt dessen muss der Client das geänderte File komplett lokal neu erstellen um es dann als neues File an den Server schicken. Das alte File muss anschliessen explicit gelöscht werden.
Wie werden zwei neue unterschiedliche Kopien verhindert ?????????????????????????
s.o. commited files sind nur noch lesbar. Der Bullet Server stellt diesen File-Dienst zur Verfügung.
Das File System ist über mehrere Rechner verteilt. Server, Client und Storage müssen nicht auf dem gleichen Rechner laufen und sind auch nicht umbedingt expilzit ins OS integriert, sonder laufen als Anwendungen.
Beim nicht-lokalen Zugriff müssen die verschiedenen Versionen der Datei in den verschiedenen Caches berücksichtig werden.
Die Clients machen Write-through, der Server Delayed-write, und generell write-on-close ??????????????????
Aber wie werden Client-Cache-Kopien konsistent gehalten????????????????????
Statefull- und Stateless-Server. Beim Statefull-Server vergibt der Server für jede Datei die ein Client öffnet einen eindeutigen Identifier und hält die Verbindung zum Client und die Dateien offen. Dies hat eine gute Performance zur Folge, ist im Falle eines Crashes aber mit sehr viel Recovery Aufwand verbunden. Beim Stateless-Server hingegen müssen in jedem Request alle benötigten Informationen mitgeschickt werden, da der Server diese Requests alle immer unabhängig voneinander bearbeitet. Ein Crash-Recovery ist einfacher, aber dafür erheblich schlechtere Performance.
Datei Replikation beduetet, dass die Datei regelmäßig auf einen anderen Rechner kopiert wird. Dies erhöht die Ausfallsicherheit und kann auch die Antwortzeiten erheblich verkürzen. Es kann dafür eingesetzt werden damit eine Datei nicht nur vom einem System abhängt, oder die Replikation wird über grosse Distanzen gemacht, um lokal die Antwortzeiten für diese Datei zu verkürzen.
Information security - Informationen schützen
Computer security - den Computer und seine Resourcen schützen
Network security - Übertragungen und Dienste im Netz schützen
Secrecy, Integrity, Availability
Interruption (availability), Interception (confidentiality), Modification (integrity), Fabrication (authenticity)
Hardware, Software, Data, Communication Lines and Networks
Monitor and controll access to resources, Isolation, Share or share nothing, Share via access limitations, Share via dynamic capabilities, Limit of use an object, Protection of memory, User-oriented Access Control, Data-oriented Access Control
Durch eine Zugriffs-Matrix in Form einer globalen Tabelle, Listen zu jedem Object (ACL), Capability List für Domänen, Lock-Key scheme
Symmetrische und Asymmetrische. Datei, Passwortverschlüsselung, Signaturen
Ein Zombie-Prozess entsteht, wenn ein Prozess endet, dessen exit-Status aber nicht (mehr) von seinem Elter ausgelsen wird.
Die Process structure beinhaltet unter anderem die PID, scheduling inforamtionen, memory management informationen, signals, resourcenbelegung, Prozessstatus, Flags
Weil die user structure auslagerbar ist, wichtige Informationen z.B. für das Scheduling aber ständig im Hautpspeicher verfübgar sein müssen (process structure). Die user strucutre enthält zusätzliche Informationen die aber nur zur Laufzeit des Prozess wichtig sind und daher ausgelagert werden können.
Im user-mode werden die normalen Befehle eines Programms ausgeführt (in diesem besteht kein direkter Zugriff auf irgend eine Teil des Kernels). In den kernel-mod wird zur Ausführung von system calls gewechselt, da hier der Zugriff auf Informationen im Kernle notwendig ist. Hierfür wird dann auch ein eigener Kernel-Stack statt des User-Stack benutzt.
Der fork Aufruf erstellt eine Kopie des aufrufenden Prozesses und verpasst der Kopie eine neue PID, Page Table und Hauptspeicher fürs Data-Segment (Variablen, Stack etc.). Hiermit können Kind-Prozesse erzeugt werden, die häufig zur Ausführung andere Programme verwendet werden.
Hierbei werden so wenig wie möglich Kopien erstellt, sondern zunächst immer auf den Speicher des Elter verwiesen. Das Protection Bit sorgt dafür, dass wenn ein schreibender Zugriff auf einen dieser Speicherbereiche stattfindet eine Kopie erstellt wird, auf der dann die Änderung durchgeführt wird.
Nach einem vfork Aufruf teilt das Kind den Adressraum mit seinem Elter. Dies stellt nur eine möglichst schnelle und resourcenschonende Art dar einen Kind-Prozess zu erzeugen, der dann normalerweise gleich execve aufruft um ein anderes Programm zu starten, bei dessem Aufruf sowieso alle Process-Strukturen neu erstellt werden.
User-level Threads sind normalerweise für das OS unsichtbar und werden mit Hilfe einer Lib innerhalb eines Prozesses gescheduelt und verwaltet. Keine hoher Verwaltungsaufwand fürs OS, portable (wo die Lib zur Verfügung steht), aber ein System call blockt alle anderen user-level threads. Kernel-level Threads hingegen sind für das OS sichtbar und können damit auch vom ihm geschedueledt werden (z.B. system call oder multiprocessor), dafür nicht portable, und Zeitaufwendiges Scheduling durch das OS.
Ein Leight-Weight-Process stellt die Brücke zwischen user-level und kernel-level thread dar.
Aus der Processor State Struktur wurde eine verkettete Liste der Zustände der LWPs gemacht, und der LWP hat die States Runnig, Stopped, Active und Runnable bekommen.
Da Bottom-Half-Aktivitäten Kernel-Daten verändern, dürfen sie hierbei nicht unterbrochen werden, d.h. weitere Interrupts müssen geblocked werden und dafür die Interrupt-Handler eine hohe Priorität bekommen.
Damit mehrere Interrupts gelichezeitig bearbeitet werden können gibts es in Solaris einen Pool von Kernel-Interrupts-Threads die diese bearbeiten. Dies ist mit zusätzlich Syschronisationsaufwand (Mutaul Exclusion) verbunden, gibt aber eine deutliche bessere Performance beim Interrupthandling.
Weil Bottom-Half Routinen normalerweise von Interrupts ausgelöst werden und daher mit dem Process-Mamagement nichts zu tun haben. Sonst könnte der Interrupts eines I/O Device z.B. Prozess killen.
Der nice-Wert gibt die vom User gewünschte Prioriät des Prozesses wieder. Er wird bei der Berechnung der realen Priorität berücksichtig, d.h. damit kann wircklich, in begrenztem, Rahmen auf die Priorität einfluss genommen werden.
Die Core-Map ist eine Repräsentation des gesamten Hauptspeichers, in der Informationen festgehalten werden wie Owner, Type of segment, Adresse auf dem Swap device und Flags (unter anderem welcher Speicher frei ist).
Regions sind eine Zusammenfassung der belegten Pages eines Prozesses. Damit kann Speicher in grösseren Blöcken verwaltet werden (alloc, detach, share, grow, etc.)
Der Page daemon process (BSD) oder Page Staeler (SysV) entscheidet mit dem Two-Handed-Clock algorithm welche Seiten verdrängt werden. Dazu gehört, dass er eine Speicherreserve bildet, Wroking-Set für Prozesse anlegt, low- und high-water-marks beobachtet, und die Seiten aufs Swap-Devices schreibt und lädt.
Statt die Lib-Funktionen statisch in die Bins zu kopieren/linken, werden nur dynamische Adressen im Bin vermerkt, die bei Ausführung des Programs aufgelöst werden, indem die Lib in den Speicher geladen, und die Adressen der Lib in den Adressraum des Programms eingeblendet werden.
Werden dafür immer noch host und target lib (libc_s.a und libc_s) benötigt ??????????????????
File-Deskriptoren sind ``kleine'' Repräsentanten (Integer) des richtigen Files. Im Prinzip nur die Nummer des Eintrags in der Tabelle der offenen Files des Prozesses.
Ein Filesystem pro Partition. Das Root-FS ist immer verfügbar, alles andere wird/kann dazugemountet werden. Der Superblock enthält die statischen Informationen über das FS. Der Boot-Block ist der erste Sector des Devices und enthält eventuell einen bootstrap. Inode und directory Struktur.
Directories sind ebenfalls nur Dateien, die nur aus Verweisen auf die Datein und Verzeichnisse innerhlab dieses Verzeichnisses enthält.
Ein Indexed-Node ist die grundlegende Repräsentation einer Datei. Er enthält Daten wie Ownership, Datumsinformationen, Anzahl der Hard-Links, Art der Datei, und vor allem die Verweise auf die eigentlichen Datenblöcke der Datei. 12 direkte und 3 indirekte Verweise.
Table of open files -> File-strucutre table -> In-core inode list -> Datenblöcke
namei() dient dem auflösen eines Dateinames in einen inode-Pointer.
Das Ergebniss wird gecached damit der namei Kernel-Aufwand von 1/4 auf 1/10 reduziert wird.
Mehrere Zylinder auf einer Platte werden in einer Zylinder Gruppe zusammengefasst, da innerhalb dieser Gruppe nur minimale Kopfbewegungen stattfinden müssen. Ausserdem enthält jede Zylinder Grupper eine Kopie des superblocks.
Ist das nicht total veraltet ???????????????????????????
Entweder über eine linked-List im Superblock, oder über Bit-Map (Core-Map????).
Wenn es zu einem Crash wärend eines Schreibvorgangs kommt, muss das Dateisystem beim anschlissenden Reboot wieder in einen kosistenten Zustand gebracht werden. Dies wird noch dadurch erschwert, dass der Superblock jedes FS zur schnellern Verfügbarkeit im Speicher gehalten wird, und nur in bestimmten Intervallen (30 sec.) wieder auf die Platte geschrieben wird. D.h. das die Free List im Superblock nicht umbedingt der Wahrheit entsprechen muss.
Lock-Files verhinder den Zugriff auf Dateien solange diese Lock-Files existieren. Zum einen kann das Locking feiner gemacht erden, indem nur Byteweise und nicht mehr Fileweise gelocked wird (SysV). Zum anderen sollte ein Lockfile nur weiteres locking verhindern, aber lesende Zugriffe weiterhin erlauben.
Symbolische Links sind Verweise auf Dateien aus mehreren Stellen des Verzeichnissbaums. Bei einem Soft Link wird der Pfad zur Zieldatei gespeichert, d.h. die muss nicht umbedingt existieren (gelöscht, FS unmounted, etc.). Bei einem Hard Link wird die Nummer des Inode gespeichert an der die original Datei liegt, ausserdem wird der HardLink Counter in diesem INode erhöht, damit die Datei nicht gelöscht wird, wenn sie an der ursprünglichen Stelle aus dem Verzeichnissbaum entfernt wird. HardLinks funktionieren nur innerhalb eines FS da INode Nummer nur innerhalb eines FS eindeutig sind.
Pipes, shared memory, message queues, semaphoren, streams, sockets
Sockets bieten eine einfache, transparente und effiziente Art des Datenaustauschs für unabhängige Prozesse. Sockets sind aus Sicht der Prozesse Dateien auf die man auch die gleichen oder ähnliche Operationen wie auf Dateien anwenden kann. Zusätzlich kann man Sockets auch für die Kommuniaktion von Prozessen innerhalb eines Netzwerkes benutzen.
Streams bestehen aus einem Head und einem Driver an jedem Ende der Kommunikation. Durch diesen Strom kann man mittels Nachrichten kommunizieren. Sind sind flexibler als Sockets, weil sich hinter dem Treiber alles mögliche verbergen kann (ethernet, terminal, loopback, multiplexer).
Unterschied zu Sockets ??????????????????????????
Kernel Module sind kleine Stücke Code die in den Kernel geladen werden, und diesen normalerweise um neue Funktionen bzw. Symbole ergänzen. Diese Modules können nach dem Booten geladen, aber auch wieder entfernt werden. Daher kann man z.B. einfach neue Versionen neuer Module einsetzen. Allerdings haben Fehler in Modulen auch eine Kernelpanic zur Folge, da sie im Kernelmode laufen und nicht als Prozesse im User-Space.
Die Datenstrukturen bestehen aus drei Gruppen: der Prozess identiy, dem Enviroment und dem Context. Die Prozess indentity besteht aus der PID, den Credentials (User ID, Group ID), und der Personality (dient der Anpassung von System Calls). Das Enviroment wird geerbt (ändert sich nur bei einem execve Aufruf) und besteht aus zwei Null-terminierten Vektoren: dem Argument-vector und dem Enviroment-vector. Der Context besteht aus dem Scheduling context, dem Accounting context, der File Table, dem File system context, dem signal handler table und dem virtual memory context
Damit man beim Aufruf von clone() angeben kann welche Contexte das Kind mit dem Elter teilen soll, und welche nicht.
Threads können unter Linux als User-level threads oder als kernel-level threads realisiert werden. User-level threads werden vom OS nicht gesehen und daher als ein einziger Prozess gescheduled. Kernel-level threads werden über den clone()-Aufruf relaisiert, wobei Threads vom OS als vollwertige Prozesse angesehen werden. D.h. Linux macht eigentlich keinen Unterschied zwischen kernel-level threads und Prozessen. Der einzige Unterschied ist, dass man bei Aufruf von clone() angeben kann, welche Contexte der neue Thread mit seinem Elter teilen soll. Context-sharing und Threads als Prozess sind die Unterschiede zu anderen UNIXe.
Linux hat ein Virtuelles Filesystem als zusätzliche Layer über den eigentlichen Filesystemen, um von den eigenheiten der FS zu abstrahieren. Innerhalb des VFS gibt es drei Strukturen: das inode-object (die Datei als ganzes, mit Besitzer, Göße, Zeiten, etc.), das file-object (der Pointer in die Daten des Files selber auf den die eigentlichen Dateioperationen wie read(), write() wirken, und der nur einem Prozess zugeordnet ist) und das file-system object (ein Filesystem als ganzes).
Das Proc Dateisystem ist kein wirkliches Dateisystem da es keinen Inhalt besitzt. Die Daten werden für jeden Request dynamisch wieder neu erzeugt. Man findet in diesem FS alle System-Informationen und kann mit Schreiboperationen sogar einfluss auf das zukünftige Systemverhalten nehmen. z.B. parst PS nur den inhalt des Proc-FS anstatt den Process-Tabel im Kernel direkt in Anspruch zu nehmen.
Signals, Pipes, Messages queues, Semaphoren, Shared Memory
Was ist mit Sockets ??????????????????????
Eine schichtenbasierte Architektur (HAL, Kernel, Executive), mit einem Mikro-Kernel, da erheblich mehr als nur die Basisdienste im Kernel-Mode laufen. NT beherrscht preemptives Multitasking, aber keine Multi-User Betrieb.
Mikro-Kernel ???????????????????????????
Der Kernel ist nur für Thread scheduling, Interrupt handling, Processor synchronisation, und Recovery after Power failure zuständig. Die Executive hingegen bietet Object Manager, Virtual-memory management, Security reference monitor, I/O manager und Local procedure call facility.
Executive -> Process und Thread manager ????????????????????????? Folie 10
Der Hardware Abstraction Layer dient der Vereinheitlichung der Hardware, damit der Kernel leichter auf andere/neue Plattformen portiert werden kann. Er bietet SMP Support, ein Virtual Machine Interface und ist als ladbares Module implementiert. Aus Performancengründen kann der HAL aber z.B. vom I/O System der Executive umgangen werden.
Handles sind für jeden Prozess eindeutige Interfaces zu allen Objekten die vom Objekt Manager vergeben werden. Und in NT sind alle Services als Objekte realisiert, zu denen man ein Handle braucht, um sie benutzen zu können. Mit diesen Handles werden auch Security und Accountign betrieben.
Der Object Manager vergibt die Handles für alle Objekte. Er verwaltet auch die Anzahl der Referenzen auf ein Objekt, überwacht die Sicherheitsaspekte bei der Benutzung von Handles, Quotas für die Anzahl von Handles, etc.
Prozesse sind in NT eigentlich nur der Kontainer mit den Gemeinsamkeiten der in ihm enthaltenen Threads. Denn geschedulet werden unnter NT Threads. Der Process Block enthält Verweise auf das Process Enviroment, die Thread Blocks, den Win32 Process Block und den Handle Table. Der Thread Block enthält wieder Verweise auf den Thread Enviroment Block, der dann mit dem Process Enviroment Block, das komplette Enviroment für den Thread ergibt.
Fibers entsprechen User-level Threads unter UNIX. (Light-Weight-Threads)
Unter NT wird anhand von Priority Queues gescheduled. Es gibt 32 Prioriäten. 0-15 sind die normalen variablen Prioritäten. 16-31 sind Real-Time Prioritäten. Es gibt einen speziellen Idle-Thread und einen Balance-Manager der Starvation verhindert. Zusätzlich zu der Priorität eines Prozesses gibt es noch ein Quantum, dass angibt wie lange der Prozess rechnen darf. Nach dem warten auf Resourcen werden Priority-Boosts vergeben (aber nur an 0-15 Priority-Processes), zur Steigerung der Performance. Das Fenster im Vordergrund hat immer die höchste Priorität. Priority Boosting kann vom Prozess selber abgestellt werden.
LPCs sind wie RPCs aber nur auf der lokalen Maschine. Es dient der Client Server IPC auf einer Maschine. Über die aufgebauten Channels können Nachrichten ausgetauscht werden, oder größere Datenmengen über shared Memory.
Der Security-Reference-Monitor (SRM) überprüft bei allen Handles ob der Prozess die nötigen Rechte hat, um die gewünschten Aktionen vorzunehmen. Ausserdem kann er Rechte verändern, und generiert im Zweifelsfall Warn-Meldung bei Rechte-Verletzungen.
Der I/O Manager verwandelt alle Anfragen in I/O Request Packets (IRP), die dann an den jeweiligen Treiber weiter gereicht werden. Nachdem der I/O Manager den IRP mit Ergebniss zurück erhalten hat, vollendet er den Request des Process. IRP sind also eine standardisierte Schnittstelle für alle I/O Requests, die z.B. auch das Caching von I/O Requests vereinfachen.
Der I/O Manager behandelt alle I/O Requests und arbeitet dabei sehr eng mit dem VM Manager zusammen. Im einzelnen File Systems, Cache management, Device driver und network driver.
Unterschied: eine zentrale I/O Instanz, die keine Unterschiede bei den I/O Devices macht (Block, Stream), und sich auch um das Cahcing kümmert?????????????????????????????????????????
Das Enviromental Subsystem ist ein zusätzlicher Layer über der eigentliche Ausführungsebene, mit dem es möglich ist Programme für verschiedene Systeme unter NT laufen zu lassen (DOS,Win32, OS2, POSIX). Dafür werden dann die jeweiligen APIs und sogar das Filesystem angepasst, ein mixen der APIs ist aber nicht möglich/erlaubt.
Ein Volume entpricht bei NTFS einem logischen Laufwerk. Als höhere Abstraction von einzelnen Sektoren auf der Platte dienen Cluster, die dann als logische Adresse für ein Volumen dienen. Alle Metadaten werden in einem zentralen File gespeichert.
Im Gegensatz zu UNIX ist eine Datei nicht einfach nur ein Byte-Stream, sondern ist ein strukturiertes Objekt, welches aus mehreren Attributen besteht, die wiederrum Byte-Streams sind. Diese Attribute innerhlab eines Datei-Objektes können erzeugt, gelöscht, gelesen und geschrieben werden. Normalerweise bestehen einfache Dateien aber nur aus einem Attribut, welches dann alle Daten enthält. Ausnahme sind hier aber z.B. Directorys.
Das Master File Table (MFT) ist ein Array welches in einer speziellen Datei gespeichert wird, deren Größe beim Erzeugung des Dateisystems festgelegt wird. Sie dient zur Speicherung kleiner (residenter) Attribute, kann aber auch zur Speicherung von bulk data attriutes und damit zur kompletten Speicherung kleiner Dateien verwendet werden. Dies hat den Vorteil, das weniger Fragmentierung auf dem FS zu erwarten ist.
Der Log Service funktioniert wie alle Logging-Files-Systems ;). Veränderungen an Datei werden wie Transaktionen behandelt. Sie werden zuerst in dem Log festgehalten, und nach der Ausführung der Änderung wird dies ebenfalls im Log festgehalten. Dies ermöglicht eine einfach Rekonstruktion des FS nach einem Crash, wobei hier nur die Metadaten des FS in einen konstitenten Zustand gebracht werden, und nicht die eigentlichen Nutzdaten in den Dateien.
Der Server unterstützt bis zu 4 Prozessoren, wärend die Workstation Version nur 2 Prozessoren unterstützt.
Bestimmte Parameter in den unterschiedlichen Versionen beeinflussen das Scheduling-Verhalten.
Sinn: Geldscheiderei, schliesslich ist MS Monopolist :-)
This document was generated using the LaTeX2HTML translator Version 2002-2 (1.70)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -no_subdir -split 0 -show_section_numbers /tmp/lyx_tmpdir27104JuxJjj/lyx_tmpbuf0/Betriebssysteme_Zusammenfassung.tex
The translation was initiated by Nils Ohlmeier on 2003-07-22