Systemprogrammierung - Cheatsheet
Erstellung und Terminierung von Prozessen
Definition:
Prozesserstellung und -beendigung in Betriebssystemen: Erzeugen (fork), Initialisieren (exec), Beenden (exit).
Details:
- Erstellung: fork() erzeugt Kindprozess
- Initialization: exec() lädt neues Programm in Prozessraum
- Beendigung: exit() beendet Prozess
- Prozesszustände: neu, bereit, laufend, wartend, beendet
- Warteschlange und Planung: Scheduler, Kontextwechsel
- Wichtige Systemaufrufe: fork(), exec(), wait(), exit()
- Zustandstransitionen durch Scheduler bestimmt
Interprozesskommunikation (IPC)
Definition:
Austausch von Daten zwischen mehreren Prozessen zur Koordination und Datenkonsistenz.
Details:
- Pipes: unumkehrbar, einfache Kommunikation zwischen Prozessen.
- Message Queues: persistente Nachrichtenwarteschlangen.
- Shared Memory: gemeinsamer Speicherbereich, schnelle Kommunikation.
- Sockets: Kommunikation über Netzwerke, flexibel.
- Semaphores: Synchronisation von Prozessen, Vermeidung von Race Conditions.
- Signals: einfache Steuerungsmechanismen für Prozessereignisse.
Prozesssynchronisation und Deadlock-Behandlung
Definition:
Koordination von Prozessen, um konsistente Zugriffe auf geteilte Ressourcen zu gewährleisten und Vermeidung von Deadlocks.
Details:
- Wichtige Mechanismen: Semaphoren, Monitore, Spinlocks
- Deadlock-Bedingungen: Mutual Exclusion, Hold and Wait, No Preemption, Circular Wait
- Strategien zur Deadlock-Behandlung: Vermeidung, Verhinderung, Erkennung und Behebung
- Banker's Algorithm zur Deadlock-Vermeidung
- Warteschlangen-Grafen für Erkennung/Analyse
Paging und virtuelle Speichertechniken
Definition:
Trennung von physischen und virtuellen Adressen zur effizienten Nutzung des Speichers.
Details:
- Virtueller Adressraum wird in Seiten (Pages) aufgeteilt.
- Physischer Speicher wird in Rahmen (Frames) aufgeteilt.
- Seitentabelle (Page Table) zur Verwaltung der Zuordnungen zwischen Pages und Frames.
- Adressumsetzung durch Hardware: MMU (Memory Management Unit).
- Seitenaustausch über lokale Platte bei Speichermangel.
- Effiziente Nutzung durch Vermeidung von Fragmentierung.
- Formel: Effektive Zugriffszeit \( EAT = (1 - p) \times MA + p \times (P + S + MA) \), wobei \( p \) die Fehlerrate, \( MA \) die Speicherzugriffszeit, \( P \) die Swap-Seitenladezeit, und \( S \) die Zeit zum Speichern der Seite ist.
Journaling-Dateisysteme
Definition:
Dateisysteme, die Änderungen in einem Journal protokollieren, um Datenintegrität zu erhöhen und schnellere Wiederherstellung nach einem Absturz zu ermöglichen.
Details:
- Verwendet ein Journal, um Metadaten und manchmal Nutzdaten zu speichern
- Reduziert das Risiko von Datenverlust bei plötzlichen Ausfällen
- 3 Modi des Journalings: writeback, ordered, journal
- Beispiele: ext3/ext4, XFS, JFS
- Metadaten-Journaling vs. Voll-Journaling
Systemaufrufe und ihre Implementierung
Definition:
Systemaufrufe (Syscalls) ermöglichen Programmen die Kommunikation mit dem Betriebssystem, um Dienste wie Dateioperationen oder Speicherverwaltung zu nutzen.
Details:
- Syscall-Interface als Vermittler zwischen User- und Kernel-Mode
- Übergabe von Parametern über Register oder Stack
- Wechsel vom User- in den Kernel-Mode durch Software-Interrupt (z. B. \texttt{int 0x80} auf x86)
- Implementierung in Betriebssystem-Kernel
- Fehlerbehandlung durch Rückgabewerte (meistens -1) und Setzen von \texttt{errno}
Socket-Programmierung
Definition:
Erstellen von Anwendungen, die über Netzwerke kommunizieren, unter Verwendung von Sockets.
Details:
- Sockets bieten eine Schnittstelle für die Kommunikation zwischen zwei Endpunkten.
- Wichtig: IPv4 vs. IPv6, TCP vs. UDP.
- Wesentliche Funktionen:
socket()
, bind()
, listen()
, accept()
, connect()
, send()
, recv()
, close()
. - Verwaltung von Verbindungsabbrüchen und Fehlern notwendig.
- Beispiel TCP-Server:
sock = socket(AF_INET, SOCK_STREAM)sock.bind((host, port))sock.listen()conn, addr = sock.accept()data = conn.recv(1024)conn.send(data)conn.close()
Asynchrone und parallele Netzwerkprogrammierung
Definition:
Netzwerkprogrammierung, bei der Aufgaben unabhängig und gleichzeitig bearbeitet werden, um Effizienz und Performance zu steigern.
Details:
- Asynchrone Programmierung: Tasks starten ohne auf das Ende anderer zu warten; verwendet Callback-Funktionen, Promises oder async/await.
- Parallele Programmierung: Mehrere Tasks laufen gleichzeitig auf verschiedenen Kernen/Threads; verbessert durch Hardware-Multithreading.
- Wichtige Konzepte: Event Loop (asynchron), Threads und Prozesse (parallel), Race Conditions, Synchronisation.
- Bibliotheken: Boost.Asio (C++), asyncio (Python), Tokio (Rust)
- Typische Paradigmen: Non-blocking I/O, Futures, Channels