Der Maschinenraum

Alexander Krause

🚀 by Decker

if (Programmierung == Handwerk)

Ist das Programmieren nur ein Handwerk?

fig/kap01-handwerk.svg

Ein Blick in den Maschinenraum lohnt sich …

Das Betriebssystem

Quiz

Was ist ein Betriebssystem?

Was sagt die KI dazu?

Das „denkt” die KI zu den Worten „Operating System”:

Aufgaben eines Betriebssystems

Zwei Hauptaufgaben [1], [2]:

  • Schnittstellen/Abstraktionen zu der Hardware bereitstellen
  • Ressourcen und Rechte verwalten

Struktur eines Betriebssystems

(Der Aufbau gilt nur für ein monolithisches Betriebssystem – siehe Literatur [1], [2].)

Abstraktionen

Ăśbersicht

Was fĂĽr Abstraktionen gibt es in einem Betriebssystem?

  • Prozessor
  • (Ein-Ausgabe-)Geräte
    • Speichermedien (Festplatten, SSDs,
    • USB-Geräte (Maus, Tastatur, Webcam, …)
    • Weitere: Grafikkarte, Soundkarte, …)
  • Speicher
    • Arbeitsspeicher
    • Hintergrundspeicher (Festplatten, SSD, …)

(Dies ist keine abschlieĂźende Liste)

Prozessor

  • CPU = Central Processing Unit
  • Besteht u. a. aus
    • Kontrolleinheit
    • Register
    • arithmetic logical unit (ALU)
    • floating point unit (FPU)
  • Interner Aufbau wird durch Prozessorarchitektur beschrieben, z. B. arm, x86_64, RSICV, …
  • FĂĽhrt ein Programm aus → Arbeitet die Maschineninstruktionen ab

Aber wie unterscheiden wir die Instruktionen von bspw. Firefox und von Thunderbird? 🤔

Prozess-Abstraktion

Zwei beispielhafte Definitionen [1]:

An instance of a program running on a computer.

A program in execution.
  • Ein Prozess besitzt Verwaltungsinformationen (process control block)
    • Kennung: PID = Process ID = eine fortlaufende Nummer
    • Zustand, z. B. running
    • Priorität
    • Speicheradresse der nächsten Instruktion: program counter

Prozesszustände

Kapitel12a-deck-code-6ba3accf.dot.svg
  • Prozesse werden Blockiert, wenn sie auf ein Ereignis warten
  • Prozesse wechseln von Laufend in Bereit, wenn die Zeitscheibe abgelaufen ist

(Vereinfachte Darstellung, fĂĽr Details siehe BĂĽcher von Silberschatz, Tannenbau und anderen [1], [2])

E/A-Geräte

Aus unserer Sicht Unterteilung der Geräte in drei Kategorien:

  • Menschen-lesbare Geräte sind fĂĽr die Interaktion mit dem Menschen gedacht, z. B. Tastatur, Bildschirm, Drucker, …
  • Maschinen-lesbare Geräte erlauben dem Computer die Interaktion mit der Umwelt, z. B. Sensoren, Aktoren, Festplatten, …
  • Geräte zur Kommunikation gestatten den Informationsaustausch mit entferten Geräten

(Seite 506, [1])

E/A-Geräteklassen

Zwei wesentliche Geräteklassen aus Sicht des Betriebssystems [1], [2]

Zeichenorientierte Geräte

  • Tastatur, Maus, Drucker, …
  • Meist sequentieller Zugriff: „Lese ein Byte nach dem anderen”

Blockorientierte Geräte

  • Festplatte, Diskette, CD-ROM, DVD, BluRay, …
  • Meist wahlfreier und blockweiser Zugriff: „Lese 512 Byte von Stelle 42”

(Nicht alle Geräte passen in diese Klassen.)

Speicherhierarchie

  • Von oben nach unten
    • Zugriffszeiten steigen
    • Kapazität steigt
    • Preis sinkt

Vordergrundspeicher – Arbeitsspeicher

  • RAM = Random Access Memory = Arbeitsspeicher
  • Wahlfreier Zugriff (random access) auf einzelne Speicherzellen
  • Inhalt der Speicherzellen muss zyklisch aufgefrischt werden

Vordergrundspeicher – Arbeitsspeicher

  • Start bei der Adresse 0x0
  • Adressen im niedrigen Adressraum werden oft fĂĽr Geräte genutzt (memory-mapped io)
  • Unterbringung des Arbeitsspeicher im physikalischen Adressraum
  • Beginnt nicht zwingend bei Adresse 0x0

