VHPD Blog Blog for [V]ideo, [H]ardware, [P]rograms, [D]ata and more..

16Feb/11

Grundlagen der Informatik – Routingtabelle

Grundlagen der Informatik - Routingtabelle - Routing Information Base

Da wir nun wissen, wie unser Netzwerk aufgebaut wird mit Subnetting, müssen wir nun unsere Router und Endgeräte konfigurieren, damit diese auch im Einsatz wissen, wie sie mit den kommenden Paketen umgehen müssen.

Einige werden sich vielleicht nun fragen, wieso denn die Endgeräte eine Routingtabelle führen müssen, aber der Grund ist eigentlich offensichtlich.
Unsere Netzwerkkarte muss wissen, wie Sie das Paket verschicken muss, damit es auch das Ziel erreicht. Denn die Netzwerkkarte muss wissen, ob es lokal, im eigenen Netzwerk oder in einem entfernten Netzwerk liegt.

Die Routingtabelle kann man auch jederzeit in der Konsole ausgeben lassen, unter Windows lautet der Befehl "route print".

routingtabelle_windows_vhpd

Diese Routingtabelle wurde von Windows 7 automatisch erstellt und auffallend sind hierbei die doppelten Einträge.

Die Routingtabelle hat folgende Spalten: Netzwerk-Adresse, Subnetzmaske, Gateway/Router und Schnittelle.

Im Folgenden werden wir nun das Beispiel vom Subnetting-Artikel aufgreifen und daraus die Routingtabellen erstellen.
- Zu unserem Subnetting Beispiel ->

router_einteilung_subnetting_vhpd

Für den Anfang werden wir die Routingtabelle des Router 1 erstellen:

Zielnetzadresse Subnetmask Gateway/Router Schnittstelle Bemerkung
127.0.0.0 /8 = 255.0.0.0 127.0.0.1 127.0.0.1 localhost
192.168.1.0 /28 = 255.255.255.240 192.168.1.14 192.168.1.14 eigenes Netz (Entwicklung)
192.168.1.40 /28 = 255.255.255.240 192.168.1.46 192.168.1.46 eigenes Netz (Fertigung)
192.168.1.52 /30 = 255.255.255.252 192.168.1.54 192.168.1.54 eigenes Netz (RouterNetz2)
0.0.0.0 /0 = 0.0.0.0 192.168.1.53 192.168.1.54 default Gateway (Router2)

Der erste Eintrag: lokalhost. Dieser Standard hat jedes Endgerät automatisch integriert, jedoch ist dieser bei dem Router nicht unbedingt notwendig.

Danach kommen alle Netzwerke, die direkt am Router verbunden sind und nicht über einen weiteren Router bzw. Gateway laufen. Diese direkt anliegenden Teilnetze nennt man auch "eigene Netze", bei diesen ist die Schnittstelle und die Gateway/Router Angabe dieselbe, da der Router direkt das Paket ohne Hilfe eines weiteren Router ausliefern kann.

Auch das RouterNetz2 müssen wir als eigenes Netz eintragen, diese Einstellungen werden aber heutzutage von den meisten Routern automatisch konfiguriert.

Der letzte Eintrag 0.0.0.0 /0 ist für alle Pakete gültig und deshalb wird dieser Eintrag auch "Default Gateway" genannt. Somit werden alle Pakete, die der Router nicht direkt austeilen kann, an den dort eingetragenen Router weitergesendet. Dieser kann dann über den weiteren Verlauf des Datenpakets entscheiden.
Das Default Gateway ist auch für das Internet notwendig, denn somit kommen auch die Internetpakete mit netzfremden IP-Adressen an das Ziel.

Router 2

Zielnetzadresse Subnetmask Gateway/Router Schnittstelle Bemerkung
127.0.0.0 /8 = 255.0.0.0 127.0.0.1 127.0.0.1 localhost
192.168.1.52 /30 = 255.255.255.252 192.168.1.53 192.168.1.53 eigenes Netz (RouterNetz2)
192.168.1.48 /30 = 255.255.255.252 192.168.1.49 192.168.1.49 eigenes Netz (RouterNetz1)
192.168.1.32 /29 = 255.255.255.248 192.168.1.38 192.168.1.38 eigenes Netz (Lager)
192.168.1.0 /28 = 255.255.255.240 192.168.1.54 192.168.1.53 entferntes Netz (Router1 | Entwicklung)
192.168.1.40 /29 = 255.255.255.248 192.168.1.54 192.168.1.53 entferntes Netz (Router1 | Fertigung)
0.0.0.0 /0 192.168.1.50 192.168.1.49 default Gateway (Router3)

