UNIX Mechanismen Übung aus Systemprogrammierung & Systemnahe Programmierung Armin Wasicek SS 2010 Inhalt Kernel Struktur Prozessverwaltung Interprozesskommunikation Speicherverwaltung 12/13/2010 UNIX Mechanismen 2 UNIX Kernel Structure System call interface Memory management component Signal handling Virtual memory Process/Thread creation/termination Paging page replacement CPU Scheduling Page cache IO and networking component Virtual file system Terminals line discipline Process management component Character devices drivers Interrupts 12/13/2010 File systems Generic block layer Sockets Network stacks IO scheduler Block device drivers Network device drivers Dispatcher UNIX Mechanismen 3 Prozessverwaltung Erstellt, terminiert und verwaltet Prozesse Verbindet Prozesse untereinander (pipes, signals, IPC) Verbindet Prozesse mit der Außenwelt (I/O) Kontrolliert den Zugriff auf den Prozessor 12/13/2010 UNIX Mechanismen 4 Speicherverwaltung Hauptspeicher ist eine wesentliche Ressource Kernel bildet einen virtuellen Adressraum für jeden Prozess Prozesse können Speicher anfordern oder zurückgeben Wird dabei von der memory management unit (MMU) unterstützt 12/13/2010 UNIX Mechanismen 5 IO und Networking Virtual file system: abstrahiert über die Peripherie „Everything is a file“ Der Kernel bildet unstrukturierte Hardware auf ein strukturiertes Dateisystem ab Neue Dateisysteme, Treiber und Geräte werden einfach in das virtuelle Dateisystem eingehängt. Dadurch werden Operationen read/write definiert 12/13/2010 UNIX Mechanismen 6 Inhalt Kernel Struktur Prozessverwaltung Interprozesskommunikation Speicherverwaltung 12/13/2010 UNIX Mechanismen 7 Prozessverwaltung Erstellung eines Ablaufplanes der Prozessen zeitlich begrenzt Ressourcen zuweist. Lernziele: Prozesserzeugung Prozessverwaltung Scheduling in Linux 12/13/2010 UNIX Mechanismen 8 Erschaffung neuer Prozesse Erstellen eines neuen “leeren” Prozesses: Prozess startet ohne zugeordnete Ressourcen Existierender Prozess beliefert neuen Prozess mit Daten und Anweisungen via Speicherseiten Kopieren eines bestehenden Prozesses erstellt eine Kopie von sich und seinem aktuellen Zustand Kopie arbeitet unabhängig vom Original, teilt ev. Ressourcen Ersetzen eines vorhandenen Prozesses setzt einen vorhandenen Prozess auf einen neuen Zustand 12/13/2010 UNIX Mechanismen 9 Prozesserzeugung Der Systemcall fork erstellt einen neuen Prozess: 1. 2. 3. 4. 5. 6. pid_t pid=fork(); if(pid<0) { handle_error(); } else if(pid>0) { /* program code for parent */ } else { /* program code for child */ } Ein neuer Eintrag (task_struct) wird in die Taskliste eingefügt Duplizieren der task_struct‐Struktur des Elterprozesses (Außer: PID) Erzeugen einer Referenz auf die Ressourcen des Elternprozesses Ein identes Speicherabbild des aufrufenden Prozesse wird erstellt Anlegen von Wait Queue (wait_chldexit) Scheduling des Kindprozesses 12/13/2010 UNIX Mechanismen 10 Prozesshierachien (pstree) init─┬─acpid ├─ahc_dv_0 ├─ahc_dv_1 ├─bash ├─clock-applet ├─crond ├─cups-config-dae ├─cupsd ├─2*[dbus-daemon-1] ├─dbus-launch ├─dhcpd ├─gdm-binary─┬─gdm-binary─┬─X │ │ └─gdmgreeter │ └─gdm-binary───gnome-session───ssh-agent ├─2*[sendmail] ├─sesam_server─┬─sesam_server │ └─sesam_server───9*[sesam_server] ├─smbd───5*[smbd] ├─sshd─┬─sshd───sshd───bash───pine-secure.sh───pine │ ├─sshd───sshd───bash───pine │ ├─3*[sshd───sshd───bash] │ └─sshd───sshd───bash───xterm───bash───pstree 12/13/2010 UNIX Mechanismen 11 Datenstrukturen zur Prozessverwaltung Prozesstabelle in Linux besteht aus Einträgen der task_struct Struktur Tabelle hat einen Eintrag pro laufendem Prozess Immer resident Verkettet Prozesse in Queues (z.B. run queue) Eltern‐Kind Hierachien 12/13/2010 struct task_struct { volatile long state; /* ‐1 unrunnable, . . . 0 runnable, >0 stopped */ struct list_head run_list; struct task_struct *next_task, *prev_task; . . . /* task state */ int exit_code, exit_signal; pid_t pid; . . . /* pointers to (original) parent process, etc.*/ struct task_struct *p_opptr, *p_pptr, . . . *p_cptr, *p_ysptr, *p_osptr; /* open file information */ struct files_struct *files; . . . /* signal handlers */ struct signal_struct *sig; } UNIX Mechanismen 12 Elemente der task_struct Struktur (1) Scheduling Priorität, CPU‐Zeit, … Identifikation PID, Owner, Gruppe, … Speicherverwaltung Pointer auf MMU Info Synchronisation Wait Queue Signale Mask, Pending Berechtigungen 12/13/2010 UNIX Mechanismen 13 Elemente der task_struct Struktur (2) Accounting Information Quotas, … Timerverwaltung Process Control Block Register, PC, Statuswort, Segmentregister, Page Table Info Deskriptorentabelle Kernelstack System‐Calls, Traps 12/13/2010 UNIX Mechanismen 14 Scheduling: terms Processes can be either: I/O-bound: heavy use of I/O devices and spend much time waiting for I/O operations to complete CPU-bound: computationintensive applications that require a lot of CPU time Real-time processes are explicitly by the scheduler 12/13/2010 Quantum: time slice Kernel 2.6.13: 250 Hz = 4 ms UNIX Scheduling policy: • • • • • fast process response time, good throughput for background jobs, avoidance of process starvation, reconciliation of the needs of low- and high-priority processes, etc. Linux (like all Unix kernels) implicitly favors I/O-bound processes over CPU-bound ones. UNIX Mechanismen 15 Scheduling in Linux prä‐2.6 Nachteile Linux Prä‐2.6 Scheduler: O(n) Aufwand, dh. die Rechenzeit des Schedulers war abhängig von der Anzahl der Tasks, dh. skaliert nicht Einzelnes runqueue lock sperrt bei Zugriff alle Prozessoren in einem SMP System Keine Task‐Preemption, dh. niedrigpriore Tasks können höherpriore Tasks verzögern 12/13/2010 UNIX Mechanismen 16 Linux O(1) Scheduler Scheduler: Wählt den höchstprioren Task Migration Thread In einer Bitmap (5x32bit) wird eine Prioritätsstufe markiert, wenn Tasks vorhanden sind priorities priorities 1 1 task a task b 100 task c 100 101 task d 101 task e task f 140 140 Die Zeit um einen Task auszuwählen hängt somit von der Anzahl der Prioritätsstufen (=140) und nicht mehr von der Anzahl der Tasks ab. PRIO = MAX_RT_PRIO + NICE + 20 CPU‐bound Tasks erhalten Penalty [+5 ], I/O‐bound Tasks erhalten Bonus [‐5 ] http://joshaas.net/linux/linux_cpu_scheduler.pdf 12/13/2010 UNIX Mechanismen 17 Linux Scheduler Comparison 12/13/2010 UNIX Mechanismen 18 Kontextwechsel Zwischen Prozessen Freiwillig durch sleep_on(), System‐Call Unfreiwillig durch Ende der Zeitscheibe (Kernel ruft schedule auf), Scheduler wählt nächsten Prozess aus Durch Interrupts Kontextwechsel durch Hardware und Interrupthandler (asynchron) “Austausch” der task_struct‐Struktur 12/13/2010 UNIX Mechanismen 19 Kontextsicherung Sicherung der Zustandsinformation des alten Prozesses in der task_struct‐Struktur User‐Mode Kontext auf Kernel Stack bei Eintritt in Kernel‐Mode Kernel‐Mode Kontext in PCB der task_struct‐Struktur – bei freiwilliger Abgabe des Prozessors durch den Prozess mit sleep_on() 12/13/2010 UNIX Mechanismen 20 Zusammenfassung ‐ Prozessverwaltung Prozess ist ein laufendes Programm Prozesserzeugung (bspw. fork) Prozesstabelle task_struct Scheduling in Linux Kontextwechsel freiwillig/erzwungen Freigabe der Ressourcen bei Terminierung Prozessstatus muss abgeholt werden 12/13/2010 UNIX Mechanismen 21 Inhalt Kernel Struktur Prozessverwaltung Interprozesskommunikation Speicherverwaltung 12/13/2010 UNIX Mechanismen 22 Interprozesskommunikation (IPC) Wozu? Synchronisation Datenaustausch von Prozessen, entweder verwandt (fork), auf gleichem Rechner/Prozessor, oder auf verschiedenen Rechnern/Prozessoren. 12/13/2010 UNIX Mechanismen 23 IPC Mechanismen Signale Sockets Semaphore Shared Memory Message Queues 12/13/2010 UNIX Mechanismen 24 Signale Behandlung von Ausnahmezuständen Aktionen beim Eintreffen Ignorieren Terminieren des Prozesses Erzeugen eines Speicherabbildes Anhalten des Prozesses Ausführen einer Behandlungsroutine 12/13/2010 UNIX Mechanismen 25 Implementierung von Signalen in task_struct Struktur Bitfelder signal und blocked Array von Zeigern auf benutzerdefinierte Signalbehandlungsroutinen Senden eines Signals send_sig und generate “Ausführung” bei Prozessscheduling Check für eingetroffene und nicht ignorierte Signale Festlegen der auszuführenden Aktion (Terminierung, Signalbehandlungsroutine) 12/13/2010 UNIX Mechanismen 26 Sockets Endpunkte einer Kommunikation Netzwerkfähig Transparent Kompatibilität zu UNIX I/O (read, write) Parameter Domain (UNIX, Internet) Typ (Stream, Datagram, Raw) Protokoll (TCP/IP, UDP/IP) 12/13/2010 UNIX Mechanismen 27 System V IPC Semaphore binäre, counting Semaphore Semaphorfelder Shared Memory Mapping in Adressbereich der Prozesse Message Queues Prioritäten Eventnachrichten 12/13/2010 UNIX Mechanismen 28 Zusammenfassung ‐ Interprozesskommunikation Signale Sockets Semaphores Shared Memory Message Queues Rechner Netzwerk Synchronisation Datenaustausch 12/13/2010 UNIX Mechanismen 29 Inhalt Kernel Struktur Prozessverwaltung Interprozesskommunikation Speicherverwaltung 12/13/2010 UNIX Mechanismen 30 Speicherverwaltung Effektive Aufteilung und Verwaltung des Hauptspeichers für OS und Programme. Lernziele: Virtueller Speicher & MMU Swapping & Paging Heap & Stack 12/13/2010 UNIX Mechanismen 31 Speicherverwaltung 0x00 RAM Ausreichend Speicher Image1 Image2 CPU Image3 0x0F Alle drei Prozessabbilder passen in den vorhandenen physikalischen Speicher Keine Speicherverwaltung nötig (ausser für Speicherschutz) 12/13/2010 UNIX Mechanismen 32 Speicherverwaltung 0x00 RAM Speicher zu klein Image1 Image2 CPU 0x0F Image3 0xA0 Festspeicher Mehr Speicher benötigt als vorhanden Zusätzlich Festspeicher (Harddisk) Genug Speicher, inkohärente Adressen Image3 0xFF 12/13/2010 UNIX Mechanismen 33 Speicherverwaltung 0x00 0x00 RAM Virtueller Speicher CPU load/store load/store MMU Virtueller Speicher Abstraktion: verschiedene Speichertypen kohärenten Addressraum Image2 0x0F Festspeicher Image3 Memory Management Unit (MMU) übersetzt virtuelle in physische Adressen 12/13/2010 Virtual memory Image1 UNIX Mechanismen 0xFF 0xFF 34 Zusammenfassung: Virtueller Speicher Homogener virtueller Speicher für verschiedene Speichertypen Anforderungen an virtuellen Speicher Größer als physikalischer Speicher Mehr Prozesse gleichzeitig aktiv als Hauptspeicher erlaubt o Zugriffschutz auf Prozessspeicherbereich Zugriff nicht langsamer als Hauptspeicher Transparente Erweiterung (unsichtbar für Nutzer) 12/13/2010 UNIX Mechanismen 35 Swapping 0x00 0x00 RAM load/store CPU MMU Swapping Auslagerung von ganzen Prozessen + Einfach zu implementieren Virtual memory Image1 Image2 Image3 0x0F Festspeicher Image2 - Zeitaufwändig - Nicht alle Anforderungen an virtuellen 0xFF Speicher erfüllt 12/13/2010 UNIX Mechanismen Image3 0xFF 36 Paging load/store MMU Paging Speicher in gleich große Seitenrahmen unterteilt, Seiten werden vom Swap Space in den Speicher eingelesen und zurückgeschrieben 0x00RAM 2 p1, img1 4 p4, img2 5 p6, img3 0x0F 6 7 9 - Spezialhardware MMU 0xFF UNIX Mechanismen p3, img2 p2, img1 8 + nicht alle Seiten müssen gleichzeitig im Hauptspeicher liegen 12/13/2010 1 3 Virtual memory CPU 0x00 Swap‐ speicher p5, img3 p9, img3 0xFF 37 Memory Management Unit (MMU) Übersetzt von virtuellen Adressen in physische Adressen Jeder Speicherreferenz wird in der MMU ersetzt MMU verfügt über speziellen Cache‐Speicher, den Translation Lookaside Buffer (TLB) CPU Virtual address MMU Translation Table Physical address Memory TLB 12/13/2010 UNIX Mechanismen 38 Adressraum und Umsetzung Unterteilung des Speicherbereichs Kernel: evt. physikalischen Adressmodus Userprozesse: virtueller Adressmodus Adressumsetzung Prozessorabhängig Makros verdecken: • Anzahl der Seitentabellen • Struktur eines Seitentabelleneintrags • Struktur einer virtuellen Adresse 12/13/2010 UNIX Mechanismen 39 Zusammenfassung: Virtueller Speicher Homogener virtueller Speicher für verschiedene Speichertypen Anforderungen an virtuellen Speicher Größer als physikalischer Speicher Mehr Prozesse gleichzeitig aktiv als Hauptspeicher erlaubt o Zugriffschutz auf Prozessspeicherbereich Zugriff nicht langsamer als Hauptspeicher Transparente Erweiterung (unsichtbar für Nutzer) 12/13/2010 UNIX Mechanismen 40 Stack und Heap 0xFFFF … Endadresse Text segment Progammcode Stack pointer Data segment: Konstanten grows down grows up Stack segment: Speicher für Variablen in Funktionen Stack Overflow Heap segment: Dynamisch zugewiesener Speicher Heap Overflow Memory Leak 12/13/2010 Stack UNIX Mechanismen Adressraum Heap Data Program Counter Text 0x0000 … Startadresse 41 Stack 1. Vor dem Funktionsaufruf: 2. Stack pointer Während dem Funktionsaufruf: Argumente werden auf den Stack gepusht Argu‐ mente Stack pointer 12/13/2010 UNIX Mechanismen 3. Stack pointer Nach dem Funktionsaufruf: Ergebnis (return Wert) gespeichert Ergebnis 42 Verwaltung des Hauptspeicher Liste von mem_map_t (aka ‚page‘) Einträgen Anzahl der Referenzen auf Seitenrahmen Alter des Seitenrahmens (letzter Zugriff) Nummer des physikalischen Eintrags Info: Page‐Größe bei x86 Systemen beträgt 4 KB free_area Struktur Doppelt verkettete Liste von freien Einträgen Bitmap von Blockallokationsstatus 12/13/2010 UNIX Mechanismen 43 Verwaltung des Hauptspeichers (2) Buddy Verfahren: Seitenrahmen der Größe 2n 12/13/2010 UNIX Mechanismen 44 Buddy Verfahren Der Speicher wird in Bereiche der Länge 2n aufgeteilt. Zu Beginn gibt es nur einen Block, der möglichst den gesamten Speicher abdeckt Fordert nun ein Prozess eine bestimmte Menge Speicher an, so wird zur nächsthöheren Zweierpotenz aufgerundet und ein entsprechender Block gesucht. Falls es noch keinen Block dieser Größe gibt, wird nach einem Block doppelter Größe gesucht, der dann in zwei Hälften (bzw. Buddies) aufgeteilt wird, und einer dieser Blöcke wird dem Prozess zugewiesen. 12/13/2010 UNIX Mechanismen 45 Erzeugen eines Prozesses Aufruf von fork • Anlegen des Swap Space für Kindprozess • Neuer task_struct Tabelleneintrag • Anlegen der Seitentabellen • Duplizieren des gesamten (!) Adressraums Effizienter: nur Seitentabellen kopieren Fill‐on‐Demand Seiten Copy‐on‐Write nur bei Schreibzugriff Seiten kopieren 12/13/2010 UNIX Mechanismen 46 ENDE Danke für die Aufmerksamkeit! 12/13/2010 UNIX Mechanismen 47