Übung Betriebssysteme - Übung 1 - Parallele und verteilte Systeme

Werbung
> Übung Betriebssysteme
Übung 1
Aaron Scherzinger
Wintersemester 2012/13
Gruppe Parallele und Verteilte Systeme (PVS)
Institut für Informatik
Westfälische Wilhelms-Universität Münster
Organisatorisches
• Koordinator:
Michel Steuwer
Raum 705, Tel.: 83-32744
[email protected]
• Sprechstunde: nach Vereinbarung
• Informationen zur Vorlesung und Übung, Aufgabenblätter:
• Im Web: http://pvs.uni-muenster.de/pvs/lehre/WS12/bs
• Über Mailingliste [email protected]
• Anmeldung zur Mailingliste über
http://listserv.uni-muenster.de/mailman/listinfo/pvs-bs
• Übungstermin:
• Mittwochs 12.00 Uhr–14.00 Uhr, Hörsaal M4
• Auf den Folien steht viel aber nicht alles – Teilnahme an einer Übung
ist Voraussetzung zum Verständnis der Folien
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
2
Prüfungsleistungen
• 90-minütige benotete Klausur
• Termin: 28.01.2013, 12–14 Uhr, M1
• Studiengänge:
• 1-Fach-Bachelor Informatik
• Diplom Informatik, Wirtschaftsinformatik, Geoinformatik,
Mathematik (Nebenfach Informatik)
• Lehramt Sek II (und Sek I) Informatik
• LA Gymn./Ges. Informatik
• Abtestat (unbenotet)
• Bearbeitung der Übungsblätter (mind. 50% der Punkte)
• Modul Systemstrukturen für 2-Fach-Bachelor Informatik
• Modul Systemstrukturen besteht aus den Veranstaltungen
Rechnerstrukturen und Betriebssysteme
• 4-stündige benotete Modulabschlussklausur (voraussichtlich am Ende
des Wintersemesters)
• Zur Zulassung zur Modulabschlussklausur muss entweder die Klausur
zu Rechnerstrukturen oder die Klausur zu Betriebssysteme (am 30. 01)
bestanden werden
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
3
Übungsblätter
• Im Netz werden Übungsblätter zur selbständigen Bearbeitung
bereitgestellt
• Übungsblätter sollen praktische Kenntnisse vermitteln
• Intensive Beschäftigung mit den Übungsblättern ist Voraussetzung
zum Verständnis der Übung
• Übungsblätter werden korrigiert!
• Insbesondere: Inhalt der Übung ist klausurrelevant!
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
4
Übungsblätter
• Prüfungsleistung:
• Schein, CP: Klausur
• Abtestat, unbenotet (GI): 50% der Übungspunkte oder Bestehen der
Klausur
• Jede mündliche Prüfung setzt das Bestehen der Klausur voraus!
• Bonuspunkte:
• Durch die erfolgreiche Bearbeitung der Übungen können bis zu 10% der
Klausurpunkte erworben werden.
• Bei weniger als 50% der möglichen Punkte für die Übungsaufgaben
werden keine Bonuspunkte vergeben.
• Ab 50% (1 Bonuspunkt) wird für weitere 5% der Übungspunkte je ein
Bonuspunkt vergeben.
• Bonuspunkte werden erst nach regulärem Bestehen der Klausur
angerechnet!
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
5
Übungsblätter
• Voraussichtlich sieben Übungsblätter
• Bearbeitung
• In Gruppen von 3–4 Teilnehmern (nicht weniger!)
• Vorherige Anmeldung ist nicht nötig
• Zum Gründen von Gruppen kann die Mailingliste der Vorlesung genutzt
werden!
• Abgabe
• Hinweise auf den Aufgabenblättern beachten!!!
• Abgabe per E-Mail ([email protected])
• Namen und Matrikelnummern aller Teilnehmer angeben
• Termin i. d. R. Dienstag vor der Übung (genauer Termin auf dem
jeweiligem Blatt)
• Zur Bearbeitung der Übungsblätter ist eine gültige Nutzerkennung für
die Mathematik/Informatik CIP-Pools hilfreich!
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
6
Ziel der Übungen
• Ziel der Übung ist . . .
• die Vertiefung der in der Vorlesung vorgestellten Konzepte
• die praktische Anwendung aus Sicht des (System-)Programmierers
• Inhalte der Übungsblätter:
• ca. 50 % Textaufgaben
• ca. 50 % Programmieraufgaben
• Für Programmieraufgaben werden die Programmiersprache C und
Unix/Linux verwendet
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
7
Unix und C
Warum Unix?
• Betriebssystem 6→ Windows
• Es gibt einige Hundert BS die tatsächlich verwendet werden oder
wurden und mehrere Tausend (Forschungs-)Projekte
• Übersicht z. B.
http://en.wikipedia.org/wiki/List_of_operating_systems
• Unix Varianten (FreeBSD, OpenBSD, NetBSD, Linux, . . . ) für jede
gängige Hardware-Architektur kostenlos erhältlich
• Kostenlose Compiler, Editoren, Debugger, IDEs, . . .
• Im Source-Code verfügbar =⇒ Ideale Spielwiese ;-)
• Konzeptionell basieren alle gängigen Betriebssysteme auf Unix
• Man kann relativ einfach beobachten, was unter der Haube“ passiert
”
• Umfangreiche Literatur über Betriebssysteminterna
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
8
Unix und C
Warum C?
• Relativ alte Sprache (erste Versionen ab 1971) aber immer noch eine
der wichtigsten überhaupt – die meisten Anwendungen werden in C
oder C++ entwickelt
• Sehr maschinennahe Sprache, deshalb gut für Systemprogrammierung
geeignet
• So gut wie alle gängigen Betriebssysteme sind in C/C++ geschrieben
• Systemnahe Programmierung i. d. R. ebenfalls nur in C
• C wurde für die Betriebssystemprogrammierung erdacht (für Unix)
Wer sich mit Betriebssystemen beschäftigt, kommt um C nicht
herum!
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
9
C in der Übung
• In den ersten Übungen wird eine kurze Einführung in C geben
• Vorausgesetzte Vorkenntnisse: Java
• In der Übung kann nur eine fundamentale Einführung gegeben werden.
Eigenständige Übungen und Selbststudium sind notwendig!
• Standardwerk zu C:
Brian W. Kernighan, Dennis M. Ritchie
Programmieren in C
2. Ausgabe, Hanser Verlag, 1990
ISBN: 3-446-15492-3
• Weiter Links zu C und Linux/Unix auf den Webseiten unter
http://pvs.uni-muenster.de/pvs/lehre/c-doc.html
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
10
Wiederholung von Grundlagen
Betriebssystem als . . .
• Virtuelle Maschine (Top-Down Sicht)
• Bietet abstrakte, einfache Sicht auf die Hardware
• Versteckt reale, low-level Eigenschaften
• Ressourcenmanager (Bottom-Up Sicht)
• Verwaltet Speicher, Platten, Terminals, . . .
• Koordiniert Zugriffe
• Fazit: Betriebssysteme müssen low-level Eigenschaften der Hardware
berücksichtigen um diese steuern zu können; BS-Entwickler benötigen
detaillierte Kenntnis der Hardware
• Im Folgenden werden kurz einige Grundlagen rekapituliert:
• Binärzahlen
• Prozessor und Speicher
• Compiler
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
11
Binärzahlen
• Digitalrechner arbeiten mit Binärzahlen, deshalb hier eine kurze
Wiederholung
• Beispiel:
(123)10 = (1 · 102 + 2 · 101 + 3 · 100 )10 =
(1 · 26 + 1 · 25 + 1 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 1 · 20 )10 = (1111011)2
• Umwandlung durch Division mit Rest (umgekehrtes Hornerschema)
• Kompaktere Darstellung durch Oktal- und Hexadezimalzahlen.
• Oktal: drei Binärziffern ergeben eine Oktalziffer (23 = 8)
(001 100 101 011 111 110)2 = (145376)8
• Hexadezimal: vier Binärziffern ergeben eine Hexadezimalziffer
(24 = 16)
(1100 1010 1111 1110)2 = (CAFE)16
• Zwei Hexadezimalziffern ergeben ein Byte.
• Wegen der einfachen Umwandlung werden Binärziffern in Programmen
i. d. R. Oktal oder Hexadezimal angegeben.
Oft durch 0 für Oktal bzw. 0x für Hexadezimal gekennzeichnet, also
0145376 bzw. 0xCAFE
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
12
Binärzahlen – wichtige
Eigenschaften
• Umrechnung zwischen 2er und 10er Potenzen:
• 210 = 1024 ≈ 1K (eigentlich 1 Ki (kibi) statt 1 K (kilo))
• 220 ≈ 1M
• 230 ≈ 1G
• 2n·10 ≈ 10n·3
• Vorsicht: 230 − 109 = 73.741.824
• Multiplikation/Division:
• 210 · 2 = 211
• 210 · 210 = 220
• 2m · 2n = 2m+n
• 2m /2n = 2m−n
• Binärziffern:
• Mit m Binärziffern können 2m verschiedene Zahlen dargestellt werden
• Mit m + n Binärziffern 2m+n verschiedene Zahlen
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
13
Binärzahlen: Verknüpfungen
• Logische Operationen:
0 1
∨ (ODER) 0 1
¬ (NEG) 0
0 0 0
0 0 1
0 1
1 0 1
1 1 1
1 0
• Werden bei modernen Rechnern i. d. R. nur als Operationen auf
Maschinenworten (8, 16, 32 oder 64 Bit) angeboten, z. B.:
01101010 11010010
01101010 11010010
∧ 11111111 00000000
∨ 11111111 00000000
01101010 00000000
11111111 11010010
• Manipulation einzelner Bits:
∧
(UND)
• Setzen von Bit i in Wort x: x := x ∨ 2i
• Löschen von Bit i in Wort x: x := x ∧ ¬2i
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
14
Prozessor und Speicher
• Grobstruktur eines einfachen Rechners:
• Prozessor:
Prozessor
• Rechenwerk (Arithmetic-LogicIR
Unit, ALU)
• Befehlsregister (Instruction Regi- AKKU
ster, IR)
ALU
• Befehlszähler (Instruction Pointer, IP)
• Stapelzeiger (Stack Pointer, SP)
I/O Gerät
Hauptspeicher
SP
0
Bus
IP
...
Befehle
Befehle
1
2
...
Befehle
Befehle
...
...
Daten
• Hauptspeicher:
Fortlaufend adressiert, enthält
Befehle und Daten
I/O Reg
n
I/O Reg
n+1
Daten
Daten
Daten
...
...
n−2
n−1
• I/O-Geräte:
Über I/O-Register gesteuert, werden über spezielle Speicheradressen
angesprochen
• Was sind Register?
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
15
Programmausführung
1
Laden des nächsten Befehls von der im Befehlszähler angegebenen
Speicherstelle in das Befehlsregister
2
Erhöhen des Befehlszählers um eins (bzw. die Größe des geladenen
Befehls)
Dekodieren des Befehls
3
5
Ggf. Laden weiterer Operanden aus dem Speicher
Berechnung des Ergebnisses
6
Speicherung des Ergebnisses (z. B. in einem Register (Akku))
4
• Sprungbefehle: Manipulation des Befehlszählers (Laden der Zieladresse)
• Wichtig: Befehle und Daten liegen in einem fortlaufend und
zusammenhängend adressierten Speicher
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
16
Stack (Stapel, Keller)
• LIFO Puffer, das zuletzt abgelegte Element (push Befehl) muss auch
als erstes wieder gelesen werden (pop Befehl)
• Extrem wichtiges, gleichzeitig einfach zu realisierendes Konzept, wird
i. d. R. durch HW als Maschinenbefehle bereitgestellt:
• push Befehl:
1 Schreiben des Parameters an die Speicherstelle SP
2 Erhöhen von SP um 1
• pop Befehl:
1 Verringern von SP um 1
2 Lesen des Wertes von Speicherstelle SP
• Wichtige Verwendungsmöglichkeit: Speichern von temporären Daten,
insb. Sprungadressen und lokalen Variablen bei Funktionen
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
17
Compiler
• Hochsprachen sind sehr abstrakt und dadurch einfach zu gebrauchen.
• Werden durch Compiler in Maschinensprache übersetzt (oder von
einem anderen Programm interpretiert – hier nicht weiter betrachtet)
• Für HW-nahe Programmierung (von BS) ist ein grobes Verständnis
des Zusammenhangs mit dem Maschinencode wichtig
• Wie werden die folgenden Konzepte im Maschinencode realisiert:
• Variablen
• Datentypen
• Funktionen/Prozeduren
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
18
Variablen
• Inhalt von Variablen liegt im Speicher
• Während der Übersetzung verwaltet der Compiler intern eine Tabelle
mit den Speicheradressen der Variablen
• Im ausführbaren Maschinenprogramm gibt es keine Variablen mehr!
Beispiel
int a = 0;
int b = 1;
int result;
result = a+b;
movl
$0, −4(%ebp)
movl
$1, −8(%ebp)
movl
−8(%ebp), %eax
/∗ b laden ∗/
addl
−4(%ebp), %eax
movl
%eax, −12(%ebp)
($ – Konstanten,
/∗ a ∗/
/∗ b ∗/
/∗ a+b ∗/
/∗ result ∗/
% – Register, %ebp – Basisadresse, x(%y) – Adresse %y+x)
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
19
Datentypen: Programmiersprache
In Programmiersprachen sind meist Daten (Variablen) typisiert
• Variablen dürfen nur Werte ihres Typs zugewiesen werden,
z. B. int – ganzzahlige Werte
• Anweisungen/Befehle ergeben sich aus Datentypen,
z. B. + ist Addition für int und Konkatenation für String in Java
• Konvertierung: Um Daten verschiedenen Typs zu kombinieren müssen
diese umgewandelt werden (casts), implizit (z. B. int nach float) oder
explizit
• Korrektheit: Korrekte Typisierung wird vom Compiler/Laufzeitsystem
überwacht, z. B. keine Division /“ für String
”
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
20
Datentypen: Maschinensprache
In Maschinensprache sind meist Befehle typisiert (wenn überhaupt)
• Beispiel Intel IA-32 (i386) Multiplikation:
mul
– unsigned int,
imul
– signed int,
fmul
– floating point
• Daten im Speicher sind untypisierte Bitfolgen,
man kann z. B. mul auf einen String anwenden
• Konvertierung: Maschinenbefehle um von einer Darstellung in eine
andere umzuwandeln (float/integer) müssen explizit im Programm
stehen
• Korrektheit: Keinerlei Überprüfung auf korrekte Typisierung!
⇒ Auch Datentypen sind im Maschinenprogramm nicht mehr (so wie in
einer Hochsprache) vorhanden
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
21
Funktionsaufruf
• Funktionsaufrufe sind abstrakte Konstrukte (der Prozessor kennt keine
Funktionen!)
Hauptspeicher
• Funktion liegt als Maschinencode im Speicher
• Funktionsaufruf: Sprung an Anfangsadresse der
Funktion
funktion1
main
• Funktionsende: Rücksprung zur Stelle des Aufrufs
funktion3
• Dazu muss die Rücksprungadresse beim Aufruf
funktion2
gespeichert werden
• Rücksprungadressen werden auf einem Stapel abgelegt
• Funktionen müssen in der umgekehrten Reihenfolge ihres Aufrufs
beendet werden
=⇒ Die zuletzt abgelegte Adresse wird als erstes benötigt
• Entspricht LIFO-Eigenschaft des Stapels
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
22
Funktionsaufruf: Beispiel
10816
Hauptspeicher
10000
...
10815
funktion3()
...
10816
11756
11757
...
24711
funktion1()
...
25042
Stapel
Befehlszähler
...
20000
25043
funktion2()
...
31732
...
...
funktion3()
24712
...
return
31732
11757
main
24712
...
funktion2()
10816
24712
...
return
41809
funktion3
funktion2()
...
41809
24712
...
10000
funktion2()
...
20000
24712
funktion1
funktion1()
25043
...
24712
...
11757
return
...
funktion2
24712
Übung Betriebssysteme
WS 2012/13
41809
Aaron Scherzinger
25043
return
23
Funktionsaufruf: Parameter und
Variablen
• Funktionsaufruf: Außer der Sicherung der Rücksprungadresse muss
folgendes beachtet werden:
• Übergabe von Parametern
• Sichern von Registerinhalten die innerhalb der Funktion überschrieben
werden
• Speicher für lokale Variablen reservieren
• Funktionsende:
• Freigeben lokaler Variablen
• Registerinhalte wiederherstellen
• Rückgabe des Ergebnisses
• Auch hier dient der Stapel zum Ablegen aller Daten
• Details sind Hardware- und Compiler-abhängig
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
24
Beispiel: C-Funktionsaufruf bei
GCC/i386
foo:
/∗ Vorspann ∗/
pushl
%ebp
movl
%esp, %ebp
subl
$4, %esp
movl
$0, −4(%ebp)
/∗ Rumpf ∗/
movl
12(%ebp), %eax
addl
8(%ebp), %eax
movl
%eax, −4(%ebp)
/∗ Nachspann ∗/
movl
−4(%ebp), %eax
leave
ret
int foo(int a, int b) {
int c = 0;
c = a + b;
return c;
}
int main(int argc,
char ∗∗argv) {
int x;
x = foo(1, 2);
return 0;
}
/∗ Aufruf
pushl
pushl
call
in main ∗/
$2
$1
foo
Nicht Klausurrelevant ;-)
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
25
C-Programmierung unter
Linux/Unix – Überblick
Editor
program.c
program.h
Compiler
program.o
otherprog.o
Linker
program
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
26
Editor
• VIM: www.vim.org
• Aufruf mit vim <dateiname>
• Tutorial: :help
• XEmacs: www.xemacs.org
• Aufruf mit xemacs <dateiname>
• Tutorial: M-? t
• Speichern: C-x s
• Verlassen: C-x c
• Beide Editoren sind auf den meisten Unix-Systemen verfügbar und
äußerst leistungsfähig – das Lesen der Dokumentation lohnt sich!
• NEdit: www.nedit.org
• Einfachere Bedienung
• Windows ähnlich
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
27
Compiler – Details
• Die Übersetzung eines C-Programms findet in mehreren Schritten statt
1
2
3
Präprozessor: Textuelle Ersetzung von Präprozessoranweisungen
Compiler: Übersetzung in Maschinencode.
Ergebnisdatei program.o enthält nur Maschinencode von Funktionen
aus program.c. Funktionsaufrufe anderer Funktionen sind speziell
gekennzeichnet.
Linker: Verbindet mehrere .o-Dateien und Bibliotheksdateien zu einem
ausführbaren Programm. Fügt fehlende Funktionen aus .o-Dateien und
Bibliotheken, sowie Code zur Ausführung der Funktion main ein.
• In der Regel werden alle drei Schritte auf einmal erledigt ohne
Mitwirkung durch den Benutzer
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
28
GNU C Compiler (gcc)
• Aufruf: gcc <datei.c>
Zusätzlich können noch Optionen angegeben werden:
• -Wall: Viele Warnungen ausgeben (z. B. bei if(a=b) warnen)
• -o <datei>: Name der zu erzeugenden Datei (sonst: a.out)
• Aufruf für die Übungsaufgaben:
gcc -Wall -Werror -pedantic-errors
-o prog prog.c
• Aufruf von gcc bewirkt übersetzen und linken
Verhindern des linkens: -c
gcc -Wall -Werror -pedantic-errors -c
-o prog.o prog.c
• Weitere Optionen:
• -E nur Präprozessor
• -g Einbinden von Debug-Informationen
• -O, -O1, -O2, -O3 Optimierungsstufe
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
29
Man-Pages
• Unix Hilfe Seiten
• Anzeige mit man <befehl/funktion/schluesselwort>
z. B. man gcc
• Man-Pages sind in Abschnitte (Sections) untergliedert.
• Abschnitt 1: Benutzerbefehle
• Abschnitt 2: Systemaufrufe
• Abschnitt 3: Bibliotheksfunktionen
• Angabe des Abschnitts: man <abschnitt> <befehl>
•
•
•
•
z. B. man 3 printf
auf Solaris: man -s <abschnitt> <befehl>
Innerhalb von Man-Pages werden andere Seiten oft in der Form
befehl(abschnitt) angegeben, z. B. fork(2)
Nach Hilfeseiten suchen: man -k <Schlüsselwort>
man man
Alternativ www.linuxmanpages.com
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
30
Make
• Automatisierte Erzeugung von Programmen aus Quelldateien
• Berücksichtigt Abhängigkeiten zwischen Dateien
stackTest.c
compile
link
stackTest.o
stack.h
stackTest
stack.o
stack.c
• Steuerung der Übersetzung durch Regeln in Datei Makefile
# Ziel: Quellen
# <tab> Befehle
stackTest: stackTest.o stack.o
gcc stackTest.o stack.o −o stackTest
stackTest.o: stackTest.c stack.h
gcc −o stackTest.o −c −Wall stackTest.c
stack.o: stack.c stack.h
gcc −o stack.o −c −Wall stack.c
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
31
Make: Implizite Regeln
• Neben expliziten Regeln enthält make implizite Standardregeln, z. B.
Regel zur Erzeugung von datei.o aus datei.c
• Standardregeln sind über Variablen konfigurierbar
Für C-Programme:
• CC: Compiler
• CFLAGS: Kommandozeilenparameter für Compiler
• Anwendung impliziter Regeln wenn Befehle weggelassen werden
CC=gcc
CFLAGS=−Wall −Werror −pedantic−errors −std=c99
stackTest: stackTest.o stack.o
stack.o: stack.c stack.h
stackTest.o: stack.h stackTest.c
• Aufruf mit gmake oder gmake Ziel
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
32
GNU Debugger: gdb, ddd
• Aufruf: gdb <programm>
• Vorgehensweise für den Fehler zwischendurch:
• run <Kommandozeilenparameter> startet das Programm
• kill bricht das Programm ab
• break <funktion> setzt breakpoint“ (Ausführung wird bei Beginn
”
von funktion unterbrochen)
• print <ausdruck> gibt Wert von <ausdruck> (beliebige
Programmvariablen, Zeiger, . . . ) aus
• cont führt Ausführung fort
• Bei Absturz: bt ( backtrace“) gibt an, an welcher Stelle das Programm
”
abgestürzt ist
• Graphische Oberfläche für gdb: ddd (Data Display Debugger)
ddd <programm>
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
33
Zusammenfassung
• Wichtig für Programmieraufgaben:
• Bei Programmieraufgaben wird ein Makefile zur Verfügung gestellt
• Programme müssen mit diesem Makefile auf einem Rechner des IVV5
(z.B. Räuber) übersetzbar sein
• Alternative zu Linux: Cygwin und MinGW
• ABER: Kein Support durch Tutoren!
• Weitere Alternative: Programm an Heim-PC schreiben und via SSH
auf einem Linux-Rechner übersetzen
• Genaueres zu Makefiles, Debugger in der ersten Globalübung
Übung Betriebssysteme
WS 2012/13
Aaron Scherzinger
34
Herunterladen