Der Router 2 spielt eine bedeutende Rolle, da er entscheiden muss, ob das Datenpaket nach oben zum Router 1 oder nach rechts zum Router 3 muss.

Zuerst aber kommt wieder wie oben beschrieben der localhost und danach kommen alle "eigene Netz" Einträge. Diese Routernetze müssen am Anfang eindeutig festgelegt werden, mit der gleichen Schnittstelle und Gateway/Router wird das Datenpaket von dem Router aus zum Zielrouter gesendet.

Zum ersten Mal haben wir nun eine Aufteilung der Pakete zu unterschiedlichen Routern, diese "entfernte Netzte" müssen wir nun sorgfältig trennen. Wenn wir uns den Netzwerkplan anschauen, müssen Pakete der Entwicklung und Fertigung zum Router1 und alle anderen die nicht im eigenen Netzwerk sind müssen zum Router 3. Hierbei muss man nun achten, dass man bei der Schnittstelle die EIGENE ROUTER-IP-ADRESSE angibt und bei Gateway/Router muss man die ZIEL ROUTER IP-ADRESSE angeben.

16Feb/11

Grundlagen der Informatik – Subnetting CIDR und VLSM

Grundlagen der Informatik - Subnetting mit CIDR und VLSM

Immer wichtiger wird das Verbinden von Computern, sei es Daheim oder in der Firma. Aus diesem Grund muss das Netzwerk so gut wie möglich geplant werden, damit es im Einsatz auch allem Stand hält.

Allgemein ist die Netzwerktechnik ein großes Themengebiet, in diesem Beitrag werden wir uns das Subnetting-Verfahren genauer anschauen.

Als Beispiel planen wir nun das Netzwerk innerhalb einer größeren Firma, die eine Entwicklung, Fertigung, Verwaltung und ein Lager hat. Diese Netzwerke sollen mittels des Subnetting-Verfahren sauber getrennt werden, um ein effizientes und sicheres Netzwerk aufzubauen. Man muss dazu noch beachten, dass in der Entwicklung für ein bevorstehendes Erweitern der Abteilung 5 Adressen reserviert werden sollen. Die Verwaltung soll auch 2 IP-Adressen reserviert halten.

start_subnetting_vhpd

Wenn man Subnetting verwendet, muss man sich aber auch vorab im Klaren sein, dass Router benötigt werden, die einzelne Teilnetzwerke miteinander verbinden. Ohne einen Router ist somit die Kommunikation mit einem anderen Teilnetzwerk nicht möglich.

Wir haben als Ausgangsnetz das Netzwerk: 192.168.1.0 /24 gegeben. Diese IP Adresse ist die Netzadresse und das im hinteren Teil, die "/24" weißt auf die Anzahl der 1 in der Subnetmask hin. In unserem Beispiel haben wir die ersten 24 Stellen der Maske auf 1 gesetzt und die restlichen 8 sind null:

1111 1111 . 1111 1111 . 1111 1111 . 0000 0000  (/24 Binär)
255 . 255 . 255 . 0 (dotted decimal, die übliche Angabe)

Mit dieser Information wissen wir nun, dass wir die Restlichen Adressen von 192.168.1.0 bis 192.168.1.255 verwenden dürfen. Es dürfen sich nur immer die Stellen ändern, die mit Nullen markiert sind!

Das Subnetting beinhaltet zwei verschiedene Verfahren:

  1. CIDR (Classles Inter-Domain Routing)
    Hier wird eine feste Subnetzsmask für alle Teilnetzte festgelegt. Dadurch haben wir jedoch das Problem, dass bei unterschiedlichen Größen von Teilnehmern in einem Teilnetzwerk wir das größte Verwenden müssen. Bei unserem Beispiel müssten wir für 5 Adressen Reservieren und dann hätte das Lager auch 5, obwohl es nur 2 bräuchte.
  2. VLSM (Variable-Length Subnet Masking)
    Hier bekommt jedes Teilnetz eine eigene Subnetzmask, die sich anhand der Anzahl der teilnehmenden Geräte orientiert. Dieses Verfahren ist komplexer, da man auf mehrere Fälle achten muss, damit es reibungslos funktioniert.