Virtueller Speicher

  • Jeder Prozess bekommt gedacht den vollen Adressraum zugeteilt, z. B. 232 Bytes bei 32bit-Maschine
  • Ăśber das sog. Paging blendet das Betriebssystem Speicher ein
  • Abbildung auf „beliebige” physikalische Adressen
  • Typische Größe eines Bereichs: 4kByte (= Seite)

(Wenn der Arbeitsspeicher voll ist, wird auf die Festplatte ausgelagert. Siehe swap unter Linux oder page file unter Windows.)

Hintergrundspeicher – Gerät

  • Sind persistente Speicher → kein Auffrischen nötig

  • Beispiele: Festplatten oder Solid State Disks (SSD)

  • Dient als Ablage fĂĽr groĂźe Mengen

  • Kennt nur Spuren und Sektoren

    (512 Byte oder 4k)

  • Zugriff erfolgt Sektor-weise:

    „Lese Sektor 4711 und 4712”

Hintergrundspeicher – Dateisysteme

  • Dateisysteme strukturieren Inhalt von Geräten in Verzeichnisse(/Ordner) und Dateien

  • Schaffen Abbildung von Dateien zu Sektoren (und Spuren)

  • Beispiele: EXT4, NTFS, FAT32, …

  • Kennt Dateien (und Verzeichnisse)

  • Zugriff erfolgt Byte-weise:

    „Lese 30 Byte an Stelle 42”

    (Siehe Kapitel 9 – Dateioperationen)

Kapitel12a-deck-code-4a4a8227.dot.svg

Ressourcenverwaltung

Prozessverwaltung

  • Hauptaufgabe der Prozessverwaltung ist das Zuteilen von Rechenzeit
  • Hierzu gibt es eine vielzahl an sog. Schedulingverfahren
  • Meist eingesetzt: Präemptives, zeitscheibenbasiertes Scheduling

Ablaufplanung

  • Was ist „scheduling”?
    • Zu deutsch: Ablaufplanung
    • Legt die AusfĂĽhrungseihenfolge der Prozesse fest
    • Nutzt verschiedene Parameter: Priorität, bisherige Rechenzeit, …
  • Was bedeutet „zeitscheibenbasiertes”?
    • Jeder Prozess bekommt den Prozessor fĂĽr eine feste Dauer (Zeitscheibe) zugeteilt.
  • Was bedeutet „präemptives”?
    • Betriebssystem bekommt periodisch Signal von einem Zeitgeber
    • Betriebssystem entzieht dem aktuell laufenden Prozess den Prozessor, wenn
      • ein wichtigerer Prozess (siehe Priorität) rechen-bereit ist oder
      • die Zeitscheibe abgelaufen ist.

Speicherverwaltung

  • malloc()/free() bzw. new/delete allozieren und geben Speicher frei

  • Betriebssystem verwaltet die o. g. Anfragen

  • Bei Erfolg blendet es den neuen Speicher im virtuellen Adressraum des Prozesses ein

    → „Es wird ein neuer Pfeil gezogen.” (siehe Abb.)

(In Wirklichkeit geschieht die Anfordung mit brk() an das Betriebssystem. Die Funktionsaufrufe werden durch die libc bzw. libstdcpp verwaltet.)

Vorteile einer Prozess-Abstraktion

  • Betriebssystem verwaltet Rechenzeit und Speicher eines Prozesses!
  • Jeder Prozess „denkt”, er sei alleine in dem System:
    • Einem Prozess gehört der Prozessor
    • Einem Prozess gehört der gesamte Adressraum
  • Vorteile dieser Abstraktion sind u. a.:
    • räumliche Isolation: Jeder Prozess agiert nur in seinem Speicher(gefängnis).
    • zeitliche Isolation: Ein Prozess kann nicht den Prozessor monopolisieren.

Toolchain

GNU Compiler Collection (GCC)

  • UrsprĂĽnglicher Name: GNU C Compiler
  • Eine Sammlung von verschiedenen Compilern: C, C++, Java, Fortran, …
  • unterstĂĽtzt verschiedene Zielplattformen: x86, AMD64, ARM, RISCV, …
  • Anmerkung: Es ist ein Compiler fĂĽr C++. Es gibt mehrere.