Für die optimale Nutzung werden wir das VLSM-Verfahren verwenden.

Lösung des Problems: Einteilen der Teilnetze mit dem Erweitern von Netzwerkgeräten.

einteilung_subnetting_vhpd

Um ein wirklich effektives Netzwerk zu erhalten, muss man darauf achten, dass die Kollisionsdomänen möglichst gering gehalten werden und natürlich müssen innerhalb eines Teilnetzes die einzelnen Endgeräte mittels einem Switch verbunden werden. Die Router sind somit über einen Switch zu den einzelnen Teilnetzen verbunden. Man kann auch deutlich erkennen, dass wir 3 Router verwenden, die auch eine direkte Verbindung zum anderen Router haben. Natürlich ist es auch möglich einen 5 Port Router zu verwenden, der zwischen 5 Teilnetzen Arbeiten kann, jedoch aufgrund baulicher Begebenheiten ist es oftmals nicht möglich das so zu organisieren und deshalb werden mehrere Router verwendet.

Wir haben nun Folgende Teilnetze:

  1. Entwicklung - Teilnetz 1 mit 5 Endgeräten + 5 reservierte Adressen + dem Router-Port = 11
  2. Verwaltung - Teilnetz 2 mit 4 Endgeräten + 2 reservierte Adressen + dem Router-Port = 7
  3. Lager - Teilnetz 3 mit 2 Endgeräten + 1 = 3
  4. Fertigung - Teilnetz 4 mit 2 Endgeräten + 1 = 3

    Das war jetzt jedoch nicht alles, da die Netzwerke zwischen den Routern und dem Internet auch beachtet werden müssen, für eine Reibungslose Verwendung.

  5. Router-Netz 1 mit 2 IP-Adressen
  6. Router-Netz 2 mit 2 IP-Adressen
  7. Internet-Netz

Es ist Notwendig, damit man bei dem VLSM-Verfahren das größte Netzwerk zuerst verwendet, da kleinere Netzwerke nur an der Stelle eines Vielfachen der Subnetmask starten können.

Hier ist der Vergleich zwischen den VLSM und dem CIDR Verfahren:

vergleich_vlsm_und_cidr_subnetting_vhpd

Weiteres notwendiges Wissen:
Jedes Teilnetz brauch 2 Adressen mehr, die für die Netzadresse und dem Broadcast verwendet werden!

Im folgenden Schritt müssen wir jetzt schauen, wie groß die Subnetmask sein muss, damit alle Geräte untergebracht werden:

Subnetmask und Anzahl der Verfügbaren Adressen

/24 = 255.255.255.000 hat 256 Adressen - Netzadresse und Broadcast = 254 IP-Adressen
/25 = 255.255.255.128 hat 128 Adressen - (NA + BC) = 126 IP-Adressen
/26 = 255.255.255.192 hat 64 Adressen - (NA + BC) = 62 IP-Adressen
/27 = 255.255.255.224 hat 32 Adressen - (NA + BC) = 30 IP-Adressen
/28 = 255.255.255.240 hat 16 Adressen - (NA + BC) = 14 IP-Adressen
/29 = 255.255.255.248 hat 8 Adressen - (NA + BC) = 6 IP-Adressen
/30 = 255.255.255.252 hat 4 Adressen - (NA + BC) = 2 IP-Adressen

Daraus können wir nur ablesen, welche Subnetmask jedes Teilnetzwerk brauch:

Entwicklung = 11 IP-Adressen, also /28 = 255.255.255.240 -> 3 IP-Adressen ungenutzt
Verwaltung = 7 IP-Adressen, also /28 = 255.255.255.240 -> 7 IP-Adressen ungenutzt
Lager = 3 IP-Adressen, also /29 = 255.255.255.248 -> 3 IP-Adressen ungenutzt
Fertigung = 3 IP-Adressen, also /29 = 255.255.255.248 -> 3 IP-Adressen ungenutzt

RouterNetz1 = 2 IP-Adressen, also /30 = 255.255.255.252 -> 0 IP Adressen ungenutzt
RouterNetz2 = 2 IP-Adressen, also /30 = 255.255.255.252 -> 0 IP Adressen ungenutzt

Als letzten Schritt müssen wir nun die Netzadressen, Subnetmask, Broadcast und den Hostadressbereich festlegen:

loesung_problem_subnetting_vhpd

Nun muss man die Hostadressen bei den Endgeräten festlegen und innerhalb den Routern die Routingtabellen erstellen, diese werden im nächsten Beitrag ausführlich erklärt.

Update: Lösung wurde verbessert, da es einen kleinen Fehler bei der Adressvergabe gab.

20Dez/10

Grundlagen der Informatik: Memory Management Unit MMU

Grundlagen der Informatik: Memory Management Unit MMU

Damit unser Prozessor nicht selbst die logischen Adressen umrechnen muss zu den tatsächlich Adresse im Hauptspeicher gibt es eine MMU. Warum man diesen Teil Hardwaretechnisch ausgelagert hat versteht sich von selbst, da durch diese Rechnungen vom Prozessor pro Zugriff wertvolle Zeit verloren geht.

memory_management_unit_vhpd

Bei dieser Grafik wird deutlich, dass der CPU vom die logische Adresse weitergereicht wird, an die MMU, diese überprüft zuerst, ob sich die logische Adresse überhaupt in dem freigegebenen Adressraum des Programms befindet. Die Überprüfung ist ganz simpel, da einfach überprüft wird, ob die Adresse größer ist, als das Grenzregister der Anwendung.
Dadurch kann das Programm nicht eine logische Adresse anfordern, die weit über dem Programm freigegebenen Speicher liegt, um Daten von einem anderen Programm auslesen zu können.

Nun wird die Seiten Nr. ermittelt, dieser Vorgang ist nicht weiter komplex, da die logische Adresse binär maskiert wird. Um das nachrechnen zu können mit dezimalen Adressen, kann man die gesamte logische Adresse durch die Seitengröße teilen. Sollte das Ergebnis nicht ganzzahlig sein, so wird einfach alles nach dem Komma weggestrichen.

Im Nächsten Schritt wird die Prozess/Programm abhängige Seitentabelle geladen und die herausgefundene Seiten Nr. gesucht. Sobald diese gefunden wurde, wird die Rahmen Nr., bzw. die genaue Block-Anfangs-Adresse im Hauptspeicher herausgeladen und ersetzt die Seiten Nr. der logischen Adresse. Das kann man dezimal mit einer einfachen Addition erledigen.

logische Adresse - Seiten Nr. * Seitengröße = Displacement

2055 - 1 * 2048 = 7 -> Das Ergebnis ist das Displacement (Seitengröße in diesem Beispiel: 2 KByte)

Nun wurde bereits oft über das Displacement geschrieben, das Displacement ist die Adresse innerhalb eines Speicherblocks zu dem gewünschten Dateninhalt.

Hierbei wird auch das PresentBit überprüft, wenn dieses nicht 1 (true) ist, dann befindet sich unser gewünschter Speicherblock nicht im Hauptspeicher sondern wurde Geswaped. Der Swap (Auslagerung) lagert unbenutzte Speicherblöcke auf die Festplatte aus, damit wir mehrere Programme öffnen können und auch Inhalte bearbeiten können, die größer sind als unser Hauptspeicher (z. B. Videobearbeitung von HD-Filmen). Jedoch verzögert das Swapen das Ausführen von einem Programm. Wenn auf einen solchen Block zugegriffen wird, wird das Programm blockiert und der Speicherblog wieder in den Hauptspeicher geladen (Pagefoult).
Dieses Phänomen kann man heute auch noch sehen, indem man viele Programme gleichzeitig öffnet und parallel laufen lässt, dadurch wird das System deutlich langsamer und die Programme werden wegen den Pagefoult immer kurzzeitig blockiert, hierbei entsteht die Wartezeit.

Zu der Block-Anfangs-Adresse (Rahmen Nr. * Seitengröße) wird nun das Displacement Addiert.

Nun haben wir die physikalische Adresse, diese kann nun auf den Datenbus gelegt werden, mit der Anweisung auf den Steuerungsbus.

20Dez/10

Grundlagen der Informatik: Der Hauptspeicher

Grundlagen der Informatik: Der Hauptspeicher