Aufruf des Compilers: g++ -Wall -o hello.elf main.cpp hello.cpp

  • -Wall: Zeige alle Warnungen an
  • -o: Schreibe die Ausgabe nach hello.elf
  • main.cpp hello.cpp: Die Eingabe

Ablauf einer Ăśbersetzung

gen/gcc-overview-crop.svg

(C++-Name-Mangling wird hier ignoriert.)

Präprozessor (Preprocessor)

  • Ist letztlich ein reines Textersetzungswerkzeug

  • Wertet alle AusdrĂĽcke beginnend mit # aus

  • Ausgabe ist reiner C/C++-Code ohne #

  • Ausgabe des Präprozessor anzeigen mittels Parameter -E

    g++ -E -o main_.cpp main.cpp

#define PFERD 17+4
if (3*PFERD == 63) {
    // ...
}

Ăśbersetzen (Compiling)

  • Die Kernkomponente des Compilers
  • FĂĽhrt mehrere Schritte durch
    • ĂĽberprĂĽft die Syntax
    • ĂĽbersetzt den Programmcode in Maschinencode
    • fĂĽhrt Optimierungen durch
  • Ausgabe: sog. Object Files
    • Enthalten die fast-fertigen Maschineninstruktionen
    • Es fehlen noch die Adressen von Variablen und Funktionen (→ Linker)

Binden (Linking)

  • FĂĽhrt folgende Schritte durch
    • Sammelt alle Object Files ein
    • Durchsucht diese nach fehlenden Symbolen und dann die Bibliotheken
    • „Vergibt” Adressen fĂĽr Variablen und Funktionen
  • Wichtig: Lediglich die Standardbibliotheken werden ohne explizite Angabe durchsucht
    • libc fĂĽr C
    • libstdc++ fĂĽr C++
  • Andere Bibliotheken mĂĽssen explizit aufgefĂĽhrt werden

Arten des Binden

  • Dynamisches Binden
    • Alle erforderlichen Bibliotheken werden beim Starten (Laden) des Programms geladen
  • Statisches Binden
    • Alle verwendeten Bibliotheken werden beim Ăśbersetzen „dazu gelegt”
    • Dazu zählt auch der Start-Code fĂĽr ein Programm

(Bitte nicht mit dem statischen und dynamischen Binden bei virtuellen Funktionen verwechseln – siehe Kapitel 9.)

Beispiel fĂĽr das Binden

// hello.cpp
#include <iostream>
using namespace std;

void hello() {
    cout << "Hello World!" << endl;
}

// main.cpp
void hello();

void main() {
    hello();
    return 0;
}

Fehler beim Binden

  • Typische Fehlermeldung des Linkers:
al@ganymed:~/coding$ g++ -Wall -o hello.elf hello.cpp 
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/14/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x17): undefined reference to `main'
collect2: error: ld returned 1 exit status
  • Hier fehlt eine main()-Funktion im Programm
  • main() steht in der Datei main.cpp, wird aber nicht mit angegeben

Beispiel dynamisches Binden

Beispiel fĂĽr die Liste an dynamisch-geladenen Bibliotheken:

al@ganymed:~/coding$ ldd dyn.elf 
        linux-vdso.so.1 (0x00007f50f06a2000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f50f0400000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f50f020a000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f50f0124000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f50f06a4000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f50f00f7000)

Vergleich statisches und dynamisches Binden

Ergebnisse

Datei Größe (Bytes) Größe (k/M Bytes)
dyn.elf 16568 ~17kBytes
static.elf 2263288 ~2,2MBytes
Compiler-Aufrufe
  • Dynamisch Binden: g++ -Wall -o dyn.elf hello.cpp main.cpp
  • Statisches Binden: g++ -Wall -static -o static.elf hello.cpp main.cpp

GrĂĽnde

  • alle verwendeten Bibliotheken werden dazu gebunden
  • „alles, was zum AusfĂĽhren von dem System benötigt wird, wird dazu gebunden”

Eure Meinung

Was haltet Ihr von diesem Kapitel 12a „Maschinenraum”?

  • Cool! Bitte mehr davon.
  • Cool! Genau richtig.
  • Es reicht.
  • Nein. Danke.

Referenzen

[1]
A. Silberschatz, P. B. Galvin, und G. Gagne, Operating System Concepts, 10th Aufl. Wiley, 2018.
[2]
A. S. Tanenbaum und H. Bos, Modern Operating Systems, 4th Aufl. USA: Prentice Hall Press, 2014.
Logo
Der Maschinenraum