Jeder weis wie wichtig der Arbeitsspeicher bzw. Hauptspeicher bei einem PC ist, doch was macht er wirklich? Wie organisiert er seinen Inhalt und wie greifen die Programme darauf zu?

Ein Programm oder genauer gesagt, ein laufender Prozess, brauch im (Haupt-)Speicher Daten (Variablen, Attribute) und auch der Programmcode (Funktionen, Prozeduren).

ram_2_vhpd

Früher zu DOS Zeiten hat der Compiler/Linker die absoluten Adressen zu den Attributen, Variablen bzw. zu den Funktionen gelegt. Das ist auch einer der Gründe, warum DOS nicht Multitasking fähig war.

Heutzutage erstellt der Compiler/Linker bei dem kompilieren logische Adressen (beginnend ab 0) zu den Bestandteilen im Hauptspeicher, diese kann dann das Betriebssystem selbstständig verwalten und die logischen Adressen können dynamisch berechnet werden.

Logische Adressen kann man sich somit als eine vereinfachte Adresse vorstellen, die unser Betriebssystem frei verwalten kann und einer physikalischen Adresse zuteilen kann.

Ein weiterer Vorteil ist das dynamische Laden. Diese Bestandteile werden erst in den Hauptspeicher geladen, wenn sie für die Laufzeit notwendig werden. Vor allem bei Multitasking Systemen kommt es oft vor, dass 2 oder mehr Programme auf dieselbe Bibliothek zugreifen.

Natürlich wird auch hier jetzt klar, dass unser Betriebssystem jetzt die logischen Adressen frei Verwalten kann und den Arbeitsspeicher effizient verwenden kann. Mittels Paging wird der benötigte Speicher in Seiten bzw. Blöcken aufgeteilt und auf dem Arbeitsspeicher verteilt. In einer Seitentabelle kann nun nachgeschaut werden, wo sich der eigentliche Speicherplatz auf dem Hauptspeicher befindet.

Gemeinsam genutzte Bibliotheken - Bei dem ersten Aufruf des Programms einer Bibliothek, wird ein Platzhalter ("stab") erstellt, dieser untersucht dann ob die Bibliothek bereits geladen wurde. Wenn die Bibliothek noch nicht geladen wurde, wird sie geladen und der Platzhalter bekommt einen Link zu der geladenen Bibliothek. Wenn aber die benötigte Bibliothek vorhanden ist, wird sofort der Platzhalter entfernt und zeigt direkt auf die geladene Bibliothek.
Wenn das unser Betriebssystem das nicht verwalten würde, dann hätte jedes Programm die Bibliothek geladen und das würde unnötig den Speicher beanspruchen.

Jedes Programm hat seinen eigenen Speicherbereich und kann NICHT auf den anderen Speicherbereich zugreifen.
Dies ist aus Sicherheitsgründen notwendig, da sonst Viren oder andere Programme den Inhalt aus anderen Programmen einfach lesen können bzw. diese beeinflussen kann. Diese Schutzvorrichtung ist in der MMU verankert.

Damit unser Prozessor nicht selbstständig alle Speicherbereiche von der logischen Adresse zur physikalischen Adresse berechnen muss, gibt es auf unserer Hardware eine Memory Management Unit MMU

27Okt/10

Grundlagen der Informatik – Thread Zustände

Grundlagen der Informatik - Thread Zustände

Immer mehr Programme verwenden Threads, aber viele kennen nicht mal die Zustände und Übergänge diese "Kontrollfäden". Hier ist eine "kleine" Übersicht der Zustände, die ein Thread bekommen kann:

threadzustande_2

Da dieses Bild recht groß ist, sollte man es im Vollbildmodus anschauen ;) .

Update: kleiner Pfeilfehler wurde verbessert.

27Okt/10

Grundlagen der Informatik – Semaphore (Thread Steuerung)

Grundlagen der Informatik - Semaphore (Thread Steuerung)

Wenn man mit Threads arbeitet, muss man aufpassen, dass die Threads sich nicht gegenseitig blockieren. Deshalb sollte man beachten, ob der Thread in einen kritischen Zustand gerät. Bevor dieser in einen kritischen Zustand kommt, soll gefragt werden, ob ein anderer bereits darin ist. Damit sich die Threads nicht in die Quere kommen.

Kritischer Zustand

Ein kritischer Zustand ist eine Sequenz von einem Thread, die durch das einwirken eines anderen Threads manipuliert bzw. blockiert werden kann. In dem kritischen Zustand kann das Programm abstürzen oder schwere Fehler verursachen. Kommen oft zustande wenn mehrere Threads auf die gleiche Variable bzw. Attribut zugreifen wollen.

Im kritischen Zustand können somit zwei Threads verklemmen!

In Java kann man eine Semaphore so programmieren:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Semaphore {
    private int value;
    public Semaphore(int pInit) {
        if (pInit < 0) {
            pInit = 0;
        }
        value = pInit;
    }
 
    public synchronized void down() {
        while (value == 0) {
            try {
                wait();
            } catch (InterruptedException exp) {
            }
        }
        value--;
    }
 
    public synchronized void up() {
        value++;
        notifyAll();
    }
 
}

In dem Konstruktor der Semaphore wird ein Integerwert übergeben, wie viele Threads auf einmal in den überwachten kritischen Zustand kommen dürfen. Natürlich kann dieser Wert nicht kleiner als 0 sein und auch 0 macht wenig sinn, da sonst kein Thread den kritischen Zustand erlangen kann.

In Unserem Beispiel setzten wir den value-Wert auf 1. Wir haben 2 Threads die in einen kritischen Zustand kommen.

Wenn jetzt nun unser 1. Thread in den Zustand kommen möchte, ruft diese den Befehl down() auf. Nun wird value auf 0 gesetzt und unser 1. Thread kann arbeiten. Sollte jetzt der 2. Thread kommen, dann bleibt er bei der Abfrage value == 0 hängen und wartet nun passiv.

Wenn unser 1. Thread nun den kritischen Zustand verlässt wird value wieder auf 1 gesetzt und mittels notifyAll() werden die wartenden Threads geweckt. Der erste der nun geweckt wurde, kann nun den kritischen Zustand erreichen. In unserem Beispiel ist nun der 2. Thread in der Lage den kritischen Zustand zu erreichen.

Klar ist, dass die Semaphore die gleiche sein muss, die beide Threads verwenden. Weil wenn jeder Thread seine eigene Semaphore hat, werden beide nahezu gleichzeitig in den kritischen Zustand wechseln.

Eine Semaphore kann man sich wie eine Ampel vorstellen, die den "Verkehr" regelt. Hierbei kann sie Threads in die Warteliste schieben und auch wieder in den bereiten Zustand ändern.

27Okt/10

Grundlagen der Informatik – Mikrokern Architektur eines BS

Grundlagen der Informatik - Mikrokern Architektur eines Betriebssystems

Eine Alternative zu dem Monolithischen Betriebssystem ist die Mikrokern Architektur. Hierbei besteht das Kernel nur aus den nötigsten Bestandteilen und alle Dienste des Betriebssystem werden auf sogenannten Betriebssystem Server (Programme bzw. Dienste) ausgelagert.

microkern_architektur_betriebssystem_vhpd

Hier wird deutlich, dass das BS-Kernel sehr schlicht aufgebaut ist, es beinhaltet nur die nötigsten Dienste:

  • grundlegende Prozessverwaltung
  • CPU Zuteilung
  • Prozesskommunikation (IPC)

Ziel ist es den Kern so klein wie nur möglich zu halten.

Vorteile

  • Solle ein BS-Dienst abstürzen, so kann der Dienst einfach neu gestartet werden und das Betriebssystem bzw. der Computer stürzt nicht komplett ab.
  • Flexibel, einzelne Serverdienste können getauscht bzw. frei erweitert werden.
  • Sicher und Stabiler, da das Kernel nur als grundlegender "Vermittler" und "Verwalter" agiert.

Nachteile

  • Es werden viele Systemaufrufe (Traps) benötigt, daher hängt die Geschwindigkeit von der Effizienz der Systemaufrufe ab.

Beispiel

Wir haben ein kleines Programm, dass "Hallo Welt" ausgeben möchte:

ipc_aufruf_mikrokern_architektur_betriebssystem_vhpd

Hier wird deutlich, dass unser Kernel Nur als Vermittler handelt und den Befehl an den entsprechenden BS-Server weiterleitet. Schauen wir uns den rot markierten Vorgang genauer an:

ipc_aufruf_genauer_mikrokern_architektur_betriebssystem_vhpd
  1. Unser Befehl "println" bereitet den Übergabewert vor und startet einen Trap.
  2. Durch den Trapbefehl wird wieder umgeschalten in den Kernelmode und das Betriebssystemkernel kann nun die Nachricht aus dem Programm holen und vorbereiten zum Senden. Denn die erhaltenen Informationen müssen nun weitergeleitet werden an den passenden Server.
  3. Der Kernelmode wird verlassen und nun bekommt der BS-Server die CPU-Kontrolle und kann die erhaltene Nachricht ausführen.
  4. Das BS-Kernel muss nun eine Nachricht erstellen, diese beinhaltet ob alles geklappt hat oder im Fehlerfall die Fehlernummer.
  5. Der BS-Server ruft nun einen weiteren Trap auf, um das Kernel aufmerksam zu machen, dass die Anfrage verarbeitet wurde.
  6. Nun befindet sich wieder der Prozessor im Kernelmode und das Betriebssystem Programm kann nun die Nachricht von dem BS-Server holen und an den "Auftragsgeber" weiterleiten.
  7. Der Kernelmode wird verlassen und die Anwendung kann nun weiterarbeiten mit der erhaltenen Antwort.
27Okt/10

Grundlagen der Informatik – Monolithische Architektur eines BS

Grundlagen der Informatik - Monolithische Architektur eines Betriebssystems

Bei einem monolithischen Betriebssystem besteht das BS aus einem einzigen großen Programm im Hauptspeicher:

monolitische_architektur_betriebssystem_vhpd

Damit nun eine Aktion ausgeführt werden kann, muss ein Programm einen speziellen Hardware-Interrupt "starten", auf das unser Kernel bzw. das Betriebssystem reagieren kann. Dieser Aufruf nennt man Supvervisor call (SVC) oder trap (Assembler Befehl).

Nachteile

  • Da unser Betriebssystem aus vielen Teilen besteht könnte es komplett abstürzen, wenn nur ein kleiner Teil innerhalb des Betriebssystems nicht mehr reagiert.
  • Unflexibel, da es nicht erweitert werden kann innerhalb des Betriebssystemblogs.

Vorteile

  • Es werden weniger System Calls benötigt als bei einer mikrokern Architektur (siehe später).

Was ist ein "Trap"

Ein Trap ist ein spezieller Hardware-Interrupt, der dem Prozessor mehr Befehle zur Verfügung stellt. Damit gelangt also unser Prozessor in den Kernelmode und kann auf den gesamten Hauptspeicher zugreifen. Alle anderen Anwendungen, die wir auf unserem Prozessor laufen lassen können nicht auf diese Befehlssätze und Speicherbereiche zugreifen.

Simulation eines Aufrufes in dieser Architektur

In diesem Beispiel werden wir mittels Java einen println("Hallo Welt") aufrufen.

svp_ipc_aufruf_monolitische_architektur_betriebssystem_vhpd
  1. Der println Befehl speichert an einer bestimmten Stelle im Hauptspeicher die Identifikation von write mit den dazugehörigen Informationen ab.
  2. Dadurch wird ein Trap erzeugt, der durch einen Hardwareinterrupt (Trapinterrupt) die laufende Anwendung unterbricht und den Trap-Handler des Betriebssystems startet.
  3. Somit schaltet das Betriebssystem den Prozessor in den Kernelmode und dadurch hat der Prozessor nun einen erweiterten Befehlssatz und die hardwareseitige Speicher Zugriffsbeschränkung wird aufgehoben.
  4. Der Trap-Handler kopiert die Aufrufparameter in den Kernelbereich (bzw. Stack) und ist in der Lage die entsprechende Funktion "write" aufzurufen.
  5. Das Resultat (bzw. der Returnwert) wird in den Speicher der Anwendung kopiert. Dieser kann z. .B. eine Fehlerrückmeldung erhalten.
  6. Der Trap-Handler wird beendet und somit wird auch der Kernelmode geschlossen. Nun kann die Anwendung wieder auf den Prozessor geladen werden. (Assembler Befehl für Trap-Return ist rett)
26Okt/10

Grundlagen der Informatik – Schichtenmodell des Betriebssystem

Grundlagen der Informatik - Schichtenmodell des Betriebssystems

Allgemeines Schichtenmodell des Betriebssystem

schichtenmodell_des_betriebssystem_vhpd
  1. Ein Benutzer startet ein Kommando, worauf die Applikation reagiert.
  2. Nun muss die Applikation einen System Call nun Aufrufen, um mit dem Kernel in Verbindung zu treten. Hierbei werden auch die Notwendigen Informationen übermittelt.
  3. Damit nun die Hardware angesprochen werden kann, muss das Kernel die Hardware ansteuern.
  4. Sobald die Hardware ihren Dienst vollbracht hat, kann sie einen Interrupt ausführen, sodass unser Kernel reagieren kann.
  5. Nun Übermittelt das Kernel die Signale (Rückgabewerte) an die Anwendung.
  6. Die Anwendung kann nun unser Ergebnis anzeigen.

Schichtenmodell eines Betriebssystem in einer anderen Form am Beispiel Linux (vereinfacht!)

schichtenmodell_linux_des_betriebssystem_vhpd

Hier wird die Hierarchie erst richtig deutlich, da jede betreffende Schicht bei einem Aufruf durchlaufen werden muss.

Hierbei gliedert man die Bereiche in den Userpsrace und in das Betriebssystem, wobei der Userspace weitläufig alles außerhalb des Kernels definiert.

Ein Beispiel: Wir fordern über das Netzwerk eine Webseite via HTTP an.

  1. Unsere Anwendung (Firefox) greift zunächst auf eine C-Bibliothek zu und übermittelt die notwendigen Informationen (Zeiladresse usw.)
  2. Die C-Bibliothek bereitet nun diese Informationen vor und übermittelt es an das System Call Interface.
  3. Das System Call Interface ist nun in der Lage einen System Call zum Kernel durchzuführen.
  4. Bei dem System Call wird entschieden, welche Bereiche des Kernels angesprochen werden müssen. In unserem Fall wird der Netzwerkstack angesprochen.
  5. Der Netzwerkstack bereitet nun die gewünschten Informationen vor, sodass die Hardware problemlos angesprochen werden kann.
  6. Im letzten Schritt ist der Architektur abhängiger Code (auch bekannt unter den Namen Treiber) verantwortlich, die Netzwerkkarte anzusteuern und den Befehl ins Internet zu schicken.
  7. Sobald die Information ankommt, löst die Netzwerkkarte einen Interrupt aus.
  8. Der Netzwerkstack wird aktualisiert und übermittelt die Antwort an das System Call Interface.
  9. Das System Call Interface leitet die Antwort an die C-Bibliothek weiter, von dem der Aufruf gestartet wurde.
  10. Die Anwendung erhält die Antwort und kann es anzeigen.
26Okt/10

Grundlagen der Informatik – Betriebssysteme

Grundlagen der Informatik Betriebssysteme

Definition:
Ein komplexes Programmpaket, welches folgende Funktionalität bietet:

  • Kernaufgaben

*   Prozessverwaltung, Datenverwaltung (Filesystem), Speicherverwaltung

  • Verwaltung der Peripheriegeräte

*   CD, DVD, Monitor

  • Kommunikation im Netz

Starten des Betriebssystems

Im Boot-prom (programmable Read-Only Memory) ist das erste Programm gespeichert, welches zuerst vom Prozessor gestartet wird. Das Programm sucht aufgrund der Bootpriorität im Bios nach einem Ladefähigen Programm im Master Boot Record (MBR). Dieses Bootprogramm im MBR lädt letztendlich das Betriebssystem.

Begriffe

  • Task/Prozess

*   Ein aktuell laufendes Programm, dass gerade ausgeführt wird.

  • Multi Tasking

*   Mehrere Programme werden (quasi) gleichzeitig ausgeführt.

  • Concurrent (nebenläufig)

*   Bedeutet dass zwei Programme nebeneinander/parallel ablaufen können, ohne sich zu stören.

  • Kontext Wechsel

*   Des wechseln von den verschiedenen Prozessen auf dem Prozessor.

*   Dieser Teil des BS der sich um diese Aufgabe kümmert, nennt sich Scheduler.

  • Batchbetrieb/Stapelverarbeitung

*   Aufgaben die in einer Warteschleife warten, bis sie letztendlich bearbeitet werden.

  • Echtzeitsystem (real time system)

*   Sehr selten, da eine maximale Systemreaktionszeit garantiert wird (Windows ist KEIN RTS).